ETH Price: $3,273.24 (+0.82%)
Gas: 1 Gwei

Token

Gala Genesis (GG)
 

Overview

Max Total Supply

60 GG

Holders

45

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
kindofspanish.eth
Balance
1 GG
0x1011f36acbce03ff11b4c75340c4c1e646998477
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:
GalaGenesis

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// OpenZeppelin Contracts v4.4.0 (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;
    }
}

// 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
    // slots contents, replace the bits taken up by the boolean, and then write
    // back. This is the compilers 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
    // transactions 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;
    }
}

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

pragma solidity ^0.8.0;

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.6;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.7;

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

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

        uint count;
        for( uint i; i < _owners.length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        return count;
    }

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

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

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.7;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

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

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

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

        uint count;
        for(uint i; i < _owners.length; i++){
            if(owner == _owners[i]){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}

// OpenZeppelin Contracts v4.4.0 (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);
    }
}

// OpenZeppelin Contracts v4.4.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.
 */
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 Merklee 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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}


pragma solidity ^0.8.11;
pragma abicoder v2;

contract GalaGenesis is ERC721Enumerable, Ownable, ReentrancyGuard {
  using SafeMath    for uint256;
  using MerkleProof for bytes32[];

  bytes32 public whitelistMerkleRoot;
  bool public preSaleIsActive = false;
  bool public saleIsActive = false;
  uint256 public tokenPrice = 100000000000000000;
  
  uint public constant MAX_TOKEN_PER_TXN = 2;
  
  uint256 public constant MAX_TOKENS = 60;
  
  address public proxyRegistryAddress;
  mapping(address => uint256) private allowance;
  string public baseURI;
    
  constructor() ERC721("Gala Genesis", "GG") {
    setBaseURI("https://blam.io/api/gala-genesis/lm/");
    proxyRegistryAddress = address(0xa5409ec958C83C3f309868babACA7c86DCB077c1);
  }

  function updateTokenPrice(uint256 newPrice) public onlyOwner {
    require(!saleIsActive, "Sale must be inactive to change token price");
    tokenPrice = newPrice;
  }

  function withdraw() public onlyOwner {
    uint256 balance = address(this).balance;
    require(balance > 0);

    address owner = payable(_msgSender());
    address payoutAddress1 = payable(0xAc01B61D659bD72b120DB7c5289BBFc020771943);
    uint256 payoutPayment1 = balance.mul(2).div(100);
    address payoutAddress2 = payable(0x8fc1F1F48cBB2e4A0f1dfeB9e6019606b307C3c4);
    uint256 payoutPayment2 = balance.mul(5).div(100);
    address payoutAddress3 = payable(0xc79EFD6C254D28BcFe8701C8c40736a7ce16e4Cb);
    uint256 payoutPayment3 = balance.mul(92).div(100);
    
    (bool success1, ) = payoutAddress1.call{value: payoutPayment1}("");
    require(success1, "Failed to send.");
    
    (bool success2, ) = payoutAddress2.call{value: payoutPayment2}("");
    require(success2, "Failed to send.");
    
    (bool success3, ) = payoutAddress3.call{value: payoutPayment3}("");
    require(success3, "Failed to send.");
    

    (bool ownerSuccess, ) = owner.call{value: address(this).balance}("");
    require(ownerSuccess, "Failed to send to Owner.");
  }
  
  function setBaseURI(string memory _baseURI) public onlyOwner {
    baseURI = _baseURI;
  }

  function flipSaleState() public onlyOwner {
    saleIsActive = !saleIsActive;
  }
  
  function flipPreSaleState() public onlyOwner {
    preSaleIsActive = !preSaleIsActive;
  }
  
  function whitelistMint(uint256 numberOfTokens, uint256 allowed, bytes32[] memory proof) public payable {
    require(preSaleIsActive, "Pre-sale not started or has ended");
    require(
      _verify(_leaf(_msgSender(), allowed), proof),
      "Your address is not whitelisted"
    );
    require(allowance[_msgSender()] + numberOfTokens <= allowed, "Exceeds wallet allowance");
    require(msg.value == tokenPrice.mul(numberOfTokens), "Ether sent is not correct");

    _safeMint(_msgSender(), totalSupply());
    allowance[_msgSender()] += numberOfTokens;
  }
  
  function mintToken(uint numberOfTokens) public payable {
    require(saleIsActive, "Sale must be active to mint");
    require(numberOfTokens < MAX_TOKEN_PER_TXN, "The max mint per transaction is 2");
    require(totalSupply().add(numberOfTokens) < MAX_TOKENS, "Purchase would exceed max supply");
    require(msg.value == tokenPrice.mul(numberOfTokens), "Ether value sent is not correct");
    
    _safeMint(_msgSender(), totalSupply());
  }
  
  function _leaf(address account, uint256 count) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked(account, count));
  }

  function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) {
    return MerkleProof.verify(proof, whitelistMerkleRoot, leaf);
  }

  function setRoot(bytes32 root) external onlyOwner {
    whitelistMerkleRoot = root;
  }
  
  function setProxyRegistryAddress(address _proxyRegistryAddress) external onlyOwner {
    proxyRegistryAddress = _proxyRegistryAddress;
  }

  function tokenURI(uint256 _tokenId) external view returns (string memory) {
    require(_exists(_tokenId), "Token does not exist.");
    return string(abi.encodePacked(baseURI, Strings.toString(_tokenId)));
  }

  function isApprovedForAll(address _owner, address operator) public view override returns (bool) {
    OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress);
    if (address(proxyRegistry.proxies(_owner)) == operator) return true;

    return super.isApprovedForAll(_owner, operator);
  }

  function airdrop(address to, uint256[] calldata tokenIds) external onlyOwner {
    for (uint i = 0; i < tokenIds.length; i++) {
      _safeMint(to, tokenIds[i]);
    }
  }
}

contract OwnableDelegateProxy {}
contract OpenSeaProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_PER_TXN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updateTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"allowed","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526008805461ffff1916905567016345785d8a00006009553480156200002857600080fd5b50604080518082018252600c81526b47616c612047656e6573697360a01b602080830191825283518085019094526002845261474760f01b9084015281519192916200007791600091620001d0565b5080516200008d906001906020840190620001d0565b505050620000aa620000a46200010260201b60201c565b62000106565b6001600681905550620000d660405180606001604052806024815260200162002b396024913962000158565b600a80546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c1179055620002b3565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001cc90600c906020840190620001d0565b5050565b828054620001de9062000276565b90600052602060002090601f0160209004810192826200020257600085556200024d565b82601f106200021d57805160ff19168380011785556200024d565b828001600101855582156200024d579182015b828111156200024d57825182559160200191906001019062000230565b506200025b9291506200025f565b5090565b5b808211156200025b576000815560010162000260565b600181811c908216806200028b57607f821691505b60208210811415620002ad57634e487b7160e01b600052602260045260246000fd5b50919050565b61287680620002c36000396000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063c634d032116100ab578063e985e9c51161006f578063e985e9c5146105d7578063eb8d2444146105f7578063f032554914610616578063f2fde38b1461062b578063f47c84c51461064b57600080fd5b8063c634d03214610544578063c87b56dd14610557578063cd7c032614610577578063d26ea6c014610597578063dab5f340146105b757600080fd5b806395d89b41116100f257806395d89b41146104c6578063a22cb465146104db578063aa98e0c6146104fb578063b88d4fde14610511578063c4be5b591461053157600080fd5b8063715018a61461045d5780637ff9b5961461047257806385bc4d83146104885780638da5cb5b146104a857600080fd5b80633ccfd60b116101a6578063634da63a11610175578063634da63a146103d35780636352211e146103e8578063676c0d77146104085780636c0360eb1461042857806370a082311461043d57600080fd5b80633ccfd60b1461035e57806342842e0e146103735780634f6ccce71461039357806355f804b3146103b357600080fd5b806318160ddd116101ed57806318160ddd146102d05780631f0234d8146102ef57806323b872dd146103095780632f745c591461032957806334918dfd1461034957600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612055565b610660565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061026961068b565b60405161024b91906120ca565b34801561028257600080fd5b506102966102913660046120dd565b61071d565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c936600461210b565b6107aa565b005b3480156102dc57600080fd5b506002545b60405190815260200161024b565b3480156102fb57600080fd5b5060085461023f9060ff1681565b34801561031557600080fd5b506102ce610324366004612137565b6108c0565b34801561033557600080fd5b506102e161034436600461210b565b6108f1565b34801561035557600080fd5b506102ce6109a4565b34801561036a57600080fd5b506102ce6109eb565b34801561037f57600080fd5b506102ce61038e366004612137565b610cac565b34801561039f57600080fd5b506102e16103ae3660046120dd565b610cc7565b3480156103bf57600080fd5b506102ce6103ce366004612217565b610d34565b3480156103df57600080fd5b506102e1600281565b3480156103f457600080fd5b506102966104033660046120dd565b610d75565b34801561041457600080fd5b506102ce6104233660046120dd565b610e01565b34801561043457600080fd5b50610269610e9c565b34801561044957600080fd5b506102e1610458366004612260565b610f2a565b34801561046957600080fd5b506102ce610ff8565b34801561047e57600080fd5b506102e160095481565b34801561049457600080fd5b506102ce6104a336600461227d565b61102e565b3480156104b457600080fd5b506005546001600160a01b0316610296565b3480156104d257600080fd5b5061026961109d565b3480156104e757600080fd5b506102ce6104f6366004612305565b6110ac565b34801561050757600080fd5b506102e160075481565b34801561051d57600080fd5b506102ce61052c366004612343565b611171565b6102ce61053f3660046123c3565b6111a3565b6102ce6105523660046120dd565b611390565b34801561056357600080fd5b506102696105723660046120dd565b61150a565b34801561058357600080fd5b50600a54610296906001600160a01b031681565b3480156105a357600080fd5b506102ce6105b2366004612260565b61158b565b3480156105c357600080fd5b506102ce6105d23660046120dd565b6115d7565b3480156105e357600080fd5b5061023f6105f236600461247e565b611606565b34801561060357600080fd5b5060085461023f90610100900460ff1681565b34801561062257600080fd5b506102ce6116c7565b34801561063757600080fd5b506102ce610646366004612260565b611705565b34801561065757600080fd5b506102e1603c81565b60006001600160e01b0319821663780e9d6360e01b148061068557506106858261179d565b92915050565b60606000805461069a906124ac565b80601f01602080910402602001604051908101604052809291908181526020018280546106c6906124ac565b80156107135780601f106106e857610100808354040283529160200191610713565b820191906000526020600020905b8154815290600101906020018083116106f657829003601f168201915b5050505050905090565b6000610728826117ed565b61078e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006107b582610d75565b9050806001600160a01b0316836001600160a01b031614156108235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610785565b336001600160a01b038216148061083f575061083f8133611606565b6108b15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610785565b6108bb8383611837565b505050565b6108ca33826118a5565b6108e65760405162461bcd60e51b8152600401610785906124e7565b6108bb838383611967565b60006108fc83610f2a565b821061091a5760405162461bcd60e51b815260040161078590612538565b6000805b60025481101561098b576002818154811061093b5761093b612583565b6000918252602090912001546001600160a01b0386811691161415610979578382141561096b5791506106859050565b81610975816125af565b9250505b80610983816125af565b91505061091e565b5060405162461bcd60e51b815260040161078590612538565b6005546001600160a01b031633146109ce5760405162461bcd60e51b8152600401610785906125ca565b6008805461ff001981166101009182900460ff1615909102179055565b6005546001600160a01b03163314610a155760405162461bcd60e51b8152600401610785906125ca565b4780610a2057600080fd5b3373ac01b61d659bd72b120db7c5289bbfc0207719436000610a4e6064610a48866002611abd565b90611ad0565b9050738fc1f1f48cbb2e4a0f1dfeb9e6019606b307c3c46000610a776064610a48886005611abd565b905073c79efd6c254d28bcfe8701c8c40736a7ce16e4cb6000610aa06064610a488a605c611abd565b90506000866001600160a01b03168660405160006040518083038185875af1925050503d8060008114610aef576040519150601f19603f3d011682016040523d82523d6000602084013e610af4565b606091505b5050905080610b155760405162461bcd60e51b8152600401610785906125ff565b6000856001600160a01b03168560405160006040518083038185875af1925050503d8060008114610b62576040519150601f19603f3d011682016040523d82523d6000602084013e610b67565b606091505b5050905080610b885760405162461bcd60e51b8152600401610785906125ff565b6000846001600160a01b03168460405160006040518083038185875af1925050503d8060008114610bd5576040519150601f19603f3d011682016040523d82523d6000602084013e610bda565b606091505b5050905080610bfb5760405162461bcd60e51b8152600401610785906125ff565b60008a6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610c48576040519150601f19603f3d011682016040523d82523d6000602084013e610c4d565b606091505b5050905080610c9e5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e00000000000000006044820152606401610785565b505050505050505050505050565b6108bb83838360405180602001604052806000815250611171565b6002546000908210610d305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610785565b5090565b6005546001600160a01b03163314610d5e5760405162461bcd60e51b8152600401610785906125ca565b8051610d7190600c906020840190611faf565b5050565b60008060028381548110610d8b57610d8b612583565b6000918252602090912001546001600160a01b03169050806106855760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610785565b6005546001600160a01b03163314610e2b5760405162461bcd60e51b8152600401610785906125ca565b600854610100900460ff1615610e975760405162461bcd60e51b815260206004820152602b60248201527f53616c65206d75737420626520696e61637469766520746f206368616e67652060448201526a746f6b656e20707269636560a81b6064820152608401610785565b600955565b600c8054610ea9906124ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed5906124ac565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b505050505081565b60006001600160a01b038216610f955760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610785565b6000805b600254811015610ff15760028181548110610fb657610fb6612583565b6000918252602090912001546001600160a01b0385811691161415610fe157610fde826125af565b91505b610fea816125af565b9050610f99565b5092915050565b6005546001600160a01b031633146110225760405162461bcd60e51b8152600401610785906125ca565b61102c6000611adc565b565b6005546001600160a01b031633146110585760405162461bcd60e51b8152600401610785906125ca565b60005b81811015611097576110858484848481811061107957611079612583565b90506020020135611b2e565b8061108f816125af565b91505061105b565b50505050565b60606001805461069a906124ac565b6001600160a01b0382163314156111055760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610785565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61117b33836118a5565b6111975760405162461bcd60e51b8152600401610785906124e7565b61109784848484611b48565b60085460ff166111ff5760405162461bcd60e51b815260206004820152602160248201527f5072652d73616c65206e6f742073746172746564206f722068617320656e64656044820152601960fa1b6064820152608401610785565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152603480830186905283518084039091018152605490920190925280519101206112489082611b7b565b6112945760405162461bcd60e51b815260206004820152601f60248201527f596f75722061646472657373206973206e6f742077686974656c6973746564006044820152606401610785565b336000908152600b602052604090205482906112b1908590612628565b11156112ff5760405162461bcd60e51b815260206004820152601860248201527f457863656564732077616c6c657420616c6c6f77616e636500000000000000006044820152606401610785565b60095461130c9084611abd565b341461135a5760405162461bcd60e51b815260206004820152601960248201527f45746865722073656e74206973206e6f7420636f7272656374000000000000006044820152606401610785565b611367335b600254611b2e565b336000908152600b602052604081208054859290611386908490612628565b9091555050505050565b600854610100900460ff166113e75760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e7400000000006044820152606401610785565b600281106114415760405162461bcd60e51b815260206004820152602160248201527f546865206d6178206d696e7420706572207472616e73616374696f6e206973206044820152601960f91b6064820152608401610785565b603c6114568261145060025490565b90611b8a565b106114a35760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610785565b6009546114b09082611abd565b34146114fe5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610785565b6115073361135f565b50565b6060611515826117ed565b6115595760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b6044820152606401610785565b600c61156483611b96565b60405160200161157592919061265c565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146115b55760405162461bcd60e51b8152600401610785906125ca565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116015760405162461bcd60e51b8152600401610785906125ca565b600755565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167c9190612703565b6001600160a01b03161415611695576001915050610685565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b031633146116f15760405162461bcd60e51b8152600401610785906125ca565b6008805460ff19811660ff90911615179055565b6005546001600160a01b0316331461172f5760405162461bcd60e51b8152600401610785906125ca565b6001600160a01b0381166117945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610785565b61150781611adc565b60006001600160e01b031982166380ac58cd60e01b14806117ce57506001600160e01b03198216635b5e139f60e01b145b8061068557506301ffc9a760e01b6001600160e01b0319831614610685565b60025460009082108015610685575060006001600160a01b03166002838154811061181a5761181a612583565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061186c82610d75565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118b0826117ed565b6119115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610785565b600061191c83610d75565b9050806001600160a01b0316846001600160a01b031614806119575750836001600160a01b031661194c8461071d565b6001600160a01b0316145b806116bf57506116bf8185611606565b826001600160a01b031661197a82610d75565b6001600160a01b0316146119e25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610785565b6001600160a01b038216611a445760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610785565b611a4f600082611837565b8160028281548110611a6357611a63612583565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000611ac98284612720565b9392505050565b6000611ac98284612755565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610d71828260405180602001604052806000815250611c94565b611b53848484611967565b611b5f84848484611cc7565b6110975760405162461bcd60e51b815260040161078590612769565b6000611ac98260075485611dc5565b6000611ac98284612628565b606081611bba5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611be45780611bce816125af565b9150611bdd9050600a83612755565b9150611bbe565b60008167ffffffffffffffff811115611bff57611bff612178565b6040519080825280601f01601f191660200182016040528015611c29576020820181803683370190505b5090505b84156116bf57611c3e6001836127bb565b9150611c4b600a866127d2565b611c56906030612628565b60f81b818381518110611c6b57611c6b612583565b60200101906001600160f81b031916908160001a905350611c8d600a86612755565b9450611c2d565b611c9e8383611ddb565b611cab6000848484611cc7565b6108bb5760405162461bcd60e51b815260040161078590612769565b60006001600160a01b0384163b15611dba57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d0b9033908990889088906004016127e6565b6020604051808303816000875af1925050508015611d46575060408051601f3d908101601f19168201909252611d4391810190612823565b60015b611da0573d808015611d74576040519150601f19603f3d011682016040523d82523d6000602084013e611d79565b606091505b508051611d985760405162461bcd60e51b815260040161078590612769565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116bf565b506001949350505050565b600082611dd28584611f03565b14949350505050565b6001600160a01b038216611e315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610785565b611e3a816117ed565b15611e875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610785565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611fa7576000858281518110611f2557611f25612583565b60200260200101519050808311611f67576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611f94565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611f9f816125af565b915050611f08565b509392505050565b828054611fbb906124ac565b90600052602060002090601f016020900481019282611fdd5760008555612023565b82601f10611ff657805160ff1916838001178555612023565b82800160010185558215612023579182015b82811115612023578251825591602001919060010190612008565b50610d309291505b80821115610d30576000815560010161202b565b6001600160e01b03198116811461150757600080fd5b60006020828403121561206757600080fd5b8135611ac98161203f565b60005b8381101561208d578181015183820152602001612075565b838111156110975750506000910152565b600081518084526120b6816020860160208601612072565b601f01601f19169290920160200192915050565b602081526000611ac9602083018461209e565b6000602082840312156120ef57600080fd5b5035919050565b6001600160a01b038116811461150757600080fd5b6000806040838503121561211e57600080fd5b8235612129816120f6565b946020939093013593505050565b60008060006060848603121561214c57600080fd5b8335612157816120f6565b92506020840135612167816120f6565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121b7576121b7612178565b604052919050565b600067ffffffffffffffff8311156121d9576121d9612178565b6121ec601f8401601f191660200161218e565b905082815283838301111561220057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561222957600080fd5b813567ffffffffffffffff81111561224057600080fd5b8201601f8101841361225157600080fd5b6116bf848235602084016121bf565b60006020828403121561227257600080fd5b8135611ac9816120f6565b60008060006040848603121561229257600080fd5b833561229d816120f6565b9250602084013567ffffffffffffffff808211156122ba57600080fd5b818601915086601f8301126122ce57600080fd5b8135818111156122dd57600080fd5b8760208260051b85010111156122f257600080fd5b6020830194508093505050509250925092565b6000806040838503121561231857600080fd5b8235612323816120f6565b91506020830135801515811461233857600080fd5b809150509250929050565b6000806000806080858703121561235957600080fd5b8435612364816120f6565b93506020850135612374816120f6565b925060408501359150606085013567ffffffffffffffff81111561239757600080fd5b8501601f810187136123a857600080fd5b6123b7878235602084016121bf565b91505092959194509250565b6000806000606084860312156123d857600080fd5b833592506020808501359250604085013567ffffffffffffffff808211156123ff57600080fd5b818701915087601f83011261241357600080fd5b81358181111561242557612425612178565b8060051b915061243684830161218e565b818152918301840191848101908a84111561245057600080fd5b938501935b8385101561246e57843582529385019390850190612455565b8096505050505050509250925092565b6000806040838503121561249157600080fd5b823561249c816120f6565b91506020830135612338816120f6565b600181811c908216806124c057607f821691505b602082108114156124e157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156125c3576125c3612599565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600f908201526e2330b4b632b2103a379039b2b7321760891b604082015260600190565b6000821982111561263b5761263b612599565b500190565b60008151612652818560208601612072565b9290920192915050565b600080845481600182811c91508083168061267857607f831692505b602080841082141561269857634e487b7160e01b86526022600452602486fd5b8180156126ac57600181146126bd576126ea565b60ff198616895284890196506126ea565b60008b81526020902060005b868110156126e25781548b8201529085019083016126c9565b505084890196505b5050505050506126fa8185612640565b95945050505050565b60006020828403121561271557600080fd5b8151611ac9816120f6565b600081600019048311821515161561273a5761273a612599565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826127645761276461273f565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000828210156127cd576127cd612599565b500390565b6000826127e1576127e161273f565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128199083018461209e565b9695505050505050565b60006020828403121561283557600080fd5b8151611ac98161203f56fea26469706673582212201df2bdaac9e3ed1d6ca9d149357c349f6d6feef35b94121c2ff32f8d4963fd8764736f6c634300080b003368747470733a2f2f626c616d2e696f2f6170692f67616c612d67656e657369732f6c6d2f

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063715018a611610123578063c634d032116100ab578063e985e9c51161006f578063e985e9c5146105d7578063eb8d2444146105f7578063f032554914610616578063f2fde38b1461062b578063f47c84c51461064b57600080fd5b8063c634d03214610544578063c87b56dd14610557578063cd7c032614610577578063d26ea6c014610597578063dab5f340146105b757600080fd5b806395d89b41116100f257806395d89b41146104c6578063a22cb465146104db578063aa98e0c6146104fb578063b88d4fde14610511578063c4be5b591461053157600080fd5b8063715018a61461045d5780637ff9b5961461047257806385bc4d83146104885780638da5cb5b146104a857600080fd5b80633ccfd60b116101a6578063634da63a11610175578063634da63a146103d35780636352211e146103e8578063676c0d77146104085780636c0360eb1461042857806370a082311461043d57600080fd5b80633ccfd60b1461035e57806342842e0e146103735780634f6ccce71461039357806355f804b3146103b357600080fd5b806318160ddd116101ed57806318160ddd146102d05780631f0234d8146102ef57806323b872dd146103095780632f745c591461032957806334918dfd1461034957600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612055565b610660565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061026961068b565b60405161024b91906120ca565b34801561028257600080fd5b506102966102913660046120dd565b61071d565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c936600461210b565b6107aa565b005b3480156102dc57600080fd5b506002545b60405190815260200161024b565b3480156102fb57600080fd5b5060085461023f9060ff1681565b34801561031557600080fd5b506102ce610324366004612137565b6108c0565b34801561033557600080fd5b506102e161034436600461210b565b6108f1565b34801561035557600080fd5b506102ce6109a4565b34801561036a57600080fd5b506102ce6109eb565b34801561037f57600080fd5b506102ce61038e366004612137565b610cac565b34801561039f57600080fd5b506102e16103ae3660046120dd565b610cc7565b3480156103bf57600080fd5b506102ce6103ce366004612217565b610d34565b3480156103df57600080fd5b506102e1600281565b3480156103f457600080fd5b506102966104033660046120dd565b610d75565b34801561041457600080fd5b506102ce6104233660046120dd565b610e01565b34801561043457600080fd5b50610269610e9c565b34801561044957600080fd5b506102e1610458366004612260565b610f2a565b34801561046957600080fd5b506102ce610ff8565b34801561047e57600080fd5b506102e160095481565b34801561049457600080fd5b506102ce6104a336600461227d565b61102e565b3480156104b457600080fd5b506005546001600160a01b0316610296565b3480156104d257600080fd5b5061026961109d565b3480156104e757600080fd5b506102ce6104f6366004612305565b6110ac565b34801561050757600080fd5b506102e160075481565b34801561051d57600080fd5b506102ce61052c366004612343565b611171565b6102ce61053f3660046123c3565b6111a3565b6102ce6105523660046120dd565b611390565b34801561056357600080fd5b506102696105723660046120dd565b61150a565b34801561058357600080fd5b50600a54610296906001600160a01b031681565b3480156105a357600080fd5b506102ce6105b2366004612260565b61158b565b3480156105c357600080fd5b506102ce6105d23660046120dd565b6115d7565b3480156105e357600080fd5b5061023f6105f236600461247e565b611606565b34801561060357600080fd5b5060085461023f90610100900460ff1681565b34801561062257600080fd5b506102ce6116c7565b34801561063757600080fd5b506102ce610646366004612260565b611705565b34801561065757600080fd5b506102e1603c81565b60006001600160e01b0319821663780e9d6360e01b148061068557506106858261179d565b92915050565b60606000805461069a906124ac565b80601f01602080910402602001604051908101604052809291908181526020018280546106c6906124ac565b80156107135780601f106106e857610100808354040283529160200191610713565b820191906000526020600020905b8154815290600101906020018083116106f657829003601f168201915b5050505050905090565b6000610728826117ed565b61078e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006107b582610d75565b9050806001600160a01b0316836001600160a01b031614156108235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610785565b336001600160a01b038216148061083f575061083f8133611606565b6108b15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610785565b6108bb8383611837565b505050565b6108ca33826118a5565b6108e65760405162461bcd60e51b8152600401610785906124e7565b6108bb838383611967565b60006108fc83610f2a565b821061091a5760405162461bcd60e51b815260040161078590612538565b6000805b60025481101561098b576002818154811061093b5761093b612583565b6000918252602090912001546001600160a01b0386811691161415610979578382141561096b5791506106859050565b81610975816125af565b9250505b80610983816125af565b91505061091e565b5060405162461bcd60e51b815260040161078590612538565b6005546001600160a01b031633146109ce5760405162461bcd60e51b8152600401610785906125ca565b6008805461ff001981166101009182900460ff1615909102179055565b6005546001600160a01b03163314610a155760405162461bcd60e51b8152600401610785906125ca565b4780610a2057600080fd5b3373ac01b61d659bd72b120db7c5289bbfc0207719436000610a4e6064610a48866002611abd565b90611ad0565b9050738fc1f1f48cbb2e4a0f1dfeb9e6019606b307c3c46000610a776064610a48886005611abd565b905073c79efd6c254d28bcfe8701c8c40736a7ce16e4cb6000610aa06064610a488a605c611abd565b90506000866001600160a01b03168660405160006040518083038185875af1925050503d8060008114610aef576040519150601f19603f3d011682016040523d82523d6000602084013e610af4565b606091505b5050905080610b155760405162461bcd60e51b8152600401610785906125ff565b6000856001600160a01b03168560405160006040518083038185875af1925050503d8060008114610b62576040519150601f19603f3d011682016040523d82523d6000602084013e610b67565b606091505b5050905080610b885760405162461bcd60e51b8152600401610785906125ff565b6000846001600160a01b03168460405160006040518083038185875af1925050503d8060008114610bd5576040519150601f19603f3d011682016040523d82523d6000602084013e610bda565b606091505b5050905080610bfb5760405162461bcd60e51b8152600401610785906125ff565b60008a6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610c48576040519150601f19603f3d011682016040523d82523d6000602084013e610c4d565b606091505b5050905080610c9e5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e00000000000000006044820152606401610785565b505050505050505050505050565b6108bb83838360405180602001604052806000815250611171565b6002546000908210610d305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610785565b5090565b6005546001600160a01b03163314610d5e5760405162461bcd60e51b8152600401610785906125ca565b8051610d7190600c906020840190611faf565b5050565b60008060028381548110610d8b57610d8b612583565b6000918252602090912001546001600160a01b03169050806106855760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610785565b6005546001600160a01b03163314610e2b5760405162461bcd60e51b8152600401610785906125ca565b600854610100900460ff1615610e975760405162461bcd60e51b815260206004820152602b60248201527f53616c65206d75737420626520696e61637469766520746f206368616e67652060448201526a746f6b656e20707269636560a81b6064820152608401610785565b600955565b600c8054610ea9906124ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed5906124ac565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b505050505081565b60006001600160a01b038216610f955760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610785565b6000805b600254811015610ff15760028181548110610fb657610fb6612583565b6000918252602090912001546001600160a01b0385811691161415610fe157610fde826125af565b91505b610fea816125af565b9050610f99565b5092915050565b6005546001600160a01b031633146110225760405162461bcd60e51b8152600401610785906125ca565b61102c6000611adc565b565b6005546001600160a01b031633146110585760405162461bcd60e51b8152600401610785906125ca565b60005b81811015611097576110858484848481811061107957611079612583565b90506020020135611b2e565b8061108f816125af565b91505061105b565b50505050565b60606001805461069a906124ac565b6001600160a01b0382163314156111055760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610785565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61117b33836118a5565b6111975760405162461bcd60e51b8152600401610785906124e7565b61109784848484611b48565b60085460ff166111ff5760405162461bcd60e51b815260206004820152602160248201527f5072652d73616c65206e6f742073746172746564206f722068617320656e64656044820152601960fa1b6064820152608401610785565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152603480830186905283518084039091018152605490920190925280519101206112489082611b7b565b6112945760405162461bcd60e51b815260206004820152601f60248201527f596f75722061646472657373206973206e6f742077686974656c6973746564006044820152606401610785565b336000908152600b602052604090205482906112b1908590612628565b11156112ff5760405162461bcd60e51b815260206004820152601860248201527f457863656564732077616c6c657420616c6c6f77616e636500000000000000006044820152606401610785565b60095461130c9084611abd565b341461135a5760405162461bcd60e51b815260206004820152601960248201527f45746865722073656e74206973206e6f7420636f7272656374000000000000006044820152606401610785565b611367335b600254611b2e565b336000908152600b602052604081208054859290611386908490612628565b9091555050505050565b600854610100900460ff166113e75760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e7400000000006044820152606401610785565b600281106114415760405162461bcd60e51b815260206004820152602160248201527f546865206d6178206d696e7420706572207472616e73616374696f6e206973206044820152601960f91b6064820152608401610785565b603c6114568261145060025490565b90611b8a565b106114a35760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610785565b6009546114b09082611abd565b34146114fe5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610785565b6115073361135f565b50565b6060611515826117ed565b6115595760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b6044820152606401610785565b600c61156483611b96565b60405160200161157592919061265c565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146115b55760405162461bcd60e51b8152600401610785906125ca565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116015760405162461bcd60e51b8152600401610785906125ca565b600755565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167c9190612703565b6001600160a01b03161415611695576001915050610685565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b031633146116f15760405162461bcd60e51b8152600401610785906125ca565b6008805460ff19811660ff90911615179055565b6005546001600160a01b0316331461172f5760405162461bcd60e51b8152600401610785906125ca565b6001600160a01b0381166117945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610785565b61150781611adc565b60006001600160e01b031982166380ac58cd60e01b14806117ce57506001600160e01b03198216635b5e139f60e01b145b8061068557506301ffc9a760e01b6001600160e01b0319831614610685565b60025460009082108015610685575060006001600160a01b03166002838154811061181a5761181a612583565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061186c82610d75565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118b0826117ed565b6119115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610785565b600061191c83610d75565b9050806001600160a01b0316846001600160a01b031614806119575750836001600160a01b031661194c8461071d565b6001600160a01b0316145b806116bf57506116bf8185611606565b826001600160a01b031661197a82610d75565b6001600160a01b0316146119e25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610785565b6001600160a01b038216611a445760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610785565b611a4f600082611837565b8160028281548110611a6357611a63612583565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000611ac98284612720565b9392505050565b6000611ac98284612755565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610d71828260405180602001604052806000815250611c94565b611b53848484611967565b611b5f84848484611cc7565b6110975760405162461bcd60e51b815260040161078590612769565b6000611ac98260075485611dc5565b6000611ac98284612628565b606081611bba5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611be45780611bce816125af565b9150611bdd9050600a83612755565b9150611bbe565b60008167ffffffffffffffff811115611bff57611bff612178565b6040519080825280601f01601f191660200182016040528015611c29576020820181803683370190505b5090505b84156116bf57611c3e6001836127bb565b9150611c4b600a866127d2565b611c56906030612628565b60f81b818381518110611c6b57611c6b612583565b60200101906001600160f81b031916908160001a905350611c8d600a86612755565b9450611c2d565b611c9e8383611ddb565b611cab6000848484611cc7565b6108bb5760405162461bcd60e51b815260040161078590612769565b60006001600160a01b0384163b15611dba57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d0b9033908990889088906004016127e6565b6020604051808303816000875af1925050508015611d46575060408051601f3d908101601f19168201909252611d4391810190612823565b60015b611da0573d808015611d74576040519150601f19603f3d011682016040523d82523d6000602084013e611d79565b606091505b508051611d985760405162461bcd60e51b815260040161078590612769565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116bf565b506001949350505050565b600082611dd28584611f03565b14949350505050565b6001600160a01b038216611e315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610785565b611e3a816117ed565b15611e875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610785565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611fa7576000858281518110611f2557611f25612583565b60200260200101519050808311611f67576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611f94565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611f9f816125af565b915050611f08565b509392505050565b828054611fbb906124ac565b90600052602060002090601f016020900481019282611fdd5760008555612023565b82601f10611ff657805160ff1916838001178555612023565b82800160010185558215612023579182015b82811115612023578251825591602001919060010190612008565b50610d309291505b80821115610d30576000815560010161202b565b6001600160e01b03198116811461150757600080fd5b60006020828403121561206757600080fd5b8135611ac98161203f565b60005b8381101561208d578181015183820152602001612075565b838111156110975750506000910152565b600081518084526120b6816020860160208601612072565b601f01601f19169290920160200192915050565b602081526000611ac9602083018461209e565b6000602082840312156120ef57600080fd5b5035919050565b6001600160a01b038116811461150757600080fd5b6000806040838503121561211e57600080fd5b8235612129816120f6565b946020939093013593505050565b60008060006060848603121561214c57600080fd5b8335612157816120f6565b92506020840135612167816120f6565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121b7576121b7612178565b604052919050565b600067ffffffffffffffff8311156121d9576121d9612178565b6121ec601f8401601f191660200161218e565b905082815283838301111561220057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561222957600080fd5b813567ffffffffffffffff81111561224057600080fd5b8201601f8101841361225157600080fd5b6116bf848235602084016121bf565b60006020828403121561227257600080fd5b8135611ac9816120f6565b60008060006040848603121561229257600080fd5b833561229d816120f6565b9250602084013567ffffffffffffffff808211156122ba57600080fd5b818601915086601f8301126122ce57600080fd5b8135818111156122dd57600080fd5b8760208260051b85010111156122f257600080fd5b6020830194508093505050509250925092565b6000806040838503121561231857600080fd5b8235612323816120f6565b91506020830135801515811461233857600080fd5b809150509250929050565b6000806000806080858703121561235957600080fd5b8435612364816120f6565b93506020850135612374816120f6565b925060408501359150606085013567ffffffffffffffff81111561239757600080fd5b8501601f810187136123a857600080fd5b6123b7878235602084016121bf565b91505092959194509250565b6000806000606084860312156123d857600080fd5b833592506020808501359250604085013567ffffffffffffffff808211156123ff57600080fd5b818701915087601f83011261241357600080fd5b81358181111561242557612425612178565b8060051b915061243684830161218e565b818152918301840191848101908a84111561245057600080fd5b938501935b8385101561246e57843582529385019390850190612455565b8096505050505050509250925092565b6000806040838503121561249157600080fd5b823561249c816120f6565b91506020830135612338816120f6565b600181811c908216806124c057607f821691505b602082108114156124e157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156125c3576125c3612599565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600f908201526e2330b4b632b2103a379039b2b7321760891b604082015260600190565b6000821982111561263b5761263b612599565b500190565b60008151612652818560208601612072565b9290920192915050565b600080845481600182811c91508083168061267857607f831692505b602080841082141561269857634e487b7160e01b86526022600452602486fd5b8180156126ac57600181146126bd576126ea565b60ff198616895284890196506126ea565b60008b81526020902060005b868110156126e25781548b8201529085019083016126c9565b505084890196505b5050505050506126fa8185612640565b95945050505050565b60006020828403121561271557600080fd5b8151611ac9816120f6565b600081600019048311821515161561273a5761273a612599565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826127645761276461273f565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000828210156127cd576127cd612599565b500390565b6000826127e1576127e161273f565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128199083018461209e565b9695505050505050565b60006020828403121561283557600080fd5b8151611ac98161203f56fea26469706673582212201df2bdaac9e3ed1d6ca9d149357c349f6d6feef35b94121c2ff32f8d4963fd8764736f6c634300080b0033

Deployed Bytecode Sourcemap

41398:4596:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35508:224;;;;;;;;;;-1:-1:-1;35508:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35508:224:0;;;;;;;;24127:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24939:308::-;;;;;;;;;;-1:-1:-1;24939:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;24939:308:0;1550:203:1;24462:411:0;;;;;;;;;;-1:-1:-1;24462:411:0;;;;;:::i;:::-;;:::i;:::-;;35808:110;;;;;;;;;;-1:-1:-1;35896:7:0;:14;35808:110;;;2360:25:1;;;2348:2;2333:18;35808:110:0;2214:177:1;41581:35:0;;;;;;;;;;-1:-1:-1;41581:35:0;;;;;;;;25998:376;;;;;;;;;;-1:-1:-1;25998:376:0;;;;;:::i;:::-;;:::i;36284:490::-;;;;;;;;;;-1:-1:-1;36284:490:0;;;;;:::i;:::-;;:::i;43492:83::-;;;;;;;;;;;;;:::i;42304:1082::-;;;;;;;;;;;;;:::i;26445:185::-;;;;;;;;;;-1:-1:-1;26445:185:0;;;;;:::i;:::-;;:::i;35995:205::-;;;;;;;;;;-1:-1:-1;35995:205:0;;;;;:::i;:::-;;:::i;43394:92::-;;;;;;;;;;-1:-1:-1;43394:92:0;;;;;:::i;:::-;;:::i;41713:42::-;;;;;;;;;;;;41754:1;41713:42;;23734:326;;;;;;;;;;-1:-1:-1;23734:326:0;;;;;:::i;:::-;;:::i;42127:171::-;;;;;;;;;;-1:-1:-1;42127:171:0;;;;;:::i;:::-;;:::i;41902:21::-;;;;;;;;;;;;;:::i;23280:392::-;;;;;;;;;;-1:-1:-1;23280:392:0;;;;;:::i;:::-;;:::i;38435:103::-;;;;;;;;;;;;;:::i;41658:46::-;;;;;;;;;;;;;;;;45816:175;;;;;;;;;;-1:-1:-1;45816:175:0;;;;;:::i;:::-;;:::i;37784:87::-;;;;;;;;;;-1:-1:-1;37857:6:0;;-1:-1:-1;;;;;37857:6:0;37784:87;;24296:104;;;;;;;;;;;;;:::i;25319:327::-;;;;;;;;;;-1:-1:-1;25319:327:0;;;;;:::i;:::-;;:::i;41542:34::-;;;;;;;;;;;;;;;;26701:365;;;;;;;;;;-1:-1:-1;26701:365:0;;;;;:::i;:::-;;:::i;43683:571::-;;;;;;:::i;:::-;;:::i;44262:450::-;;;;;;:::i;:::-;;:::i;45273:213::-;;;;;;;;;;-1:-1:-1;45273:213:0;;;;;:::i;:::-;;:::i;41812:35::-;;;;;;;;;;-1:-1:-1;41812:35:0;;;;-1:-1:-1;;;;;41812:35:0;;;45127:140;;;;;;;;;;-1:-1:-1;45127:140:0;;;;;:::i;:::-;;:::i;45030:89::-;;;;;;;;;;-1:-1:-1;45030:89:0;;;;;:::i;:::-;;:::i;45492:318::-;;;;;;;;;;-1:-1:-1;45492:318:0;;;;;:::i;:::-;;:::i;41621:32::-;;;;;;;;;;-1:-1:-1;41621:32:0;;;;;;;;;;;43583:92;;;;;;;;;;;;;:::i;38693:201::-;;;;;;;;;;-1:-1:-1;38693:201:0;;;;;:::i;:::-;;:::i;41764:39::-;;;;;;;;;;;;41801:2;41764:39;;35508:224;35610:4;-1:-1:-1;;;;;;35634:50:0;;-1:-1:-1;;;35634:50:0;;:90;;;35688:36;35712:11;35688:23;:36::i;:::-;35627:97;35508:224;-1:-1:-1;;35508:224:0:o;24127:100::-;24181:13;24214:5;24207:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24127:100;:::o;24939:308::-;25060:7;25107:16;25115:7;25107;:16::i;:::-;25085:110;;;;-1:-1:-1;;;25085:110:0;;8799:2:1;25085:110:0;;;8781:21:1;8838:2;8818:18;;;8811:30;8877:34;8857:18;;;8850:62;-1:-1:-1;;;8928:18:1;;;8921:42;8980:19;;25085:110:0;;;;;;;;;-1:-1:-1;25215:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25215:24:0;;24939:308::o;24462:411::-;24543:13;24559:23;24574:7;24559:14;:23::i;:::-;24543:39;;24607:5;-1:-1:-1;;;;;24601:11:0;:2;-1:-1:-1;;;;;24601:11:0;;;24593:57;;;;-1:-1:-1;;;24593:57:0;;9212:2:1;24593:57:0;;;9194:21:1;9251:2;9231:18;;;9224:30;9290:34;9270:18;;;9263:62;-1:-1:-1;;;9341:18:1;;;9334:31;9382:19;;24593:57:0;9010:397:1;24593:57:0;738:10;-1:-1:-1;;;;;24685:21:0;;;;:62;;-1:-1:-1;24710:37:0;24727:5;738:10;45492:318;:::i;24710:37::-;24663:168;;;;-1:-1:-1;;;24663:168:0;;9614:2:1;24663:168:0;;;9596:21:1;9653:2;9633:18;;;9626:30;9692:34;9672:18;;;9665:62;9763:26;9743:18;;;9736:54;9807:19;;24663:168:0;9412:420:1;24663:168:0;24844:21;24853:2;24857:7;24844:8;:21::i;:::-;24532:341;24462:411;;:::o;25998:376::-;26207:41;738:10;26240:7;26207:18;:41::i;:::-;26185:140;;;;-1:-1:-1;;;26185:140:0;;;;;;;:::i;:::-;26338:28;26348:4;26354:2;26358:7;26338:9;:28::i;36284:490::-;36381:15;36425:16;36435:5;36425:9;:16::i;:::-;36417:5;:24;36409:80;;;;-1:-1:-1;;;36409:80:0;;;;;;;:::i;:::-;36502:10;36527:6;36523:178;36539:7;:14;36535:18;;36523:178;;;36586:7;36594:1;36586:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36577:19:0;;;36586:10;;36577:19;36574:116;;;36628:5;36619;:14;36616:58;;;36642:1;-1:-1:-1;36635:8:0;;-1:-1:-1;36635:8:0;36616:58;36667:7;;;;:::i;:::-;;;;36616:58;36555:3;;;;:::i;:::-;;;;36523:178;;;;36713:53;;-1:-1:-1;;;36713:53:0;;;;;;;:::i;43492:83::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;43557:12:::1;::::0;;-1:-1:-1;;43541:28:0;::::1;43557:12;::::0;;;::::1;;;43556:13;43541:28:::0;;::::1;;::::0;;43492:83::o;42304:1082::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;42366:21:::1;42402:11:::0;42394:20:::1;;;::::0;::::1;;738:10:::0;42500:42:::1;42423:13;42575:23;42594:3;42575:14;:7:::0;42587:1:::1;42575:11;:14::i;:::-;:18:::0;::::1;:23::i;:::-;42550:48:::0;-1:-1:-1;42638:42:0::1;42605:22;42713:23;42732:3;42713:14;:7:::0;42725:1:::1;42713:11;:14::i;:23::-;42688:48:::0;-1:-1:-1;42776:42:0::1;42743:22;42851:24;42871:3;42851:15;:7:::0;42863:2:::1;42851:11;:15::i;:24::-;42826:49;;42889:13;42908:14;-1:-1:-1::0;;;;;42908:19:0::1;42935:14;42908:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42888:66;;;42969:8;42961:36;;;;-1:-1:-1::0;;;42961:36:0::1;;;;;;;:::i;:::-;43011:13;43030:14;-1:-1:-1::0;;;;;43030:19:0::1;43057:14;43030:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43010:66;;;43091:8;43083:36;;;;-1:-1:-1::0;;;43083:36:0::1;;;;;;;:::i;:::-;43133:13;43152:14;-1:-1:-1::0;;;;;43152:19:0::1;43179:14;43152:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43132:66;;;43213:8;43205:36;;;;-1:-1:-1::0;;;43205:36:0::1;;;;;;;:::i;:::-;43257:17;43280:5;-1:-1:-1::0;;;;;43280:10:0::1;43298:21;43280:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43256:68;;;43339:12;43331:49;;;::::0;-1:-1:-1;;;43331:49:0;;12188:2:1;43331:49:0::1;::::0;::::1;12170:21:1::0;12227:2;12207:18;;;12200:30;12266:26;12246:18;;;12239:54;12310:18;;43331:49:0::1;11986:348:1::0;43331:49:0::1;42341:1045;;;;;;;;;;;;42304:1082::o:0;26445:185::-;26583:39;26600:4;26606:2;26610:7;26583:39;;;;;;;;;;;;:16;:39::i;35995:205::-;36106:7;:14;36070:7;;36098:22;;36090:79;;;;-1:-1:-1;;;36090:79:0;;12541:2:1;36090:79:0;;;12523:21:1;12580:2;12560:18;;;12553:30;12619:34;12599:18;;;12592:62;-1:-1:-1;;;12670:18:1;;;12663:42;12722:19;;36090:79:0;12339:408:1;36090:79:0;-1:-1:-1;36187:5:0;35995:205::o;43394:92::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;43462:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;43394:92:::0;:::o;23734:326::-;23851:7;23876:13;23892:7;23900;23892:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23892:16:0;;-1:-1:-1;23941:19:0;23919:110;;;;-1:-1:-1;;;23919:110:0;;12954:2:1;23919:110:0;;;12936:21:1;12993:2;12973:18;;;12966:30;13032:34;13012:18;;;13005:62;-1:-1:-1;;;13083:18:1;;;13076:39;13132:19;;23919:110:0;12752:405:1;42127:171:0;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;42204:12:::1;::::0;::::1;::::0;::::1;;;42203:13;42195:69;;;::::0;-1:-1:-1;;;42195:69:0;;13364:2:1;42195:69:0::1;::::0;::::1;13346:21:1::0;13403:2;13383:18;;;13376:30;13442:34;13422:18;;;13415:62;-1:-1:-1;;;13493:18:1;;;13486:41;13544:19;;42195:69:0::1;13162:407:1::0;42195:69:0::1;42271:10;:21:::0;42127:171::o;41902:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23280:392::-;23402:4;-1:-1:-1;;;;;23433:19:0;;23425:74;;;;-1:-1:-1;;;23425:74:0;;13776:2:1;23425:74:0;;;13758:21:1;13815:2;13795:18;;;13788:30;13854:34;13834:18;;;13827:62;-1:-1:-1;;;13905:18:1;;;13898:40;13955:19;;23425:74:0;13574:406:1;23425:74:0;23512:10;23538:6;23533:109;23550:7;:14;23546:18;;23533:109;;;23597:7;23605:1;23597:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23588:19:0;;;23597:10;;23588:19;23584:46;;;23623:7;;;:::i;:::-;;;23584:46;23566:3;;;:::i;:::-;;;23533:109;;;-1:-1:-1;23659:5:0;23280:392;-1:-1:-1;;23280:392:0:o;38435:103::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;38500:30:::1;38527:1;38500:18;:30::i;:::-;38435:103::o:0;45816:175::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;45905:6:::1;45900:86;45917:19:::0;;::::1;45900:86;;;45952:26;45962:2;45966:8;;45975:1;45966:11;;;;;;;:::i;:::-;;;;;;;45952:9;:26::i;:::-;45938:3:::0;::::1;::::0;::::1;:::i;:::-;;;;45900:86;;;;45816:175:::0;;;:::o;24296:104::-;24352:13;24385:7;24378:14;;;;;:::i;25319:327::-;-1:-1:-1;;;;;25454:24:0;;738:10;25454:24;;25446:62;;;;-1:-1:-1;;;25446:62:0;;14187:2:1;25446:62:0;;;14169:21:1;14226:2;14206:18;;;14199:30;14265:27;14245:18;;;14238:55;14310:18;;25446:62:0;13985:349:1;25446:62:0;738:10;25521:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25521:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25521:53:0;;;;;;;;;;25590:48;;540:41:1;;;25521:42:0;;738:10;25590:48;;513:18:1;25590:48:0;;;;;;;25319:327;;:::o;26701:365::-;26890:41;738:10;26923:7;26890:18;:41::i;:::-;26868:140;;;;-1:-1:-1;;;26868:140:0;;;;;;;:::i;:::-;27019:39;27033:4;27039:2;27043:7;27052:5;27019:13;:39::i;43683:571::-;43801:15;;;;43793:61;;;;-1:-1:-1;;;43793:61:0;;14541:2:1;43793:61:0;;;14523:21:1;14580:2;14560:18;;;14553:30;14619:34;14599:18;;;14592:62;-1:-1:-1;;;14670:18:1;;;14663:31;14711:19;;43793:61:0;14339:397:1;43793:61:0;44823:32;;;738:10;22211:2:1;22207:15;-1:-1:-1;;22203:53:1;44823:32:0;;;;22191:66:1;;;;22273:12;;;;22266:28;;;44823:32:0;;;;;;;;;;22310:12:1;;;;44823:32:0;;;44813:43;;;;;43877:44;;43915:5;43877:7;:44::i;:::-;43861:109;;;;-1:-1:-1;;;43861:109:0;;14943:2:1;43861:109:0;;;14925:21:1;14982:2;14962:18;;;14955:30;15021:33;15001:18;;;14994:61;15072:18;;43861:109:0;14741:355:1;43861:109:0;738:10;43985:23;;;;:9;:23;;;;;;44029:7;;43985:40;;44011:14;;43985:40;:::i;:::-;:51;;43977:88;;;;-1:-1:-1;;;43977:88:0;;15436:2:1;43977:88:0;;;15418:21:1;15475:2;15455:18;;;15448:30;15514:26;15494:18;;;15487:54;15558:18;;43977:88:0;15234:348:1;43977:88:0;44093:10;;:30;;44108:14;44093;:30::i;:::-;44080:9;:43;44072:81;;;;-1:-1:-1;;;44072:81:0;;15789:2:1;44072:81:0;;;15771:21:1;15828:2;15808:18;;;15801:30;15867:27;15847:18;;;15840:55;15912:18;;44072:81:0;15587:349:1;44072:81:0;44162:38;738:10;44172:12;35896:7;:14;44162:9;:38::i;:::-;738:10;44207:23;;;;:9;:23;;;;;:41;;44234:14;;44207:23;:41;;44234:14;;44207:41;:::i;:::-;;;;-1:-1:-1;;;;;43683:571:0:o;44262:450::-;44332:12;;;;;;;44324:52;;;;-1:-1:-1;;;44324:52:0;;16143:2:1;44324:52:0;;;16125:21:1;16182:2;16162:18;;;16155:30;16221:29;16201:18;;;16194:57;16268:18;;44324:52:0;15941:351:1;44324:52:0;41754:1;44391:14;:34;44383:80;;;;-1:-1:-1;;;44383:80:0;;16499:2:1;44383:80:0;;;16481:21:1;16538:2;16518:18;;;16511:30;16577:34;16557:18;;;16550:62;-1:-1:-1;;;16628:18:1;;;16621:31;16669:19;;44383:80:0;16297:397:1;44383:80:0;41801:2;44478:33;44496:14;44478:13;35896:7;:14;;35808:110;44478:13;:17;;:33::i;:::-;:46;44470:91;;;;-1:-1:-1;;;44470:91:0;;16901:2:1;44470:91:0;;;16883:21:1;;;16920:18;;;16913:30;16979:34;16959:18;;;16952:62;17031:18;;44470:91:0;16699:356:1;44470:91:0;44589:10;;:30;;44604:14;44589;:30::i;:::-;44576:9;:43;44568:87;;;;-1:-1:-1;;;44568:87:0;;17262:2:1;44568:87:0;;;17244:21:1;17301:2;17281:18;;;17274:30;17340:33;17320:18;;;17313:61;17391:18;;44568:87:0;17060:355:1;44568:87:0;44668:38;738:10;44678:12;658:98;44668:38;44262:450;:::o;45273:213::-;45332:13;45362:17;45370:8;45362:7;:17::i;:::-;45354:51;;;;-1:-1:-1;;;45354:51:0;;17622:2:1;45354:51:0;;;17604:21:1;17661:2;17641:18;;;17634:30;-1:-1:-1;;;17680:18:1;;;17673:51;17741:18;;45354:51:0;17420:345:1;45354:51:0;45443:7;45452:26;45469:8;45452:16;:26::i;:::-;45426:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45412:68;;45273:213;;;:::o;45127:140::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;45217:20:::1;:44:::0;;-1:-1:-1;;;;;;45217:44:0::1;-1:-1:-1::0;;;;;45217:44:0;;;::::1;::::0;;;::::1;::::0;;45127:140::o;45030:89::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;45087:19:::1;:26:::0;45030:89::o;45492:318::-;45653:20;;45693:29;;-1:-1:-1;;;45693:29:0;;-1:-1:-1;;;;;1714:32:1;;;45693:29:0;;;1696:51:1;45582:4:0;;45653:20;;;45685:50;;;;45653:20;;45693:21;;1669:18:1;;45693:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45685:50:0;;45681:67;;;45744:4;45737:11;;;;;45681:67;-1:-1:-1;;;;;25888:25:0;;;25859:4;25888:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;45764:40;45757:47;45492:318;-1:-1:-1;;;;45492:318:0:o;43583:92::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;43654:15:::1;::::0;;-1:-1:-1;;43635:34:0;::::1;43654:15;::::0;;::::1;43653:16;43635:34;::::0;;43583:92::o;38693:201::-;37857:6;;-1:-1:-1;;;;;37857:6:0;738:10;38004:23;37996:68;;;;-1:-1:-1;;;37996:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38782:22:0;::::1;38774:73;;;::::0;-1:-1:-1;;;38774:73:0;;19752:2:1;38774:73:0::1;::::0;::::1;19734:21:1::0;19791:2;19771:18;;;19764:30;19830:34;19810:18;;;19803:62;-1:-1:-1;;;19881:18:1;;;19874:36;19927:19;;38774:73:0::1;19550:402:1::0;38774:73:0::1;38858:28;38877:8;38858:18;:28::i;22861:355::-:0;23008:4;-1:-1:-1;;;;;;23050:40:0;;-1:-1:-1;;;23050:40:0;;:105;;-1:-1:-1;;;;;;;23107:48:0;;-1:-1:-1;;;23107:48:0;23050:105;:158;;;-1:-1:-1;;;;;;;;;;12782:40:0;;;23172:36;12673:157;28613:155;28712:7;:14;28678:4;;28702:24;;:58;;;;;28758:1;-1:-1:-1;;;;;28730:30:0;:7;28738;28730:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28730:16:0;:30;;28695:65;28613:155;-1:-1:-1;;28613:155:0:o;32638:174::-;32713:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32713:29:0;-1:-1:-1;;;;;32713:29:0;;;;;;;;:24;;32767:23;32713:24;32767:14;:23::i;:::-;-1:-1:-1;;;;;32758:46:0;;;;;;;;;;;32638:174;;:::o;28935:452::-;29064:4;29108:16;29116:7;29108;:16::i;:::-;29086:110;;;;-1:-1:-1;;;29086:110:0;;20159:2:1;29086:110:0;;;20141:21:1;20198:2;20178:18;;;20171:30;20237:34;20217:18;;;20210:62;-1:-1:-1;;;20288:18:1;;;20281:42;20340:19;;29086:110:0;19957:408:1;29086:110:0;29207:13;29223:23;29238:7;29223:14;:23::i;:::-;29207:39;;29276:5;-1:-1:-1;;;;;29265:16:0;:7;-1:-1:-1;;;;;29265:16:0;;:64;;;;29322:7;-1:-1:-1;;;;;29298:31:0;:20;29310:7;29298:11;:20::i;:::-;-1:-1:-1;;;;;29298:31:0;;29265:64;:113;;;;29346:32;29363:5;29370:7;29346:16;:32::i;31967:553::-;32140:4;-1:-1:-1;;;;;32113:31:0;:23;32128:7;32113:14;:23::i;:::-;-1:-1:-1;;;;;32113:31:0;;32091:122;;;;-1:-1:-1;;;32091:122:0;;20572:2:1;32091:122:0;;;20554:21:1;20611:2;20591:18;;;20584:30;20650:34;20630:18;;;20623:62;-1:-1:-1;;;20701:18:1;;;20694:39;20750:19;;32091:122:0;20370:405:1;32091:122:0;-1:-1:-1;;;;;32232:16:0;;32224:65;;;;-1:-1:-1;;;32224:65:0;;20982:2:1;32224:65:0;;;20964:21:1;21021:2;21001:18;;;20994:30;21060:34;21040:18;;;21033:62;-1:-1:-1;;;21111:18:1;;;21104:34;21155:19;;32224:65:0;20780:400:1;32224:65:0;32406:29;32423:1;32427:7;32406:8;:29::i;:::-;32465:2;32446:7;32454;32446:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;32446:21:0;-1:-1:-1;;;;;32446:21:0;;;;;;32485:27;;32504:7;;32485:27;;;;;;;;;;32446:16;32485:27;31967:553;;;:::o;16366:98::-;16424:7;16451:5;16455:1;16451;:5;:::i;:::-;16444:12;16366:98;-1:-1:-1;;;16366:98:0:o;16764:::-;16822:7;16849:5;16853:1;16849;:5;:::i;39054:191::-;39147:6;;;-1:-1:-1;;;;;39164:17:0;;;-1:-1:-1;;;;;;39164:17:0;;;;;;;39197:40;;39147:6;;;39164:17;39147:6;;39197:40;;39128:16;;39197:40;39117:128;39054:191;:::o;29729:110::-;29805:26;29815:2;29819:7;29805:26;;;;;;;;;;;;:9;:26::i;27948:352::-;28105:28;28115:4;28121:2;28125:7;28105:9;:28::i;:::-;28166:48;28189:4;28195:2;28199:7;28208:5;28166:22;:48::i;:::-;28144:148;;;;-1:-1:-1;;;28144:148:0;;;;;;;:::i;44868:156::-;44946:4;44966:52;44985:5;44992:19;;45013:4;44966:18;:52::i;15630:98::-;15688:7;15715:5;15719:1;15715;:5;:::i;20347:722::-;20403:13;20623:10;20619:53;;-1:-1:-1;;20650:10:0;;;;;;;;;;;;-1:-1:-1;;;20650:10:0;;;;;20347:722::o;20619:53::-;20697:5;20682:12;20738:78;20745:9;;20738:78;;20771:8;;;;:::i;:::-;;-1:-1:-1;20794:10:0;;-1:-1:-1;20802:2:0;20794:10;;:::i;:::-;;;20738:78;;;20826:19;20858:6;20848:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20848:17:0;;20826:39;;20876:154;20883:10;;20876:154;;20910:11;20920:1;20910:11;;:::i;:::-;;-1:-1:-1;20979:10:0;20987:2;20979:5;:10;:::i;:::-;20966:24;;:2;:24;:::i;:::-;20953:39;;20936:6;20943;20936:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20936:56:0;;;;;;;;-1:-1:-1;21007:11:0;21016:2;21007:11;;:::i;:::-;;;20876:154;;30066:321;30196:18;30202:2;30206:7;30196:5;:18::i;:::-;30247:54;30278:1;30282:2;30286:7;30295:5;30247:22;:54::i;:::-;30225:154;;;;-1:-1:-1;;;30225:154:0;;;;;;;:::i;33377:980::-;33532:4;-1:-1:-1;;;;;33553:13:0;;19967:20;20015:8;33549:801;;33606:175;;-1:-1:-1;;;33606:175:0;;-1:-1:-1;;;;;33606:36:0;;;;;:175;;738:10;;33700:4;;33727:7;;33757:5;;33606:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33606:175:0;;;;;;;;-1:-1:-1;;33606:175:0;;;;;;;;;;;;:::i;:::-;;;33585:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33964:13:0;;33960:320;;34007:108;;-1:-1:-1;;;34007:108:0;;;;;;;:::i;33960:320::-;34230:6;34224:13;34215:6;34211:2;34207:15;34200:38;33585:710;-1:-1:-1;;;;;;33845:51:0;-1:-1:-1;;;33845:51:0;;-1:-1:-1;33838:58:0;;33549:801;-1:-1:-1;34334:4:0;33377:980;;;;;;:::o;40087:190::-;40212:4;40265;40236:25;40249:5;40256:4;40236:12;:25::i;:::-;:33;;40087:190;-1:-1:-1;;;;40087:190:0:o;30723:346::-;-1:-1:-1;;;;;30803:16:0;;30795:61;;;;-1:-1:-1;;;30795:61:0;;23541:2:1;30795:61:0;;;23523:21:1;;;23560:18;;;23553:30;23619:34;23599:18;;;23592:62;23671:18;;30795:61:0;23339:356:1;30795:61:0;30876:16;30884:7;30876;:16::i;:::-;30875:17;30867:58;;;;-1:-1:-1;;;30867:58:0;;23902:2:1;30867:58:0;;;23884:21:1;23941:2;23921:18;;;23914:30;23980;23960:18;;;23953:58;24028:18;;30867:58:0;23700:352:1;30867:58:0;30994:7;:16;;;;;;;-1:-1:-1;30994:16:0;;;;;;;-1:-1:-1;;;;;;30994:16:0;-1:-1:-1;;;;;30994:16:0;;;;;;;;31028:33;;31053:7;;-1:-1:-1;31028:33:0;;-1:-1:-1;;31028:33:0;30723:346;;:::o;40639:701::-;40722:7;40765:4;40722:7;40780:523;40804:5;:12;40800:1;:16;40780:523;;;40838:20;40861:5;40867:1;40861:8;;;;;;;;:::i;:::-;;;;;;;40838:31;;40904:12;40888;:28;40884:408;;41041:44;;;;;;24214:19:1;;;24249:12;;;24242:28;;;24286:12;;41041:44:0;;;;;;;;;;;;41031:55;;;;;;41016:70;;40884:408;;;41231:44;;;;;;24214:19:1;;;24249:12;;;24242:28;;;24286:12;;41231:44:0;;;;;;;;;;;;41221:55;;;;;;41206:70;;40884:408;-1:-1:-1;40818:3:0;;;;:::i;:::-;;;;40780:523;;;-1:-1:-1;41320:12:0;40639:701;-1:-1:-1;;;40639:701:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:131::-;-1:-1:-1;;;;;1833:31:1;;1823:42;;1813:70;;1879:1;1876;1869:12;1894:315;1962:6;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2078:9;2065:23;2097:31;2122:5;2097:31;:::i;:::-;2147:5;2199:2;2184:18;;;;2171:32;;-1:-1:-1;;;1894:315:1:o;2396:456::-;2473:6;2481;2489;2542:2;2530:9;2521:7;2517:23;2513:32;2510:52;;;2558:1;2555;2548:12;2510:52;2597:9;2584:23;2616:31;2641:5;2616:31;:::i;:::-;2666:5;-1:-1:-1;2723:2:1;2708:18;;2695:32;2736:33;2695:32;2736:33;:::i;:::-;2396:456;;2788:7;;-1:-1:-1;;;2842:2:1;2827:18;;;;2814:32;;2396:456::o;2857:127::-;2918:10;2913:3;2909:20;2906:1;2899:31;2949:4;2946:1;2939:15;2973:4;2970:1;2963:15;2989:275;3060:2;3054:9;3125:2;3106:13;;-1:-1:-1;;3102:27:1;3090:40;;3160:18;3145:34;;3181:22;;;3142:62;3139:88;;;3207:18;;:::i;:::-;3243:2;3236:22;2989:275;;-1:-1:-1;2989:275:1:o;3269:407::-;3334:5;3368:18;3360:6;3357:30;3354:56;;;3390:18;;:::i;:::-;3428:57;3473:2;3452:15;;-1:-1:-1;;3448:29:1;3479:4;3444:40;3428:57;:::i;:::-;3419:66;;3508:6;3501:5;3494:21;3548:3;3539:6;3534:3;3530:16;3527:25;3524:45;;;3565:1;3562;3555:12;3524:45;3614:6;3609:3;3602:4;3595:5;3591:16;3578:43;3668:1;3661:4;3652:6;3645:5;3641:18;3637:29;3630:40;3269:407;;;;;:::o;3681:451::-;3750:6;3803:2;3791:9;3782:7;3778:23;3774:32;3771:52;;;3819:1;3816;3809:12;3771:52;3859:9;3846:23;3892:18;3884:6;3881:30;3878:50;;;3924:1;3921;3914:12;3878:50;3947:22;;4000:4;3992:13;;3988:27;-1:-1:-1;3978:55:1;;4029:1;4026;4019:12;3978:55;4052:74;4118:7;4113:2;4100:16;4095:2;4091;4087:11;4052:74;:::i;4137:247::-;4196:6;4249:2;4237:9;4228:7;4224:23;4220:32;4217:52;;;4265:1;4262;4255:12;4217:52;4304:9;4291:23;4323:31;4348:5;4323:31;:::i;4389:750::-;4484:6;4492;4500;4553:2;4541:9;4532:7;4528:23;4524:32;4521:52;;;4569:1;4566;4559:12;4521:52;4608:9;4595:23;4627:31;4652:5;4627:31;:::i;:::-;4677:5;-1:-1:-1;4733:2:1;4718:18;;4705:32;4756:18;4786:14;;;4783:34;;;4813:1;4810;4803:12;4783:34;4851:6;4840:9;4836:22;4826:32;;4896:7;4889:4;4885:2;4881:13;4877:27;4867:55;;4918:1;4915;4908:12;4867:55;4958:2;4945:16;4984:2;4976:6;4973:14;4970:34;;;5000:1;4997;4990:12;4970:34;5053:7;5048:2;5038:6;5035:1;5031:14;5027:2;5023:23;5019:32;5016:45;5013:65;;;5074:1;5071;5064:12;5013:65;5105:2;5101;5097:11;5087:21;;5127:6;5117:16;;;;;4389:750;;;;;:::o;5144:416::-;5209:6;5217;5270:2;5258:9;5249:7;5245:23;5241:32;5238:52;;;5286:1;5283;5276:12;5238:52;5325:9;5312:23;5344:31;5369:5;5344:31;:::i;:::-;5394:5;-1:-1:-1;5451:2:1;5436:18;;5423:32;5493:15;;5486:23;5474:36;;5464:64;;5524:1;5521;5514:12;5464:64;5547:7;5537:17;;;5144:416;;;;;:::o;5747:795::-;5842:6;5850;5858;5866;5919:3;5907:9;5898:7;5894:23;5890:33;5887:53;;;5936:1;5933;5926:12;5887:53;5975:9;5962:23;5994:31;6019:5;5994:31;:::i;:::-;6044:5;-1:-1:-1;6101:2:1;6086:18;;6073:32;6114:33;6073:32;6114:33;:::i;:::-;6166:7;-1:-1:-1;6220:2:1;6205:18;;6192:32;;-1:-1:-1;6275:2:1;6260:18;;6247:32;6302:18;6291:30;;6288:50;;;6334:1;6331;6324:12;6288:50;6357:22;;6410:4;6402:13;;6398:27;-1:-1:-1;6388:55:1;;6439:1;6436;6429:12;6388:55;6462:74;6528:7;6523:2;6510:16;6505:2;6501;6497:11;6462:74;:::i;:::-;6452:84;;;5747:795;;;;;;;:::o;6547:1082::-;6649:6;6657;6665;6718:2;6706:9;6697:7;6693:23;6689:32;6686:52;;;6734:1;6731;6724:12;6686:52;6770:9;6757:23;6747:33;;6799:2;6848;6837:9;6833:18;6820:32;6810:42;;6903:2;6892:9;6888:18;6875:32;6926:18;6967:2;6959:6;6956:14;6953:34;;;6983:1;6980;6973:12;6953:34;7021:6;7010:9;7006:22;6996:32;;7066:7;7059:4;7055:2;7051:13;7047:27;7037:55;;7088:1;7085;7078:12;7037:55;7124:2;7111:16;7146:2;7142;7139:10;7136:36;;;7152:18;;:::i;:::-;7198:2;7195:1;7191:10;7181:20;;7221:28;7245:2;7241;7237:11;7221:28;:::i;:::-;7283:15;;;7353:11;;;7349:20;;;7314:12;;;;7381:19;;;7378:39;;;7413:1;7410;7403:12;7378:39;7437:11;;;;7457:142;7473:6;7468:3;7465:15;7457:142;;;7539:17;;7527:30;;7490:12;;;;7577;;;;7457:142;;;7618:5;7608:15;;;;;;;;6547:1082;;;;;:::o;7819:388::-;7887:6;7895;7948:2;7936:9;7927:7;7923:23;7919:32;7916:52;;;7964:1;7961;7954:12;7916:52;8003:9;7990:23;8022:31;8047:5;8022:31;:::i;:::-;8072:5;-1:-1:-1;8129:2:1;8114:18;;8101:32;8142:33;8101:32;8142:33;:::i;8212:380::-;8291:1;8287:12;;;;8334;;;8355:61;;8409:4;8401:6;8397:17;8387:27;;8355:61;8462:2;8454:6;8451:14;8431:18;8428:38;8425:161;;;8508:10;8503:3;8499:20;8496:1;8489:31;8543:4;8540:1;8533:15;8571:4;8568:1;8561:15;8425:161;;8212:380;;;:::o;9837:413::-;10039:2;10021:21;;;10078:2;10058:18;;;10051:30;10117:34;10112:2;10097:18;;10090:62;-1:-1:-1;;;10183:2:1;10168:18;;10161:47;10240:3;10225:19;;9837:413::o;10255:407::-;10457:2;10439:21;;;10496:2;10476:18;;;10469:30;10535:34;10530:2;10515:18;;10508:62;-1:-1:-1;;;10601:2:1;10586:18;;10579:41;10652:3;10637:19;;10255:407::o;10667:127::-;10728:10;10723:3;10719:20;10716:1;10709:31;10759:4;10756:1;10749:15;10783:4;10780:1;10773:15;10799:127;10860:10;10855:3;10851:20;10848:1;10841:31;10891:4;10888:1;10881:15;10915:4;10912:1;10905:15;10931:135;10970:3;-1:-1:-1;;10991:17:1;;10988:43;;;11011:18;;:::i;:::-;-1:-1:-1;11058:1:1;11047:13;;10931:135::o;11071:356::-;11273:2;11255:21;;;11292:18;;;11285:30;11351:34;11346:2;11331:18;;11324:62;11418:2;11403:18;;11071:356::o;11642:339::-;11844:2;11826:21;;;11883:2;11863:18;;;11856:30;-1:-1:-1;;;11917:2:1;11902:18;;11895:45;11972:2;11957:18;;11642:339::o;15101:128::-;15141:3;15172:1;15168:6;15165:1;15162:13;15159:39;;;15178:18;;:::i;:::-;-1:-1:-1;15214:9:1;;15101:128::o;17896:185::-;17938:3;17976:5;17970:12;17991:52;18036:6;18031:3;18024:4;18017:5;18013:16;17991:52;:::i;:::-;18059:16;;;;;17896:185;-1:-1:-1;;17896:185:1:o;18086:1174::-;18262:3;18291:1;18324:6;18318:13;18354:3;18376:1;18404:9;18400:2;18396:18;18386:28;;18464:2;18453:9;18449:18;18486;18476:61;;18530:4;18522:6;18518:17;18508:27;;18476:61;18556:2;18604;18596:6;18593:14;18573:18;18570:38;18567:165;;;-1:-1:-1;;;18631:33:1;;18687:4;18684:1;18677:15;18717:4;18638:3;18705:17;18567:165;18748:18;18775:104;;;;18893:1;18888:320;;;;18741:467;;18775:104;-1:-1:-1;;18808:24:1;;18796:37;;18853:16;;;;-1:-1:-1;18775:104:1;;18888:320;17843:1;17836:14;;;17880:4;17867:18;;18983:1;18997:165;19011:6;19008:1;19005:13;18997:165;;;19089:14;;19076:11;;;19069:35;19132:16;;;;19026:10;;18997:165;;;19001:3;;19191:6;19186:3;19182:16;19175:23;;18741:467;;;;;;;19224:30;19250:3;19242:6;19224:30;:::i;:::-;19217:37;18086:1174;-1:-1:-1;;;;;18086:1174:1:o;19265:280::-;19364:6;19417:2;19405:9;19396:7;19392:23;19388:32;19385:52;;;19433:1;19430;19423:12;19385:52;19465:9;19459:16;19484:31;19509:5;19484:31;:::i;21185:168::-;21225:7;21291:1;21287;21283:6;21279:14;21276:1;21273:21;21268:1;21261:9;21254:17;21250:45;21247:71;;;21298:18;;:::i;:::-;-1:-1:-1;21338:9:1;;21185:168::o;21358:127::-;21419:10;21414:3;21410:20;21407:1;21400:31;21450:4;21447:1;21440:15;21474:4;21471:1;21464:15;21490:120;21530:1;21556;21546:35;;21561:18;;:::i;:::-;-1:-1:-1;21595:9:1;;21490:120::o;21615:414::-;21817:2;21799:21;;;21856:2;21836:18;;;21829:30;21895:34;21890:2;21875:18;;21868:62;-1:-1:-1;;;21961:2:1;21946:18;;21939:48;22019:3;22004:19;;21615:414::o;22333:125::-;22373:4;22401:1;22398;22395:8;22392:34;;;22406:18;;:::i;:::-;-1:-1:-1;22443:9:1;;22333:125::o;22463:112::-;22495:1;22521;22511:35;;22526:18;;:::i;:::-;-1:-1:-1;22560:9:1;;22463:112::o;22580:500::-;-1:-1:-1;;;;;22849:15:1;;;22831:34;;22901:15;;22896:2;22881:18;;22874:43;22948:2;22933:18;;22926:34;;;22996:3;22991:2;22976:18;;22969:31;;;22774:4;;23017:57;;23054:19;;23046:6;23017:57;:::i;:::-;23009:65;22580:500;-1:-1:-1;;;;;;22580:500:1:o;23085:249::-;23154:6;23207:2;23195:9;23186:7;23182:23;23178:32;23175:52;;;23223:1;23220;23213:12;23175:52;23255:9;23249:16;23274:30;23298:5;23274:30;:::i

Swarm Source

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