ETH Price: $3,277.34 (-3.90%)
Gas: 19 Gwei

Token

HAHAPEWPEW (HAHAPEWPEW)
 

Overview

Max Total Supply

6,666 HAHAPEWPEW

Holders

2,234

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 HAHAPEWPEW
0x34fb782764afc0476e018c7db1f8a8484971313d
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:
HAHAPEWPEW

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-20
*/

// 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
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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 OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.7;

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, DefaultOperatorFilterer {
    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(IERC721) onlyAllowedOperatorApproval(to) {
        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(IERC721)
        onlyAllowedOperatorApproval(operator)
    {
        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(IERC721) onlyAllowedOperator(from) {
        //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(IERC721) onlyAllowedOperator(from) {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override(IERC721) onlyAllowedOperator(from) {
        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);
    }
}

pragma solidity ^0.8.11;
pragma abicoder v2;

contract HAHAPEWPEW is ERC721Enumerable, Ownable, ReentrancyGuard {
  bool                                            public          pewPewReady = false;
  bool                                            public          prePewPewReady = false;
  string                                          public          baseURI;
  uint                                            public constant MAX_PEW_PEW = 2;
  uint                                            public constant MAX_PROJECT_PEW_PEW = 10;
  uint256                                         public constant HAHA_PEW_PEW = 6666;
  mapping(address => uint256)                     public          constructedPewPew;
  mapping(address => uint256)                     public          projectPewPews;
  mapping(address => mapping(uint256 => uint))    public          projectConstructedPewPew;
  address[]                                       public          availableProjectPewPews;
    
  constructor() ERC721("HAHAPEWPEW", "HAHAPEWPEW") {
    setBaseURI("ipfs://QmZgXPYQ9ZY6SxyDxTXQHLVrmP1xzSkpw1jauAcRkFfLsY/");
    // Luminal Genesis
    projectPewPews[address(0x8BAc4bd59dc49E46ee1972dFAf0c5e039b88552D)] = 2;
    availableProjectPewPews.push(address(0x8BAc4bd59dc49E46ee1972dFAf0c5e039b88552D));

    // Luminal Avatars
    projectPewPews[address(0x8e07dCEA5c57e2b0b71f7BBf514A3cc5bAb2E96e)] = 1;
    availableProjectPewPews.push(address(0x8e07dCEA5c57e2b0b71f7BBf514A3cc5bAb2E96e));

    // Funkari
    projectPewPews[address(0x1faFd33D882e1C275C61066019a23c1999B5006e)] = 1;
    availableProjectPewPews.push(address(0x1faFd33D882e1C275C61066019a23c1999B5006e));

    _mint(msg.sender, totalSupply());
  }
    
  function withdraw() public onlyOwner {
    uint256 balance = address(this).balance;
    require(balance > 0);

    (bool ownerSuccess, ) = msg.sender.call{value: address(this).balance}("");
    require(ownerSuccess, "PEW PEW ZOINK!");
  }

  function setBaseURI(string memory _baseURI) public onlyOwner {
    baseURI = _baseURI;
  }

  function happyPewPew() public onlyOwner {
    pewPewReady = !pewPewReady;
  }

  function preHappyPewPew() public onlyOwner {
    prePewPewReady = !prePewPewReady;
  }

  function addMoreProjectPewPew(uint256 amount, address projectPewPew) external onlyOwner {
    projectPewPews[projectPewPew] = amount;
    availableProjectPewPews.push(projectPewPew);
  }
  
  function constructManyProjectPewPew(address projectOwned, uint256[] calldata ownedTokenIds, uint pewPews) public payable nonReentrant {
    uint supply = totalSupply();
    uint availablePewPew;
    int pewPewTracker = int(pewPews);
    bool walletLimit = true;
    uint projectPewPewLimit = projectPewPews[projectOwned];
    for (uint i = 0; i < 3; i ++) {
      if (projectOwned == availableProjectPewPews[i]) {
        walletLimit = false;
        break;
      }
    }
    if (walletLimit == true) {
      require(pewPews <= MAX_PROJECT_PEW_PEW, "TOO MANY! ZOINK ZOINK");
      require(constructedPewPew[msg.sender] + pewPews <= MAX_PROJECT_PEW_PEW, "ZOINKS! CAPPED!");
    }
    require(prePewPewReady, "PEW PEW! ZOINK!");
    for (uint i = 0; i < ownedTokenIds.length; i ++) {
      require(IERC721(projectOwned).ownerOf(ownedTokenIds[i]) == msg.sender, "ZOINK! OWNZZZRPT!");
      availablePewPew += projectPewPewLimit - projectConstructedPewPew[projectOwned][ownedTokenIds[i]];
    }
    require(availablePewPew - pewPews >= 0, "ZOINKS! CAPPED!");
    require(supply + pewPews <= HAHA_PEW_PEW, "ZOINKS! OVERLOADED!");
    
    for (uint i = 0; i < ownedTokenIds.length; i ++) {
      require(projectPewPewLimit != projectConstructedPewPew[projectOwned][ownedTokenIds[i]], "ZOINK! MAXXED OUT!");
      if (pewPewTracker > 0) {
        int diff = int(projectPewPewLimit) - int(projectConstructedPewPew[projectOwned][ownedTokenIds[i]]);
        if (pewPewTracker - diff > 0) {
          projectConstructedPewPew[projectOwned][ownedTokenIds[i]] += uint(diff);
          pewPewTracker -= diff;
        } else {
          projectConstructedPewPew[projectOwned][ownedTokenIds[i]] += uint(pewPewTracker);
          pewPewTracker = 0;
          break;
        }
      }
    }

    constructedPewPew[msg.sender] += pewPews;
    for(uint i = 0; i < pewPews; i++) {
      _mint(msg.sender, supply + i);
    }
  }

  function constructPewPew(uint pewPews) public payable nonReentrant {
    uint supply = totalSupply();
    require(pewPewReady, "PEW PEW! ZOINK!");
    require(pewPews <= MAX_PEW_PEW, "ZOINKS! ZZZRPT!");
    require(constructedPewPew[msg.sender] + pewPews <= MAX_PEW_PEW, "ZOINKS! CAPPED!");
    require(supply + pewPews <= HAHA_PEW_PEW, "ZOINKS! OVERLOADED!");
    
    constructedPewPew[msg.sender] += pewPews;
    for(uint i = 0; i < pewPews; i++) {
      _mint(msg.sender, supply + i);
    }
  }

  function tokenURI(uint256 _tokenId) external view returns (string memory) {
    require(_exists(_tokenId), "ZOINKS! NOT CONSTRUCTED");
    return string(abi.encodePacked(baseURI, Strings.toString(_tokenId)));
  }

  function airdrop(address _to, uint256 _numberOfTokens) external onlyOwner {
    uint256 supply = totalSupply();
    require(supply + _numberOfTokens <= HAHA_PEW_PEW, "ZOINKS! TOO MANY PEW PEW");
    for (uint256 i; i < _numberOfTokens; i++) {
      _mint(_to, supply + i);
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":"HAHA_PEW_PEW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PEW_PEW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PROJECT_PEW_PEW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"projectPewPew","type":"address"}],"name":"addMoreProjectPewPew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_numberOfTokens","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":"uint256","name":"","type":"uint256"}],"name":"availableProjectPewPews","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"projectOwned","type":"address"},{"internalType":"uint256[]","name":"ownedTokenIds","type":"uint256[]"},{"internalType":"uint256","name":"pewPews","type":"uint256"}],"name":"constructManyProjectPewPew","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pewPews","type":"uint256"}],"name":"constructPewPew","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"constructedPewPew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"happyPewPew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"pewPewReady","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preHappyPewPew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"prePewPewReady","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectConstructedPewPew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"projectPewPews","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526007805461ffff191690553480156200001c57600080fd5b50604080518082018252600a808252694841484150455750455760b01b602080840182905284518086019095529184529083015290733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620001ad578015620000fb57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620000dc57600080fd5b505af1158015620000f1573d6000803e3d6000fd5b50505050620001ad565b6001600160a01b038216156200014c5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000c1565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200019357600080fd5b505af1158015620001a8573d6000803e3d6000fd5b505050505b50508151620001c4906000906020850190620005a1565b508051620001da906001906020840190620005a1565b505050620001f7620001f16200035560201b60201c565b62000359565b600160068190555062000223604051806060016040528060368152602001620030b060369139620003ab565b600a60205260027fe2d93dd7c91bb21a8dd8878c831b2a92901fd5366304a202df91a80ad058d0c555600c8054600181810183557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c791820180546001600160a01b0319908116738bac4bd59dc49e46ee1972dfaf0c5e039b88552d179091557f058d9af194d1059db15e045c118efcc0a60811f684a45ad45e038b7863d7c99382905583548083018555830180548216738e07dcea5c57e2b0b71f7bbf514a3cc5bab2e96e1790557f1aee9350e9ddd66e5cb49201135d518467a1f125fe6ec3a2d4d8b55c4542e0ff82905583549182018455600093909352018054909116731fafd33d882e1c275c61066019a23c1999b5006e1790556200034f336200034960025490565b62000424565b62000699565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b031633146200040b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b805162000420906008906020840190620005a1565b5050565b6001600160a01b0382166200047c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640162000402565b620004878162000552565b15620004d65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000402565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600254600090821080156200059b575060006001600160a01b03166002838154811062000583576200058362000647565b6000918252602090912001546001600160a01b031614155b92915050565b828054620005af906200065d565b90600052602060002090601f016020900481019282620005d357600085556200061e565b82601f10620005ee57805160ff19168380011785556200061e565b828001600101855582156200061e579182015b828111156200061e57825182559160200191906001019062000601565b506200062c92915062000630565b5090565b5b808211156200062c576000815560010162000631565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200067257607f821691505b6020821081036200069357634e487b7160e01b600052602260045260246000fd5b50919050565b612a0780620006a96000396000f3fe6080604052600436106102255760003560e01c80636112e5a21161012357806395d89b41116100ab578063c87b56dd1161006f578063c87b56dd1461062d578063c94d94c91461064d578063ca36665714610660578063e985e9c51461068d578063f2fde38b146106d657600080fd5b806395d89b411461058b578063a22cb465146105a0578063b881c14f146105c0578063b88d4fde146105d5578063c312f075146105f557600080fd5b806370a08231116100f257806370a0823114610503578063715018a6146105235780638b6db324146105385780638ba4cc3c1461054d5780638da5cb5b1461056d57600080fd5b80636112e5a21461048e5780636352211e146104bb5780636b47bd11146104db5780636c0360eb146104ee57600080fd5b806323b872dd116101b157806341f434341161017557806341f43434146103ec57806342842e0e1461040e5780634f6ccce71461042e57806355f804b31461044e578063602dde631461046e57600080fd5b806323b872dd1461036357806327d664db146103835780632c835167146103985780632f745c59146103b75780633ccfd60b146103d757600080fd5b8063095ea7b3116101f8578063095ea7b3146102d35780630cb24305146102f557806315f6900c1461031957806318160ddd1461032e57806323565ec71461034357600080fd5b806301ffc9a71461022a578063062263e71461025f57806306fdde0314610279578063081812fc1461029b575b600080fd5b34801561023657600080fd5b5061024a610245366004612240565b6106f6565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5060075461024a9060ff1681565b34801561028557600080fd5b5061028e610721565b60405161025691906122bc565b3480156102a757600080fd5b506102bb6102b63660046122cf565b6107b3565b6040516001600160a01b039091168152602001610256565b3480156102df57600080fd5b506102f36102ee3660046122fd565b610840565b005b34801561030157600080fd5b5061030b611a0a81565b604051908152602001610256565b34801561032557600080fd5b506102f3610960565b34801561033a57600080fd5b5060025461030b565b34801561034f57600080fd5b506102f361035e366004612329565b6109a7565b34801561036f57600080fd5b506102f361037e366004612359565b610a2f565b34801561038f57600080fd5b506102f3610a7a565b3480156103a457600080fd5b5060075461024a90610100900460ff1681565b3480156103c357600080fd5b5061030b6103d23660046122fd565b610ab8565b3480156103e357600080fd5b506102f3610b6a565b3480156103f857600080fd5b506102bb6daaeb6d7670e522a718067333cd4e81565b34801561041a57600080fd5b506102f3610429366004612359565b610c2c565b34801561043a57600080fd5b5061030b6104493660046122cf565b610c61565b34801561045a57600080fd5b506102f3610469366004612426565b610cce565b34801561047a57600080fd5b506102bb6104893660046122cf565b610d0b565b34801561049a57600080fd5b5061030b6104a936600461246f565b600a6020526000908152604090205481565b3480156104c757600080fd5b506102bb6104d63660046122cf565b610d35565b6102f36104e936600461248c565b610dc1565b3480156104fa57600080fd5b5061028e611373565b34801561050f57600080fd5b5061030b61051e36600461246f565b611401565b34801561052f57600080fd5b506102f36114cf565b34801561054457600080fd5b5061030b600a81565b34801561055957600080fd5b506102f36105683660046122fd565b611505565b34801561057957600080fd5b506005546001600160a01b03166102bb565b34801561059757600080fd5b5061028e6115c2565b3480156105ac57600080fd5b506102f36105bb366004612528565b6115d1565b3480156105cc57600080fd5b5061030b600281565b3480156105e157600080fd5b506102f36105f0366004612556565b6116a0565b34801561060157600080fd5b5061030b6106103660046122fd565b600b60209081526000928352604080842090915290825290205481565b34801561063957600080fd5b5061028e6106483660046122cf565b6116f3565b6102f361065b3660046122cf565b61177c565b34801561066c57600080fd5b5061030b61067b36600461246f565b60096020526000908152604090205481565b34801561069957600080fd5b5061024a6106a83660046125d6565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156106e257600080fd5b506102f36106f136600461246f565b61194f565b60006001600160e01b0319821663780e9d6360e01b148061071b575061071b826119ea565b92915050565b60606000805461073090612604565b80601f016020809104026020016040519081016040528092919081815260200182805461075c90612604565b80156107a95780601f1061077e576101008083540402835291602001916107a9565b820191906000526020600020905b81548152906001019060200180831161078c57829003601f168201915b5050505050905090565b60006107be82611a3a565b6108245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b8161084a81611a84565b600061085583610d35565b9050806001600160a01b0316846001600160a01b0316036108c25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161081b565b336001600160a01b03821614806108de57506108de81336106a8565b6109505760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161081b565b61095a8484611b3d565b50505050565b6005546001600160a01b0316331461098a5760405162461bcd60e51b815260040161081b9061263e565b6007805461ff001981166101009182900460ff1615909102179055565b6005546001600160a01b031633146109d15760405162461bcd60e51b815260040161081b9061263e565b6001600160a01b03166000818152600a6020526040812092909255600c805460018101825592527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c790910180546001600160a01b0319169091179055565b826001600160a01b0381163314610a4957610a4933611a84565b610a533383611bab565b610a6f5760405162461bcd60e51b815260040161081b90612673565b61095a848484611c95565b6005546001600160a01b03163314610aa45760405162461bcd60e51b815260040161081b9061263e565b6007805460ff19811660ff90911615179055565b6000610ac383611401565b8210610ae15760405162461bcd60e51b815260040161081b906126c4565b6000805b600254811015610b515760028181548110610b0257610b0261270f565b6000918252602090912001546001600160a01b0390811690861603610b3f57838203610b3157915061071b9050565b81610b3b8161273b565b9250505b80610b498161273b565b915050610ae5565b5060405162461bcd60e51b815260040161081b906126c4565b6005546001600160a01b03163314610b945760405162461bcd60e51b815260040161081b9061263e565b4780610b9f57600080fd5b604051600090339047908381818185875af1925050503d8060008114610be1576040519150601f19603f3d011682016040523d82523d6000602084013e610be6565b606091505b5050905080610c285760405162461bcd60e51b815260206004820152600e60248201526d50455720504557205a4f494e4b2160901b604482015260640161081b565b5050565b826001600160a01b0381163314610c4657610c4633611a84565b61095a848484604051806020016040528060008152506116a0565b6002546000908210610cca5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161081b565b5090565b6005546001600160a01b03163314610cf85760405162461bcd60e51b815260040161081b9061263e565b8051610c2890600890602084019061219a565b600c8181548110610d1b57600080fd5b6000918252602090912001546001600160a01b0316905081565b60008060028381548110610d4b57610d4b61270f565b6000918252602090912001546001600160a01b031690508061071b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161081b565b600260065403610e135760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161081b565b60026006556000610e2360025490565b6001600160a01b0386166000908152600a6020526040812054919250908390600190835b6003811015610e9d57600c8181548110610e6357610e6361270f565b6000918252602090912001546001600160a01b03908116908b1603610e8b5760009250610e9d565b80610e958161273b565b915050610e47565b50811515600103610f2d57600a861115610ef15760405162461bcd60e51b8152602060048201526015602482015274544f4f204d414e5921205a4f494e4b205a4f494e4b60581b604482015260640161081b565b33600090815260096020526040902054600a90610f0f908890612754565b1115610f2d5760405162461bcd60e51b815260040161081b9061276c565b600754610100900460ff16610f765760405162461bcd60e51b815260206004820152600f60248201526e5045572050455721205a4f494e4b2160881b604482015260640161081b565b60005b878110156110bd57336001600160a01b038b16636352211e8b8b85818110610fa357610fa361270f565b905060200201356040518263ffffffff1660e01b8152600401610fc891815260200190565b602060405180830381865afa158015610fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110099190612795565b6001600160a01b0316146110535760405162461bcd60e51b81526020600482015260116024820152705a4f494e4b21204f574e5a5a5a5250542160781b604482015260640161081b565b6001600160a01b038a166000908152600b60205260408120908a8a8481811061107e5761107e61270f565b905060200201358152602001908152602001600020548261109f91906127b2565b6110a99086612754565b9450806110b58161273b565b915050610f79565b5060006110ca87866127b2565b10156110e85760405162461bcd60e51b815260040161081b9061276c565b611a0a6110f58787612754565b11156111395760405162461bcd60e51b81526020600482015260136024820152725a4f494e4b5321204f5645524c4f414445442160681b604482015260640161081b565b60005b8781101561130c576001600160a01b038a166000908152600b60205260408120908a8a8481811061116f5761116f61270f565b9050602002013581526020019081526020016000205482036111c85760405162461bcd60e51b81526020600482015260126024820152715a4f494e4b21204d4158584544204f55542160701b604482015260640161081b565b60008413156112fa576001600160a01b038a166000908152600b60205260408120818b8b858181106111fc576111fc61270f565b905060200201358152602001908152602001600020548361121d91906127c9565b9050600061122b82876127c9565b1315611298576001600160a01b038b166000908152600b6020526040812082918c8c8681811061125d5761125d61270f565b90506020020135815260200190815260200160002060008282546112819190612754565b90915550611291905081866127c9565b94506112f8565b6001600160a01b038b166000908152600b6020526040812086918c8c868181106112c4576112c461270f565b90506020020135815260200190815260200160002060008282546112e89190612754565b909155506000955061130c915050565b505b806113048161273b565b91505061113c565b50336000908152600960205260408120805488929061132c908490612754565b90915550600090505b86811015611362576113503361134b8389612754565b611deb565b8061135a8161273b565b915050611335565b505060016006555050505050505050565b6008805461138090612604565b80601f01602080910402602001604051908101604052809291908181526020018280546113ac90612604565b80156113f95780601f106113ce576101008083540402835291602001916113f9565b820191906000526020600020905b8154815290600101906020018083116113dc57829003601f168201915b505050505081565b60006001600160a01b03821661146c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161081b565b6000805b6002548110156114c8576002818154811061148d5761148d61270f565b6000918252602090912001546001600160a01b03908116908516036114b8576114b58261273b565b91505b6114c18161273b565b9050611470565b5092915050565b6005546001600160a01b031633146114f95760405162461bcd60e51b815260040161081b9061263e565b6115036000611f13565b565b6005546001600160a01b0316331461152f5760405162461bcd60e51b815260040161081b9061263e565b600061153a60025490565b9050611a0a6115498383612754565b11156115975760405162461bcd60e51b815260206004820152601860248201527f5a4f494e4b532120544f4f204d414e5920504557205045570000000000000000604482015260640161081b565b60005b8281101561095a576115b08461134b8385612754565b806115ba8161273b565b91505061159a565b60606001805461073090612604565b816115db81611a84565b336001600160a01b038416036116335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161081b565b3360008181526004602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b836001600160a01b03811633146116ba576116ba33611a84565b6116c43384611bab565b6116e05760405162461bcd60e51b815260040161081b90612673565b6116ec85858585611f65565b5050505050565b60606116fe82611a3a565b61174a5760405162461bcd60e51b815260206004820152601760248201527f5a4f494e4b5321204e4f5420434f4e5354525543544544000000000000000000604482015260640161081b565b600861175583611f98565b604051602001611766929190612824565b6040516020818303038152906040529050919050565b6002600654036117ce5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161081b565b600260065560006117de60025490565b60075490915060ff166118255760405162461bcd60e51b815260206004820152600f60248201526e5045572050455721205a4f494e4b2160881b604482015260640161081b565b60028211156118685760405162461bcd60e51b815260206004820152600f60248201526e5a4f494e4b5321205a5a5a5250542160881b604482015260640161081b565b33600090815260096020526040902054600290611886908490612754565b11156118a45760405162461bcd60e51b815260040161081b9061276c565b611a0a6118b18383612754565b11156118f55760405162461bcd60e51b81526020600482015260136024820152725a4f494e4b5321204f5645524c4f414445442160681b604482015260640161081b565b3360009081526009602052604081208054849290611914908490612754565b90915550600090505b82811015611945576119333361134b8385612754565b8061193d8161273b565b91505061191d565b5050600160065550565b6005546001600160a01b031633146119795760405162461bcd60e51b815260040161081b9061263e565b6001600160a01b0381166119de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081b565b6119e781611f13565b50565b60006001600160e01b031982166380ac58cd60e01b1480611a1b57506001600160e01b03198216635b5e139f60e01b145b8061071b57506301ffc9a760e01b6001600160e01b031983161461071b565b6002546000908210801561071b575060006001600160a01b031660028381548110611a6757611a6761270f565b6000918252602090912001546001600160a01b0316141592915050565b6daaeb6d7670e522a718067333cd4e3b156119e757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1591906128ca565b6119e757604051633b79c77360e21b81526001600160a01b038216600482015260240161081b565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b7282610d35565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bb682611a3a565b611c175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161081b565b6000611c2283610d35565b9050806001600160a01b0316846001600160a01b03161480611c5d5750836001600160a01b0316611c52846107b3565b6001600160a01b0316145b80611c8d57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ca882610d35565b6001600160a01b031614611d105760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161081b565b6001600160a01b038216611d725760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161081b565b611d7d600082611b3d565b8160028281548110611d9157611d9161270f565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6001600160a01b038216611e415760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161081b565b611e4a81611a3a565b15611e975760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161081b565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f70848484611c95565b611f7c84848484612099565b61095a5760405162461bcd60e51b815260040161081b906128e7565b606081600003611fbf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fe95780611fd38161273b565b9150611fe29050600a8361294f565b9150611fc3565b60008167ffffffffffffffff8111156120045761200461239a565b6040519080825280601f01601f19166020018201604052801561202e576020820181803683370190505b5090505b8415611c8d576120436001836127b2565b9150612050600a86612963565b61205b906030612754565b60f81b8183815181106120705761207061270f565b60200101906001600160f81b031916908160001a905350612092600a8661294f565b9450612032565b60006001600160a01b0384163b1561218f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120dd903390899088908890600401612977565b6020604051808303816000875af1925050508015612118575060408051601f3d908101601f19168201909252612115918101906129b4565b60015b612175573d808015612146576040519150601f19603f3d011682016040523d82523d6000602084013e61214b565b606091505b50805160000361216d5760405162461bcd60e51b815260040161081b906128e7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c8d565b506001949350505050565b8280546121a690612604565b90600052602060002090601f0160209004810192826121c8576000855561220e565b82601f106121e157805160ff191683800117855561220e565b8280016001018555821561220e579182015b8281111561220e5782518255916020019190600101906121f3565b50610cca9291505b80821115610cca5760008155600101612216565b6001600160e01b0319811681146119e757600080fd5b60006020828403121561225257600080fd5b813561225d8161222a565b9392505050565b60005b8381101561227f578181015183820152602001612267565b8381111561095a5750506000910152565b600081518084526122a8816020860160208601612264565b601f01601f19169290920160200192915050565b60208152600061225d6020830184612290565b6000602082840312156122e157600080fd5b5035919050565b6001600160a01b03811681146119e757600080fd5b6000806040838503121561231057600080fd5b823561231b816122e8565b946020939093013593505050565b6000806040838503121561233c57600080fd5b82359150602083013561234e816122e8565b809150509250929050565b60008060006060848603121561236e57600080fd5b8335612379816122e8565b92506020840135612389816122e8565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156123cb576123cb61239a565b604051601f8501601f19908116603f011681019082821181831017156123f3576123f361239a565b8160405280935085815286868601111561240c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561243857600080fd5b813567ffffffffffffffff81111561244f57600080fd5b8201601f8101841361246057600080fd5b611c8d848235602084016123b0565b60006020828403121561248157600080fd5b813561225d816122e8565b600080600080606085870312156124a257600080fd5b84356124ad816122e8565b9350602085013567ffffffffffffffff808211156124ca57600080fd5b818701915087601f8301126124de57600080fd5b8135818111156124ed57600080fd5b8860208260051b850101111561250257600080fd5b95986020929092019750949560400135945092505050565b80151581146119e757600080fd5b6000806040838503121561253b57600080fd5b8235612546816122e8565b9150602083013561234e8161251a565b6000806000806080858703121561256c57600080fd5b8435612577816122e8565b93506020850135612587816122e8565b925060408501359150606085013567ffffffffffffffff8111156125aa57600080fd5b8501601f810187136125bb57600080fd5b6125ca878235602084016123b0565b91505092959194509250565b600080604083850312156125e957600080fd5b82356125f4816122e8565b9150602083013561234e816122e8565b600181811c9082168061261857607f821691505b60208210810361263857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161274d5761274d612725565b5060010190565b6000821982111561276757612767612725565b500190565b6020808252600f908201526e5a4f494e4b5321204341505045442160881b604082015260600190565b6000602082840312156127a757600080fd5b815161225d816122e8565b6000828210156127c4576127c4612725565b500390565b60008083128015600160ff1b8501841216156127e7576127e7612725565b6001600160ff1b038401831381161561280257612802612725565b50500390565b6000815161281a818560208601612264565b9290920192915050565b600080845481600182811c91508083168061284057607f831692505b6020808410820361285f57634e487b7160e01b86526022600452602486fd5b8180156128735760018114612884576128b1565b60ff198616895284890196506128b1565b60008b81526020902060005b868110156128a95781548b820152908501908301612890565b505084890196505b5050505050506128c18185612808565b95945050505050565b6000602082840312156128dc57600080fd5b815161225d8161251a565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261295e5761295e612939565b500490565b60008261297257612972612939565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129aa90830184612290565b9695505050505050565b6000602082840312156129c657600080fd5b815161225d8161222a56fea2646970667358221220585528cc1e5444da25d2812746b12c53180b10d8f2d2afd44652356c17dc67b564736f6c634300080d0033697066733a2f2f516d5a6758505951395a59365378794478545851484c56726d5031787a536b7077316a61754163526b46664c73592f

Deployed Bytecode

0x6080604052600436106102255760003560e01c80636112e5a21161012357806395d89b41116100ab578063c87b56dd1161006f578063c87b56dd1461062d578063c94d94c91461064d578063ca36665714610660578063e985e9c51461068d578063f2fde38b146106d657600080fd5b806395d89b411461058b578063a22cb465146105a0578063b881c14f146105c0578063b88d4fde146105d5578063c312f075146105f557600080fd5b806370a08231116100f257806370a0823114610503578063715018a6146105235780638b6db324146105385780638ba4cc3c1461054d5780638da5cb5b1461056d57600080fd5b80636112e5a21461048e5780636352211e146104bb5780636b47bd11146104db5780636c0360eb146104ee57600080fd5b806323b872dd116101b157806341f434341161017557806341f43434146103ec57806342842e0e1461040e5780634f6ccce71461042e57806355f804b31461044e578063602dde631461046e57600080fd5b806323b872dd1461036357806327d664db146103835780632c835167146103985780632f745c59146103b75780633ccfd60b146103d757600080fd5b8063095ea7b3116101f8578063095ea7b3146102d35780630cb24305146102f557806315f6900c1461031957806318160ddd1461032e57806323565ec71461034357600080fd5b806301ffc9a71461022a578063062263e71461025f57806306fdde0314610279578063081812fc1461029b575b600080fd5b34801561023657600080fd5b5061024a610245366004612240565b6106f6565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5060075461024a9060ff1681565b34801561028557600080fd5b5061028e610721565b60405161025691906122bc565b3480156102a757600080fd5b506102bb6102b63660046122cf565b6107b3565b6040516001600160a01b039091168152602001610256565b3480156102df57600080fd5b506102f36102ee3660046122fd565b610840565b005b34801561030157600080fd5b5061030b611a0a81565b604051908152602001610256565b34801561032557600080fd5b506102f3610960565b34801561033a57600080fd5b5060025461030b565b34801561034f57600080fd5b506102f361035e366004612329565b6109a7565b34801561036f57600080fd5b506102f361037e366004612359565b610a2f565b34801561038f57600080fd5b506102f3610a7a565b3480156103a457600080fd5b5060075461024a90610100900460ff1681565b3480156103c357600080fd5b5061030b6103d23660046122fd565b610ab8565b3480156103e357600080fd5b506102f3610b6a565b3480156103f857600080fd5b506102bb6daaeb6d7670e522a718067333cd4e81565b34801561041a57600080fd5b506102f3610429366004612359565b610c2c565b34801561043a57600080fd5b5061030b6104493660046122cf565b610c61565b34801561045a57600080fd5b506102f3610469366004612426565b610cce565b34801561047a57600080fd5b506102bb6104893660046122cf565b610d0b565b34801561049a57600080fd5b5061030b6104a936600461246f565b600a6020526000908152604090205481565b3480156104c757600080fd5b506102bb6104d63660046122cf565b610d35565b6102f36104e936600461248c565b610dc1565b3480156104fa57600080fd5b5061028e611373565b34801561050f57600080fd5b5061030b61051e36600461246f565b611401565b34801561052f57600080fd5b506102f36114cf565b34801561054457600080fd5b5061030b600a81565b34801561055957600080fd5b506102f36105683660046122fd565b611505565b34801561057957600080fd5b506005546001600160a01b03166102bb565b34801561059757600080fd5b5061028e6115c2565b3480156105ac57600080fd5b506102f36105bb366004612528565b6115d1565b3480156105cc57600080fd5b5061030b600281565b3480156105e157600080fd5b506102f36105f0366004612556565b6116a0565b34801561060157600080fd5b5061030b6106103660046122fd565b600b60209081526000928352604080842090915290825290205481565b34801561063957600080fd5b5061028e6106483660046122cf565b6116f3565b6102f361065b3660046122cf565b61177c565b34801561066c57600080fd5b5061030b61067b36600461246f565b60096020526000908152604090205481565b34801561069957600080fd5b5061024a6106a83660046125d6565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156106e257600080fd5b506102f36106f136600461246f565b61194f565b60006001600160e01b0319821663780e9d6360e01b148061071b575061071b826119ea565b92915050565b60606000805461073090612604565b80601f016020809104026020016040519081016040528092919081815260200182805461075c90612604565b80156107a95780601f1061077e576101008083540402835291602001916107a9565b820191906000526020600020905b81548152906001019060200180831161078c57829003601f168201915b5050505050905090565b60006107be82611a3a565b6108245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b8161084a81611a84565b600061085583610d35565b9050806001600160a01b0316846001600160a01b0316036108c25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161081b565b336001600160a01b03821614806108de57506108de81336106a8565b6109505760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161081b565b61095a8484611b3d565b50505050565b6005546001600160a01b0316331461098a5760405162461bcd60e51b815260040161081b9061263e565b6007805461ff001981166101009182900460ff1615909102179055565b6005546001600160a01b031633146109d15760405162461bcd60e51b815260040161081b9061263e565b6001600160a01b03166000818152600a6020526040812092909255600c805460018101825592527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c790910180546001600160a01b0319169091179055565b826001600160a01b0381163314610a4957610a4933611a84565b610a533383611bab565b610a6f5760405162461bcd60e51b815260040161081b90612673565b61095a848484611c95565b6005546001600160a01b03163314610aa45760405162461bcd60e51b815260040161081b9061263e565b6007805460ff19811660ff90911615179055565b6000610ac383611401565b8210610ae15760405162461bcd60e51b815260040161081b906126c4565b6000805b600254811015610b515760028181548110610b0257610b0261270f565b6000918252602090912001546001600160a01b0390811690861603610b3f57838203610b3157915061071b9050565b81610b3b8161273b565b9250505b80610b498161273b565b915050610ae5565b5060405162461bcd60e51b815260040161081b906126c4565b6005546001600160a01b03163314610b945760405162461bcd60e51b815260040161081b9061263e565b4780610b9f57600080fd5b604051600090339047908381818185875af1925050503d8060008114610be1576040519150601f19603f3d011682016040523d82523d6000602084013e610be6565b606091505b5050905080610c285760405162461bcd60e51b815260206004820152600e60248201526d50455720504557205a4f494e4b2160901b604482015260640161081b565b5050565b826001600160a01b0381163314610c4657610c4633611a84565b61095a848484604051806020016040528060008152506116a0565b6002546000908210610cca5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161081b565b5090565b6005546001600160a01b03163314610cf85760405162461bcd60e51b815260040161081b9061263e565b8051610c2890600890602084019061219a565b600c8181548110610d1b57600080fd5b6000918252602090912001546001600160a01b0316905081565b60008060028381548110610d4b57610d4b61270f565b6000918252602090912001546001600160a01b031690508061071b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161081b565b600260065403610e135760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161081b565b60026006556000610e2360025490565b6001600160a01b0386166000908152600a6020526040812054919250908390600190835b6003811015610e9d57600c8181548110610e6357610e6361270f565b6000918252602090912001546001600160a01b03908116908b1603610e8b5760009250610e9d565b80610e958161273b565b915050610e47565b50811515600103610f2d57600a861115610ef15760405162461bcd60e51b8152602060048201526015602482015274544f4f204d414e5921205a4f494e4b205a4f494e4b60581b604482015260640161081b565b33600090815260096020526040902054600a90610f0f908890612754565b1115610f2d5760405162461bcd60e51b815260040161081b9061276c565b600754610100900460ff16610f765760405162461bcd60e51b815260206004820152600f60248201526e5045572050455721205a4f494e4b2160881b604482015260640161081b565b60005b878110156110bd57336001600160a01b038b16636352211e8b8b85818110610fa357610fa361270f565b905060200201356040518263ffffffff1660e01b8152600401610fc891815260200190565b602060405180830381865afa158015610fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110099190612795565b6001600160a01b0316146110535760405162461bcd60e51b81526020600482015260116024820152705a4f494e4b21204f574e5a5a5a5250542160781b604482015260640161081b565b6001600160a01b038a166000908152600b60205260408120908a8a8481811061107e5761107e61270f565b905060200201358152602001908152602001600020548261109f91906127b2565b6110a99086612754565b9450806110b58161273b565b915050610f79565b5060006110ca87866127b2565b10156110e85760405162461bcd60e51b815260040161081b9061276c565b611a0a6110f58787612754565b11156111395760405162461bcd60e51b81526020600482015260136024820152725a4f494e4b5321204f5645524c4f414445442160681b604482015260640161081b565b60005b8781101561130c576001600160a01b038a166000908152600b60205260408120908a8a8481811061116f5761116f61270f565b9050602002013581526020019081526020016000205482036111c85760405162461bcd60e51b81526020600482015260126024820152715a4f494e4b21204d4158584544204f55542160701b604482015260640161081b565b60008413156112fa576001600160a01b038a166000908152600b60205260408120818b8b858181106111fc576111fc61270f565b905060200201358152602001908152602001600020548361121d91906127c9565b9050600061122b82876127c9565b1315611298576001600160a01b038b166000908152600b6020526040812082918c8c8681811061125d5761125d61270f565b90506020020135815260200190815260200160002060008282546112819190612754565b90915550611291905081866127c9565b94506112f8565b6001600160a01b038b166000908152600b6020526040812086918c8c868181106112c4576112c461270f565b90506020020135815260200190815260200160002060008282546112e89190612754565b909155506000955061130c915050565b505b806113048161273b565b91505061113c565b50336000908152600960205260408120805488929061132c908490612754565b90915550600090505b86811015611362576113503361134b8389612754565b611deb565b8061135a8161273b565b915050611335565b505060016006555050505050505050565b6008805461138090612604565b80601f01602080910402602001604051908101604052809291908181526020018280546113ac90612604565b80156113f95780601f106113ce576101008083540402835291602001916113f9565b820191906000526020600020905b8154815290600101906020018083116113dc57829003601f168201915b505050505081565b60006001600160a01b03821661146c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161081b565b6000805b6002548110156114c8576002818154811061148d5761148d61270f565b6000918252602090912001546001600160a01b03908116908516036114b8576114b58261273b565b91505b6114c18161273b565b9050611470565b5092915050565b6005546001600160a01b031633146114f95760405162461bcd60e51b815260040161081b9061263e565b6115036000611f13565b565b6005546001600160a01b0316331461152f5760405162461bcd60e51b815260040161081b9061263e565b600061153a60025490565b9050611a0a6115498383612754565b11156115975760405162461bcd60e51b815260206004820152601860248201527f5a4f494e4b532120544f4f204d414e5920504557205045570000000000000000604482015260640161081b565b60005b8281101561095a576115b08461134b8385612754565b806115ba8161273b565b91505061159a565b60606001805461073090612604565b816115db81611a84565b336001600160a01b038416036116335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161081b565b3360008181526004602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b836001600160a01b03811633146116ba576116ba33611a84565b6116c43384611bab565b6116e05760405162461bcd60e51b815260040161081b90612673565b6116ec85858585611f65565b5050505050565b60606116fe82611a3a565b61174a5760405162461bcd60e51b815260206004820152601760248201527f5a4f494e4b5321204e4f5420434f4e5354525543544544000000000000000000604482015260640161081b565b600861175583611f98565b604051602001611766929190612824565b6040516020818303038152906040529050919050565b6002600654036117ce5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161081b565b600260065560006117de60025490565b60075490915060ff166118255760405162461bcd60e51b815260206004820152600f60248201526e5045572050455721205a4f494e4b2160881b604482015260640161081b565b60028211156118685760405162461bcd60e51b815260206004820152600f60248201526e5a4f494e4b5321205a5a5a5250542160881b604482015260640161081b565b33600090815260096020526040902054600290611886908490612754565b11156118a45760405162461bcd60e51b815260040161081b9061276c565b611a0a6118b18383612754565b11156118f55760405162461bcd60e51b81526020600482015260136024820152725a4f494e4b5321204f5645524c4f414445442160681b604482015260640161081b565b3360009081526009602052604081208054849290611914908490612754565b90915550600090505b82811015611945576119333361134b8385612754565b8061193d8161273b565b91505061191d565b5050600160065550565b6005546001600160a01b031633146119795760405162461bcd60e51b815260040161081b9061263e565b6001600160a01b0381166119de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081b565b6119e781611f13565b50565b60006001600160e01b031982166380ac58cd60e01b1480611a1b57506001600160e01b03198216635b5e139f60e01b145b8061071b57506301ffc9a760e01b6001600160e01b031983161461071b565b6002546000908210801561071b575060006001600160a01b031660028381548110611a6757611a6761270f565b6000918252602090912001546001600160a01b0316141592915050565b6daaeb6d7670e522a718067333cd4e3b156119e757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1591906128ca565b6119e757604051633b79c77360e21b81526001600160a01b038216600482015260240161081b565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b7282610d35565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bb682611a3a565b611c175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161081b565b6000611c2283610d35565b9050806001600160a01b0316846001600160a01b03161480611c5d5750836001600160a01b0316611c52846107b3565b6001600160a01b0316145b80611c8d57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ca882610d35565b6001600160a01b031614611d105760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161081b565b6001600160a01b038216611d725760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161081b565b611d7d600082611b3d565b8160028281548110611d9157611d9161270f565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6001600160a01b038216611e415760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161081b565b611e4a81611a3a565b15611e975760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161081b565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f70848484611c95565b611f7c84848484612099565b61095a5760405162461bcd60e51b815260040161081b906128e7565b606081600003611fbf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fe95780611fd38161273b565b9150611fe29050600a8361294f565b9150611fc3565b60008167ffffffffffffffff8111156120045761200461239a565b6040519080825280601f01601f19166020018201604052801561202e576020820181803683370190505b5090505b8415611c8d576120436001836127b2565b9150612050600a86612963565b61205b906030612754565b60f81b8183815181106120705761207061270f565b60200101906001600160f81b031916908160001a905350612092600a8661294f565b9450612032565b60006001600160a01b0384163b1561218f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120dd903390899088908890600401612977565b6020604051808303816000875af1925050508015612118575060408051601f3d908101601f19168201909252612115918101906129b4565b60015b612175573d808015612146576040519150601f19603f3d011682016040523d82523d6000602084013e61214b565b606091505b50805160000361216d5760405162461bcd60e51b815260040161081b906128e7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c8d565b506001949350505050565b8280546121a690612604565b90600052602060002090601f0160209004810192826121c8576000855561220e565b82601f106121e157805160ff191683800117855561220e565b8280016001018555821561220e579182015b8281111561220e5782518255916020019190600101906121f3565b50610cca9291505b80821115610cca5760008155600101612216565b6001600160e01b0319811681146119e757600080fd5b60006020828403121561225257600080fd5b813561225d8161222a565b9392505050565b60005b8381101561227f578181015183820152602001612267565b8381111561095a5750506000910152565b600081518084526122a8816020860160208601612264565b601f01601f19169290920160200192915050565b60208152600061225d6020830184612290565b6000602082840312156122e157600080fd5b5035919050565b6001600160a01b03811681146119e757600080fd5b6000806040838503121561231057600080fd5b823561231b816122e8565b946020939093013593505050565b6000806040838503121561233c57600080fd5b82359150602083013561234e816122e8565b809150509250929050565b60008060006060848603121561236e57600080fd5b8335612379816122e8565b92506020840135612389816122e8565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156123cb576123cb61239a565b604051601f8501601f19908116603f011681019082821181831017156123f3576123f361239a565b8160405280935085815286868601111561240c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561243857600080fd5b813567ffffffffffffffff81111561244f57600080fd5b8201601f8101841361246057600080fd5b611c8d848235602084016123b0565b60006020828403121561248157600080fd5b813561225d816122e8565b600080600080606085870312156124a257600080fd5b84356124ad816122e8565b9350602085013567ffffffffffffffff808211156124ca57600080fd5b818701915087601f8301126124de57600080fd5b8135818111156124ed57600080fd5b8860208260051b850101111561250257600080fd5b95986020929092019750949560400135945092505050565b80151581146119e757600080fd5b6000806040838503121561253b57600080fd5b8235612546816122e8565b9150602083013561234e8161251a565b6000806000806080858703121561256c57600080fd5b8435612577816122e8565b93506020850135612587816122e8565b925060408501359150606085013567ffffffffffffffff8111156125aa57600080fd5b8501601f810187136125bb57600080fd5b6125ca878235602084016123b0565b91505092959194509250565b600080604083850312156125e957600080fd5b82356125f4816122e8565b9150602083013561234e816122e8565b600181811c9082168061261857607f821691505b60208210810361263857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161274d5761274d612725565b5060010190565b6000821982111561276757612767612725565b500190565b6020808252600f908201526e5a4f494e4b5321204341505045442160881b604082015260600190565b6000602082840312156127a757600080fd5b815161225d816122e8565b6000828210156127c4576127c4612725565b500390565b60008083128015600160ff1b8501841216156127e7576127e7612725565b6001600160ff1b038401831381161561280257612802612725565b50500390565b6000815161281a818560208601612264565b9290920192915050565b600080845481600182811c91508083168061284057607f831692505b6020808410820361285f57634e487b7160e01b86526022600452602486fd5b8180156128735760018114612884576128b1565b60ff198616895284890196506128b1565b60008b81526020902060005b868110156128a95781548b820152908501908301612890565b505084890196505b5050505050506128c18185612808565b95945050505050565b6000602082840312156128dc57600080fd5b815161225d8161251a565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261295e5761295e612939565b500490565b60008261297257612972612939565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129aa90830184612290565b9695505050505050565b6000602082840312156129c657600080fd5b815161225d8161222a56fea2646970667358221220585528cc1e5444da25d2812746b12c53180b10d8f2d2afd44652356c17dc67b564736f6c634300080d0033

Deployed Bytecode Sourcemap

37744:5405:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33951:224;;;;;;;;;;-1:-1:-1;33951:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;33951:224:0;;;;;;;;37815:83;;;;;;;;;;-1:-1:-1;37815:83:0;;;;;;;;22366:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23219:308::-;;;;;;;;;;-1:-1:-1;23219:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;23219:308:0;1550:203:1;22701:452:0;;;;;;;;;;-1:-1:-1;22701:452:0;;;;;:::i;:::-;;:::i;:::-;;38247:83;;;;;;;;;;;;38326:4;38247:83;;;;;2360:25:1;;;2348:2;2333:18;38247:83:0;2214:177:1;39875:88:0;;;;;;;;;;;;;:::i;34251:110::-;;;;;;;;;;-1:-1:-1;34339:7:0;:14;34251:110;;39969:189;;;;;;;;;;-1:-1:-1;39969:189:0;;;;;:::i;:::-;;:::i;24334:411::-;;;;;;;;;;-1:-1:-1;24334:411:0;;;;;:::i;:::-;;:::i;39790:79::-;;;;;;;;;;;;;:::i;37903:86::-;;;;;;;;;;-1:-1:-1;37903:86:0;;;;;;;;;;;34727:490;;;;;;;;;;-1:-1:-1;34727:490:0;;;;;:::i;:::-;;:::i;39442:244::-;;;;;;;;;;;;;:::i;17922:143::-;;;;;;;;;;;;18022:42;17922:143;;24816:220;;;;;;;;;;-1:-1:-1;24816:220:0;;;;;:::i;:::-;;:::i;34438:205::-;;;;;;;;;;-1:-1:-1;34438:205:0;;;;;:::i;:::-;;:::i;39692:92::-;;;;;;;;;;-1:-1:-1;39692:92:0;;;;;:::i;:::-;;:::i;38597:87::-;;;;;;;;;;-1:-1:-1;38597:87:0;;;;;:::i;:::-;;:::i;38421:78::-;;;;;;;;;;-1:-1:-1;38421:78:0;;;;;:::i;:::-;;;;;;;;;;;;;;21973:326;;;;;;;;;;-1:-1:-1;21973:326:0;;;;;:::i;:::-;;:::i;40166:1950::-;;;;;;:::i;:::-;;:::i;37994:71::-;;;;;;;;;;;;;:::i;21519:392::-;;;;;;;;;;-1:-1:-1;21519:392:0;;;;;:::i;:::-;;:::i;36878:103::-;;;;;;;;;;;;;:::i;38154:88::-;;;;;;;;;;;;38240:2;38154:88;;42858:288;;;;;;;;;;-1:-1:-1;42858:288:0;;;;;:::i;:::-;;:::i;36227:87::-;;;;;;;;;;-1:-1:-1;36300:6:0;;-1:-1:-1;;;;;36300:6:0;36227:87;;22535:104;;;;;;;;;;;;;:::i;23599:383::-;;;;;;;;;;-1:-1:-1;23599:383:0;;;;;:::i;:::-;;:::i;38070:79::-;;;;;;;;;;;;38148:1;38070:79;;25107:400;;;;;;;;;;-1:-1:-1;25107:400:0;;;;;:::i;:::-;;:::i;38504:88::-;;;;;;;;;;-1:-1:-1;38504:88:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;42637:215;;;;;;;;;;-1:-1:-1;42637:215:0;;;;;:::i;:::-;;:::i;42122:509::-;;;;;;:::i;:::-;;:::i;38335:81::-;;;;;;;;;;-1:-1:-1;38335:81:0;;;;;:::i;:::-;;;;;;;;;;;;;;24053:214;;;;;;;;;;-1:-1:-1;24053:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;24224:25:0;;;24195:4;24224:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24053:214;37136:201;;;;;;;;;;-1:-1:-1;37136:201:0;;;;;:::i;:::-;;:::i;33951:224::-;34053:4;-1:-1:-1;;;;;;34077:50:0;;-1:-1:-1;;;34077:50:0;;:90;;;34131:36;34155:11;34131:23;:36::i;:::-;34070:97;33951:224;-1:-1:-1;;33951:224:0:o;22366:100::-;22420:13;22453:5;22446:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22366:100;:::o;23219:308::-;23340:7;23387:16;23395:7;23387;:16::i;:::-;23365:110;;;;-1:-1:-1;;;23365:110:0;;8006:2:1;23365:110:0;;;7988:21:1;8045:2;8025:18;;;8018:30;8084:34;8064:18;;;8057:62;-1:-1:-1;;;8135:18:1;;;8128:42;8187:19;;23365:110:0;;;;;;;;;-1:-1:-1;23495:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23495:24:0;;23219:308::o;22701:452::-;22808:2;19443:30;19464:8;19443:20;:30::i;:::-;22823:13:::1;22839:23;22854:7;22839:14;:23::i;:::-;22823:39;;22887:5;-1:-1:-1::0;;;;;22881:11:0::1;:2;-1:-1:-1::0;;;;;22881:11:0::1;::::0;22873:57:::1;;;::::0;-1:-1:-1;;;22873:57:0;;8419:2:1;22873:57:0::1;::::0;::::1;8401:21:1::0;8458:2;8438:18;;;8431:30;8497:34;8477:18;;;8470:62;-1:-1:-1;;;8548:18:1;;;8541:31;8589:19;;22873:57:0::1;8217:397:1::0;22873:57:0::1;738:10:::0;-1:-1:-1;;;;;22965:21:0;::::1;;::::0;:62:::1;;-1:-1:-1::0;22990:37:0::1;23007:5:::0;738:10;24053:214;:::i;22990:37::-:1;22943:168;;;::::0;-1:-1:-1;;;22943:168:0;;8821:2:1;22943:168:0::1;::::0;::::1;8803:21:1::0;8860:2;8840:18;;;8833:30;8899:34;8879:18;;;8872:62;8970:26;8950:18;;;8943:54;9014:19;;22943:168:0::1;8619:420:1::0;22943:168:0::1;23124:21;23133:2;23137:7;23124:8;:21::i;:::-;22812:341;22701:452:::0;;;:::o;39875:88::-;36300:6;;-1:-1:-1;;;;;36300:6:0;738:10;36447:23;36439:68;;;;-1:-1:-1;;;36439:68:0;;;;;;;:::i;:::-;39943:14:::1;::::0;;-1:-1:-1;;39925:32:0;::::1;39943:14;::::0;;;::::1;;;39942:15;39925:32:::0;;::::1;;::::0;;39875:88::o;39969:189::-;36300:6;;-1:-1:-1;;;;;36300:6:0;738:10;36447:23;36439:68;;;;-1:-1:-1;;;36439:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40064:29:0::1;;::::0;;;:14:::1;:29;::::0;;;;:38;;;;40109:23:::1;:43:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;40109:43:0::1;::::0;;::::1;::::0;;39969:189::o;24334:411::-;24486:4;-1:-1:-1;;;;;19263:18:0;;19271:10;19263:18;19259:83;;19298:32;19319:10;19298:20;:32::i;:::-;24578:41:::1;738:10:::0;24611:7:::1;24578:18;:41::i;:::-;24556:140;;;;-1:-1:-1::0;;;24556:140:0::1;;;;;;;:::i;:::-;24709:28;24719:4;24725:2;24729:7;24709:9;:28::i;39790:79::-:0;36300:6;;-1:-1:-1;;;;;36300:6:0;738:10;36447:23;36439:68;;;;-1:-1:-1;;;36439:68:0;;;;;;;:::i;:::-;39852:11:::1;::::0;;-1:-1:-1;;39837:26:0;::::1;39852:11;::::0;;::::1;39851:12;39837:26;::::0;;39790:79::o;34727:490::-;34824:15;34868:16;34878:5;34868:9;:16::i;:::-;34860:5;:24;34852:80;;;;-1:-1:-1;;;34852:80:0;;;;;;;:::i;:::-;34945:10;34970:6;34966:178;34982:7;:14;34978:18;;34966:178;;;35029:7;35037:1;35029:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35029:10:0;;;35020:19;;;;35017:116;;35071:5;35062;:14;35059:58;;35085:1;-1:-1:-1;35078:8:0;;-1:-1:-1;35078:8:0;35059:58;35110:7;;;;:::i;:::-;;;;35059:58;34998:3;;;;:::i;:::-;;;;34966:178;;;;35156:53;;-1:-1:-1;;;35156:53:0;;;;;;;:::i;39442:244::-;36300:6;;-1:-1:-1;;;;;36300:6:0;738:10;36447:23;36439:68;;;;-1:-1:-1;;;36439:68:0;;;;;;;:::i;:::-;39504:21:::1;39540:11:::0;39532:20:::1;;;::::0;::::1;;39585:49;::::0;39562:17:::1;::::0;39585:10:::1;::::0;39608:21:::1;::::0;39562:17;39585:49;39562:17;39585:49;39608:21;39585:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39561:73;;;39649:12;39641:39;;;::::0;-1:-1:-1;;;39641:39:0;;11051:2:1;39641:39:0::1;::::0;::::1;11033:21:1::0;11090:2;11070:18;;;11063:30;-1:-1:-1;;;11109:18:1;;;11102:44;11163:18;;39641:39:0::1;10849:338:1::0;39641:39:0::1;39479:207;;39442:244::o:0;24816:220::-;24972:4;-1:-1:-1;;;;;19263:18:0;;19271:10;19263:18;19259:83;;19298:32;19319:10;19298:20;:32::i;:::-;24989:39:::1;25006:4;25012:2;25016:7;24989:39;;;;;;;;;;;::::0;:16:::1;:39::i;34438:205::-:0;34549:7;:14;34513:7;;34541:22;;34533:79;;;;-1:-1:-1;;;34533:79:0;;11394:2:1;34533:79:0;;;11376:21:1;11433:2;11413:18;;;11406:30;11472:34;11452:18;;;11445:62;-1:-1:-1;;;11523:18:1;;;11516:42;11575:19;;34533:79:0;11192:408:1;34533:79:0;-1:-1:-1;34630:5:0;34438:205::o;39692:92::-;36300:6;;-1:-1:-1;;;;;36300:6:0;738:10;36447:23;36439:68;;;;-1:-1:-1;;;36439:68:0;;;;;;;:::i;:::-;39760:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;38597:87::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38597:87:0;;-1:-1:-1;38597:87:0;:::o;21973:326::-;22090:7;22115:13;22131:7;22139;22131:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;22131:16:0;;-1:-1:-1;22131:16:0;22158:110;;;;-1:-1:-1;;;22158:110:0;;11807:2:1;22158:110:0;;;11789:21:1;11846:2;11826:18;;;11819:30;11885:34;11865:18;;;11858:62;-1:-1:-1;;;11936:18:1;;;11929:39;11985:19;;22158:110:0;11605:405:1;40166:1950:0;2617:1;3215:7;;:19;3207:63;;;;-1:-1:-1;;;3207:63:0;;12217:2:1;3207:63:0;;;12199:21:1;12256:2;12236:18;;;12229:30;12295:33;12275:18;;;12268:61;12346:18;;3207:63:0;12015:355:1;3207:63:0;2617:1;3348:7;:18;40307:11:::1;40321:13;34339:7:::0;:14;;34251:110;40321:13:::1;-1:-1:-1::0;;;;;40463:28:0;::::1;40341:20;40463:28:::0;;;:14:::1;:28;::::0;;;;;40307:27;;-1:-1:-1;40341:20:0;40392:7;;40426:4:::1;::::0;40341:20;40498:150:::1;40519:1;40515;:5;40498:150;;;40557:23;40581:1;40557:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40557:26:0;;::::1;40541:42:::0;;::::1;::::0;40537:104:::1;;40610:5;40596:19;;40626:5;;40537:104;40522:4:::0;::::1;::::0;::::1;:::i;:::-;;;;40498:150;;;-1:-1:-1::0;40658:19:0;::::1;;40673:4;40658:19:::0;40654:205:::1;;38240:2;40696:7;:30;;40688:64;;;::::0;-1:-1:-1;;;40688:64:0;;12577:2:1;40688:64:0::1;::::0;::::1;12559:21:1::0;12616:2;12596:18;;;12589:30;-1:-1:-1;;;12635:18:1;;;12628:51;12696:18;;40688:64:0::1;12375:345:1::0;40688:64:0::1;40787:10;40769:29;::::0;;;:17:::1;:29;::::0;;;;;38240:2:::1;::::0;40769:39:::1;::::0;40801:7;;40769:39:::1;:::i;:::-;:62;;40761:90;;;;-1:-1:-1::0;;;40761:90:0::1;;;;;;;:::i;:::-;40873:14;::::0;::::1;::::0;::::1;;;40865:42;;;::::0;-1:-1:-1;;;40865:42:0;;13404:2:1;40865:42:0::1;::::0;::::1;13386:21:1::0;13443:2;13423:18;;;13416:30;-1:-1:-1;;;13462:18:1;;;13455:45;13517:18;;40865:42:0::1;13202:339:1::0;40865:42:0::1;40919:6;40914:262;40931:24:::0;;::::1;40914:262;;;41031:10;-1:-1:-1::0;;;;;40980:29:0;::::1;;41010:13:::0;;41024:1;41010:16;;::::1;;;;;:::i;:::-;;;;;;;40980:47;;;;;;;;;;;;;2360:25:1::0;;2348:2;2333:18;;2214:177;40980:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40980:61:0::1;;40972:91;;;::::0;-1:-1:-1;;;40972:91:0;;14004:2:1;40972:91:0::1;::::0;::::1;13986:21:1::0;14043:2;14023:18;;;14016:30;-1:-1:-1;;;14062:18:1;;;14055:47;14119:18;;40972:91:0::1;13802:341:1::0;40972:91:0::1;-1:-1:-1::0;;;;;41112:38:0;::::1;;::::0;;;:24:::1;:38;::::0;;;;;41151:13;;41165:1;41151:16;;::::1;;;;;:::i;:::-;;;;;;;41112:56;;;;;;;;;;;;41091:18;:77;;;;:::i;:::-;41072:96;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;40957:4:0;::::1;::::0;::::1;:::i;:::-;;;;40914:262;;;-1:-1:-1::0;41219:1:0::1;41190:25;41208:7:::0;41190:15;:25:::1;:::i;:::-;:30;;41182:58;;;;-1:-1:-1::0;;;41182:58:0::1;;;;;;;:::i;:::-;38326:4;41255:16;41264:7:::0;41255:6;:16:::1;:::i;:::-;:32;;41247:64;;;::::0;-1:-1:-1;;;41247:64:0;;14480:2:1;41247:64:0::1;::::0;::::1;14462:21:1::0;14519:2;14499:18;;;14492:30;-1:-1:-1;;;14538:18:1;;;14531:49;14597:18;;41247:64:0::1;14278:343:1::0;41247:64:0::1;41329:6;41324:652;41341:24:::0;;::::1;41324:652;;;-1:-1:-1::0;;;;;41412:38:0;::::1;;::::0;;;:24:::1;:38;::::0;;;;;41451:13;;41465:1;41451:16;;::::1;;;;;:::i;:::-;;;;;;;41412:56;;;;;;;;;;;;41390:18;:78:::0;41382:109:::1;;;::::0;-1:-1:-1;;;41382:109:0;;14828:2:1;41382:109:0::1;::::0;::::1;14810:21:1::0;14867:2;14847:18;;;14840:30;-1:-1:-1;;;14886:18:1;;;14879:48;14944:18;;41382:109:0::1;14626:342:1::0;41382:109:0::1;41520:1;41504:13;:17;41500:469;;;-1:-1:-1::0;;;;;41575:38:0;::::1;41534:8;41575:38:::0;;;:24:::1;:38;::::0;;;;41534:8;41614:13;;41628:1;41614:16;;::::1;;;;;:::i;:::-;;;;;;;41575:56;;;;;;;;;;;;41549:18;41545:87;;;;:::i;:::-;41534:98:::0;-1:-1:-1;41670:1:0::1;41647:20;41534:98:::0;41647:13;:20:::1;:::i;:::-;:24;41643:317;;;-1:-1:-1::0;;;;;41686:38:0;::::1;;::::0;;;:24:::1;:38;::::0;;;;41751:4;;41725:13;;41739:1;41725:16;;::::1;;;;;:::i;:::-;;;;;;;41686:56;;;;;;;;;;;;:70;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;41769:21:0::1;::::0;-1:-1:-1;41786:4:0;41769:21;::::1;:::i;:::-;;;41643:317;;;-1:-1:-1::0;;;;;41821:38:0;::::1;;::::0;;;:24:::1;:38;::::0;;;;41886:13;;41860;;41874:1;41860:16;;::::1;;;;;:::i;:::-;;;;;;;41821:56;;;;;;;;;;;;:79;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;41929:1:0::1;::::0;-1:-1:-1;41943:5:0::1;::::0;-1:-1:-1;;41943:5:0::1;41643:317;41523:446;41500:469;41367:4:::0;::::1;::::0;::::1;:::i;:::-;;;;41324:652;;;-1:-1:-1::0;42002:10:0::1;41984:29;::::0;;;:17:::1;:29;::::0;;;;:40;;42017:7;;41984:29;:40:::1;::::0;42017:7;;41984:40:::1;:::i;:::-;::::0;;;-1:-1:-1;42035:6:0::1;::::0;-1:-1:-1;42031:80:0::1;42051:7;42047:1;:11;42031:80;;;42074:29;42080:10;42092;42101:1:::0;42092:6;:10:::1;:::i;:::-;42074:5;:29::i;:::-;42060:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42031:80;;;-1:-1:-1::0;;2573:1:0;3527:7;:22;-1:-1:-1;;;;;;;;40166:1950:0:o;37994:71::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21519:392::-;21641:4;-1:-1:-1;;;;;21672:19:0;;21664:74;;;;-1:-1:-1;;;21664:74:0;;15447:2:1;21664:74:0;;;15429:21:1;15486:2;15466:18;;;15459:30;15525:34;15505:18;;;15498:62;-1:-1:-1;;;15576:18:1;;;15569:40;15626:19;;21664:74:0;15245:406:1;21664:74:0;21751:10;21777:6;21772:109;21789:7;:14;21785:18;;21772:109;;;21836:7;21844:1;21836:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21836:10:0;;;21827:19;;;;21823:46;;21862:7;;;:::i;:::-;;;21823:46;21805:3;;;:::i;:::-;;;21772:109;;;-1:-1:-1;21898:5:0;21519:392;-1:-1:-1;;21519:392:0:o;36878:103::-;36300:6;;-1:-1:-1;;;;;36300:6:0;738:10;36447:23;36439:68;;;;-1:-1:-1;;;36439:68:0;;;;;;;:::i;:::-;36943:30:::1;36970:1;36943:18;:30::i;:::-;36878:103::o:0;42858:288::-;36300:6;;-1:-1:-1;;;;;36300:6:0;738:10;36447:23;36439:68;;;;-1:-1:-1;;;36439:68:0;;;;;;;:::i;:::-;42939:14:::1;42956:13;34339:7:::0;:14;;34251:110;42956:13:::1;42939:30:::0;-1:-1:-1;38326:4:0::1;42984:24;42993:15:::0;42939:30;42984:24:::1;:::i;:::-;:40;;42976:77;;;::::0;-1:-1:-1;;;42976:77:0;;15858:2:1;42976:77:0::1;::::0;::::1;15840:21:1::0;15897:2;15877:18;;;15870:30;15936:26;15916:18;;;15909:54;15980:18;;42976:77:0::1;15656:348:1::0;42976:77:0::1;43065:9;43060:81;43080:15;43076:1;:19;43060:81;;;43111:22;43117:3:::0;43122:10:::1;43131:1:::0;43122:6;:10:::1;:::i;43111:22::-;43097:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43060:81;;22535:104:::0;22591:13;22624:7;22617:14;;;;;:::i;23599:383::-;23756:8;19443:30;19464:8;19443:20;:30::i;:::-;738:10;-1:-1:-1;;;;;23790:24:0;::::1;::::0;23782:62:::1;;;::::0;-1:-1:-1;;;23782:62:0;;16211:2:1;23782:62:0::1;::::0;::::1;16193:21:1::0;16250:2;16230:18;;;16223:30;16289:27;16269:18;;;16262:55;16334:18;;23782:62:0::1;16009:349:1::0;23782:62:0::1;738:10:::0;23857:32:::1;::::0;;;:18:::1;:32;::::0;;;;;;;-1:-1:-1;;;;;23857:42:0;::::1;::::0;;;;;;;;;;:53;;-1:-1:-1;;23857:53:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23926:48;;540:41:1;;;23857:42:0;;738:10;23926:48:::1;::::0;513:18:1;23926:48:0::1;;;;;;;23599:383:::0;;;:::o;25107:400::-;25292:4;-1:-1:-1;;;;;19263:18:0;;19271:10;19263:18;19259:83;;19298:32;19319:10;19298:20;:32::i;:::-;25331:41:::1;738:10:::0;25364:7:::1;25331:18;:41::i;:::-;25309:140;;;;-1:-1:-1::0;;;25309:140:0::1;;;;;;;:::i;:::-;25460:39;25474:4;25480:2;25484:7;25493:5;25460:13;:39::i;:::-;25107:400:::0;;;;;:::o;42637:215::-;42696:13;42726:17;42734:8;42726:7;:17::i;:::-;42718:53;;;;-1:-1:-1;;;42718:53:0;;16565:2:1;42718:53:0;;;16547:21:1;16604:2;16584:18;;;16577:30;16643:25;16623:18;;;16616:53;16686:18;;42718:53:0;16363:347:1;42718:53:0;42809:7;42818:26;42835:8;42818:16;:26::i;:::-;42792:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42778:68;;42637:215;;;:::o;42122:509::-;2617:1;3215:7;;:19;3207:63;;;;-1:-1:-1;;;3207:63:0;;12217:2:1;3207:63:0;;;12199:21:1;12256:2;12236:18;;;12229:30;12295:33;12275:18;;;12268:61;12346:18;;3207:63:0;12015:355:1;3207:63:0;2617:1;3348:7;:18;42196:11:::1;42210:13;34339:7:::0;:14;;34251:110;42210:13:::1;42238:11;::::0;42196:27;;-1:-1:-1;42238:11:0::1;;42230:39;;;::::0;-1:-1:-1;;;42230:39:0;;13404:2:1;42230:39:0::1;::::0;::::1;13386:21:1::0;13443:2;13423:18;;;13416:30;-1:-1:-1;;;13462:18:1;;;13455:45;13517:18;;42230:39:0::1;13202:339:1::0;42230:39:0::1;38148:1;42284:7;:22;;42276:50;;;::::0;-1:-1:-1;;;42276:50:0;;18412:2:1;42276:50:0::1;::::0;::::1;18394:21:1::0;18451:2;18431:18;;;18424:30;-1:-1:-1;;;18470:18:1;;;18463:45;18525:18;;42276:50:0::1;18210:339:1::0;42276:50:0::1;42359:10;42341:29;::::0;;;:17:::1;:29;::::0;;;;;38148:1:::1;::::0;42341:39:::1;::::0;42373:7;;42341:39:::1;:::i;:::-;:54;;42333:82;;;;-1:-1:-1::0;;;42333:82:0::1;;;;;;;:::i;:::-;38326:4;42430:16;42439:7:::0;42430:6;:16:::1;:::i;:::-;:32;;42422:64;;;::::0;-1:-1:-1;;;42422:64:0;;14480:2:1;42422:64:0::1;::::0;::::1;14462:21:1::0;14519:2;14499:18;;;14492:30;-1:-1:-1;;;14538:18:1;;;14531:49;14597:18;;42422:64:0::1;14278:343:1::0;42422:64:0::1;42517:10;42499:29;::::0;;;:17:::1;:29;::::0;;;;:40;;42532:7;;42499:29;:40:::1;::::0;42532:7;;42499:40:::1;:::i;:::-;::::0;;;-1:-1:-1;42550:6:0::1;::::0;-1:-1:-1;42546:80:0::1;42566:7;42562:1;:11;42546:80;;;42589:29;42595:10;42607;42616:1:::0;42607:6;:10:::1;:::i;42589:29::-;42575:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42546:80;;;-1:-1:-1::0;;2573:1:0;3527:7;:22;-1:-1:-1;42122:509:0:o;37136:201::-;36300:6;;-1:-1:-1;;;;;36300:6:0;738:10;36447:23;36439:68;;;;-1:-1:-1;;;36439:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37225:22:0;::::1;37217:73;;;::::0;-1:-1:-1;;;37217:73:0;;18756:2:1;37217:73:0::1;::::0;::::1;18738:21:1::0;18795:2;18775:18;;;18768:30;18834:34;18814:18;;;18807:62;-1:-1:-1;;;18885:18:1;;;18878:36;18931:19;;37217:73:0::1;18554:402:1::0;37217:73:0::1;37301:28;37320:8;37301:18;:28::i;:::-;37136:201:::0;:::o;21100:355::-;21247:4;-1:-1:-1;;;;;;21289:40:0;;-1:-1:-1;;;21289:40:0;;:105;;-1:-1:-1;;;;;;;21346:48:0;;-1:-1:-1;;;21346:48:0;21289:105;:158;;;-1:-1:-1;;;;;;;;;;12787:40:0;;;21411:36;12678:157;27054:155;27153:7;:14;27119:4;;27143:24;;:58;;;;;27199:1;-1:-1:-1;;;;;27171:30:0;:7;27179;27171:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27171:16:0;:30;;27136:65;27054:155;-1:-1:-1;;27054:155:0:o;19501:419::-;18022:42;19692:45;:49;19688:225;;19763:67;;-1:-1:-1;;;19763:67:0;;19814:4;19763:67;;;19173:34:1;-1:-1:-1;;;;;19243:15:1;;19223:18;;;19216:43;18022:42:0;;19763;;19108:18:1;;19763:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19758:144;;19858:28;;-1:-1:-1;;;19858:28:0;;-1:-1:-1;;;;;1714:32:1;;19858:28:0;;;1696:51:1;1669:18;;19858:28:0;1550:203:1;31079:174:0;31154:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31154:29:0;-1:-1:-1;;;;;31154:29:0;;;;;;;;:24;;31208:23;31154:24;31208:14;:23::i;:::-;-1:-1:-1;;;;;31199:46:0;;;;;;;;;;;31079:174;;:::o;27376:452::-;27505:4;27549:16;27557:7;27549;:16::i;:::-;27527:110;;;;-1:-1:-1;;;27527:110:0;;19722:2:1;27527:110:0;;;19704:21:1;19761:2;19741:18;;;19734:30;19800:34;19780:18;;;19773:62;-1:-1:-1;;;19851:18:1;;;19844:42;19903:19;;27527:110:0;19520:408:1;27527:110:0;27648:13;27664:23;27679:7;27664:14;:23::i;:::-;27648:39;;27717:5;-1:-1:-1;;;;;27706:16:0;:7;-1:-1:-1;;;;;27706:16:0;;:64;;;;27763:7;-1:-1:-1;;;;;27739:31:0;:20;27751:7;27739:11;:20::i;:::-;-1:-1:-1;;;;;27739:31:0;;27706:64;:113;;;-1:-1:-1;;;;;;24224:25:0;;;24195:4;24224:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27787:32;27698:122;27376:452;-1:-1:-1;;;;27376:452:0:o;30408:553::-;30581:4;-1:-1:-1;;;;;30554:31:0;:23;30569:7;30554:14;:23::i;:::-;-1:-1:-1;;;;;30554:31:0;;30532:122;;;;-1:-1:-1;;;30532:122:0;;20135:2:1;30532:122:0;;;20117:21:1;20174:2;20154:18;;;20147:30;20213:34;20193:18;;;20186:62;-1:-1:-1;;;20264:18:1;;;20257:39;20313:19;;30532:122:0;19933:405:1;30532:122:0;-1:-1:-1;;;;;30673:16:0;;30665:65;;;;-1:-1:-1;;;30665:65:0;;20545:2:1;30665:65:0;;;20527:21:1;20584:2;20564:18;;;20557:30;20623:34;20603:18;;;20596:62;-1:-1:-1;;;20674:18:1;;;20667:34;20718:19;;30665:65:0;20343:400:1;30665:65:0;30847:29;30864:1;30868:7;30847:8;:29::i;:::-;30906:2;30887:7;30895;30887:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;30887:21:0;-1:-1:-1;;;;;30887:21:0;;;;;;30926:27;;30945:7;;30926:27;;;;;;;;;;30887:16;30926:27;30408:553;;;:::o;29164:346::-;-1:-1:-1;;;;;29244:16:0;;29236:61;;;;-1:-1:-1;;;29236:61:0;;20950:2:1;29236:61:0;;;20932:21:1;;;20969:18;;;20962:30;21028:34;21008:18;;;21001:62;21080:18;;29236:61:0;20748:356:1;29236:61:0;29317:16;29325:7;29317;:16::i;:::-;29316:17;29308:58;;;;-1:-1:-1;;;29308:58:0;;21311:2:1;29308:58:0;;;21293:21:1;21350:2;21330:18;;;21323:30;21389;21369:18;;;21362:58;21437:18;;29308:58:0;21109:352:1;29308:58:0;29435:7;:16;;;;;;;-1:-1:-1;29435:16:0;;;;;;;-1:-1:-1;;;;;;29435:16:0;-1:-1:-1;;;;;29435:16:0;;;;;;;;29469:33;;29494:7;;-1:-1:-1;29469:33:0;;-1:-1:-1;;29469:33:0;29164:346;;:::o;37497:191::-;37590:6;;;-1:-1:-1;;;;;37607:17:0;;;-1:-1:-1;;;;;;37607:17:0;;;;;;;37640:40;;37590:6;;;37607:17;37590:6;;37640:40;;37571:16;;37640:40;37560:128;37497:191;:::o;26389:352::-;26546:28;26556:4;26562:2;26566:7;26546:9;:28::i;:::-;26607:48;26630:4;26636:2;26640:7;26649:5;26607:22;:48::i;:::-;26585:148;;;;-1:-1:-1;;;26585:148:0;;;;;;;:::i;13401:723::-;13457:13;13678:5;13687:1;13678:10;13674:53;;-1:-1:-1;;13705:10:0;;;;;;;;;;;;-1:-1:-1;;;13705:10:0;;;;;13401:723::o;13674:53::-;13752:5;13737:12;13793:78;13800:9;;13793:78;;13826:8;;;;:::i;:::-;;-1:-1:-1;13849:10:0;;-1:-1:-1;13857:2:0;13849:10;;:::i;:::-;;;13793:78;;;13881:19;13913:6;13903:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13903:17:0;;13881:39;;13931:154;13938:10;;13931:154;;13965:11;13975:1;13965:11;;:::i;:::-;;-1:-1:-1;14034:10:0;14042:2;14034:5;:10;:::i;:::-;14021:24;;:2;:24;:::i;:::-;14008:39;;13991:6;13998;13991:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13991:56:0;;;;;;;;-1:-1:-1;14062:11:0;14071:2;14062:11;;:::i;:::-;;;13931:154;;31818:980;31973:4;-1:-1:-1;;;;;31994:13:0;;13021:20;13069:8;31990:801;;32047:175;;-1:-1:-1;;;32047:175:0;;-1:-1:-1;;;;;32047:36:0;;;;;:175;;738:10;;32141:4;;32168:7;;32198:5;;32047:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32047:175:0;;;;;;;;-1:-1:-1;;32047:175:0;;;;;;;;;;;;:::i;:::-;;;32026:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32405:6;:13;32422:1;32405:18;32401:320;;32448:108;;-1:-1:-1;;;32448:108:0;;;;;;;:::i;32401:320::-;32671:6;32665:13;32656:6;32652:2;32648:15;32641:38;32026:710;-1:-1:-1;;;;;;32286:51:0;-1:-1:-1;;;32286:51:0;;-1:-1:-1;32279:58:0;;31990:801;-1:-1:-1;32775:4:0;31818:980;;;;;;:::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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;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:::-;2464:6;2472;2525:2;2513:9;2504:7;2500:23;2496:32;2493:52;;;2541:1;2538;2531:12;2493:52;2577:9;2564:23;2554:33;;2637:2;2626:9;2622:18;2609:32;2650:31;2675:5;2650:31;:::i;:::-;2700:5;2690:15;;;2396:315;;;;;:::o;2716:456::-;2793:6;2801;2809;2862:2;2850:9;2841:7;2837:23;2833:32;2830:52;;;2878:1;2875;2868:12;2830:52;2917:9;2904:23;2936:31;2961:5;2936:31;:::i;:::-;2986:5;-1:-1:-1;3043:2:1;3028:18;;3015:32;3056:33;3015:32;3056:33;:::i;:::-;2716:456;;3108:7;;-1:-1:-1;;;3162:2:1;3147:18;;;;3134:32;;2716:456::o;3416:127::-;3477:10;3472:3;3468:20;3465:1;3458:31;3508:4;3505:1;3498:15;3532:4;3529:1;3522:15;3548:632;3613:5;3643:18;3684:2;3676:6;3673:14;3670:40;;;3690:18;;:::i;:::-;3765:2;3759:9;3733:2;3819:15;;-1:-1:-1;;3815:24:1;;;3841:2;3811:33;3807:42;3795:55;;;3865:18;;;3885:22;;;3862:46;3859:72;;;3911:18;;:::i;:::-;3951:10;3947:2;3940:22;3980:6;3971:15;;4010:6;4002;3995:22;4050:3;4041:6;4036:3;4032:16;4029:25;4026:45;;;4067:1;4064;4057:12;4026:45;4117:6;4112:3;4105:4;4097:6;4093:17;4080:44;4172:1;4165:4;4156:6;4148;4144:19;4140:30;4133:41;;;;3548:632;;;;;:::o;4185:451::-;4254:6;4307:2;4295:9;4286:7;4282:23;4278:32;4275:52;;;4323:1;4320;4313:12;4275:52;4363:9;4350:23;4396:18;4388:6;4385:30;4382:50;;;4428:1;4425;4418:12;4382:50;4451:22;;4504:4;4496:13;;4492:27;-1:-1:-1;4482:55:1;;4533:1;4530;4523:12;4482:55;4556:74;4622:7;4617:2;4604:16;4599:2;4595;4591:11;4556:74;:::i;4641:247::-;4700:6;4753:2;4741:9;4732:7;4728:23;4724:32;4721:52;;;4769:1;4766;4759:12;4721:52;4808:9;4795:23;4827:31;4852:5;4827:31;:::i;4893:818::-;4997:6;5005;5013;5021;5074:2;5062:9;5053:7;5049:23;5045:32;5042:52;;;5090:1;5087;5080:12;5042:52;5129:9;5116:23;5148:31;5173:5;5148:31;:::i;:::-;5198:5;-1:-1:-1;5254:2:1;5239:18;;5226:32;5277:18;5307:14;;;5304:34;;;5334:1;5331;5324:12;5304:34;5372:6;5361:9;5357:22;5347:32;;5417:7;5410:4;5406:2;5402:13;5398:27;5388:55;;5439:1;5436;5429:12;5388:55;5479:2;5466:16;5505:2;5497:6;5494:14;5491:34;;;5521:1;5518;5511:12;5491:34;5574:7;5569:2;5559:6;5556:1;5552:14;5548:2;5544:23;5540:32;5537:45;5534:65;;;5595:1;5592;5585:12;5534:65;4893:818;;5626:2;5618:11;;;;;-1:-1:-1;5648:6:1;;5701:2;5686:18;5673:32;;-1:-1:-1;4893:818:1;-1:-1:-1;;;4893:818:1:o;5716:118::-;5802:5;5795:13;5788:21;5781:5;5778:32;5768:60;;5824:1;5821;5814:12;5839:382;5904:6;5912;5965:2;5953:9;5944:7;5940:23;5936:32;5933:52;;;5981:1;5978;5971:12;5933:52;6020:9;6007:23;6039:31;6064:5;6039:31;:::i;:::-;6089:5;-1:-1:-1;6146:2:1;6131:18;;6118:32;6159:30;6118:32;6159:30;:::i;6226:795::-;6321:6;6329;6337;6345;6398:3;6386:9;6377:7;6373:23;6369:33;6366:53;;;6415:1;6412;6405:12;6366:53;6454:9;6441:23;6473:31;6498:5;6473:31;:::i;:::-;6523:5;-1:-1:-1;6580:2:1;6565:18;;6552:32;6593:33;6552:32;6593:33;:::i;:::-;6645:7;-1:-1:-1;6699:2:1;6684:18;;6671:32;;-1:-1:-1;6754:2:1;6739:18;;6726:32;6781:18;6770:30;;6767:50;;;6813:1;6810;6803:12;6767:50;6836:22;;6889:4;6881:13;;6877:27;-1:-1:-1;6867:55:1;;6918:1;6915;6908:12;6867:55;6941:74;7007:7;7002:2;6989:16;6984:2;6980;6976:11;6941:74;:::i;:::-;6931:84;;;6226:795;;;;;;;:::o;7026:388::-;7094:6;7102;7155:2;7143:9;7134:7;7130:23;7126:32;7123:52;;;7171:1;7168;7161:12;7123:52;7210:9;7197:23;7229:31;7254:5;7229:31;:::i;:::-;7279:5;-1:-1:-1;7336:2:1;7321:18;;7308:32;7349:33;7308:32;7349:33;:::i;7419:380::-;7498:1;7494:12;;;;7541;;;7562:61;;7616:4;7608:6;7604:17;7594:27;;7562:61;7669:2;7661:6;7658:14;7638:18;7635:38;7632:161;;7715:10;7710:3;7706:20;7703:1;7696:31;7750:4;7747:1;7740:15;7778:4;7775:1;7768:15;7632:161;;7419:380;;;:::o;9044:356::-;9246:2;9228:21;;;9265:18;;;9258:30;9324:34;9319:2;9304:18;;9297:62;9391:2;9376:18;;9044:356::o;9405:413::-;9607:2;9589:21;;;9646:2;9626:18;;;9619:30;9685:34;9680:2;9665:18;;9658:62;-1:-1:-1;;;9751:2:1;9736:18;;9729:47;9808:3;9793:19;;9405:413::o;9823:407::-;10025:2;10007:21;;;10064:2;10044:18;;;10037:30;10103:34;10098:2;10083:18;;10076:62;-1:-1:-1;;;10169:2:1;10154:18;;10147:41;10220:3;10205:19;;9823:407::o;10235:127::-;10296:10;10291:3;10287:20;10284:1;10277:31;10327:4;10324:1;10317:15;10351:4;10348:1;10341:15;10367:127;10428:10;10423:3;10419:20;10416:1;10409:31;10459:4;10456:1;10449:15;10483:4;10480:1;10473:15;10499:135;10538:3;10559:17;;;10556:43;;10579:18;;:::i;:::-;-1:-1:-1;10626:1:1;10615:13;;10499:135::o;12725:128::-;12765:3;12796:1;12792:6;12789:1;12786:13;12783:39;;;12802:18;;:::i;:::-;-1:-1:-1;12838:9:1;;12725:128::o;12858:339::-;13060:2;13042:21;;;13099:2;13079:18;;;13072:30;-1:-1:-1;;;13133:2:1;13118:18;;13111:45;13188:2;13173:18;;12858:339::o;13546:251::-;13616:6;13669:2;13657:9;13648:7;13644:23;13640:32;13637:52;;;13685:1;13682;13675:12;13637:52;13717:9;13711:16;13736:31;13761:5;13736:31;:::i;14148:125::-;14188:4;14216:1;14213;14210:8;14207:34;;;14221:18;;:::i;:::-;-1:-1:-1;14258:9:1;;14148:125::o;14973:267::-;15012:4;15041:9;;;15066:10;;-1:-1:-1;;;15085:19:1;;15078:27;;15062:44;15059:70;;;15109:18;;:::i;:::-;-1:-1:-1;;;;;15156:27:1;;15149:35;;15141:44;;15138:70;;;15188:18;;:::i;:::-;-1:-1:-1;;15225:9:1;;14973:267::o;16841:185::-;16883:3;16921:5;16915:12;16936:52;16981:6;16976:3;16969:4;16962:5;16958:16;16936:52;:::i;:::-;17004:16;;;;;16841:185;-1:-1:-1;;16841:185:1:o;17031:1174::-;17207:3;17236:1;17269:6;17263:13;17299:3;17321:1;17349:9;17345:2;17341:18;17331:28;;17409:2;17398:9;17394:18;17431;17421:61;;17475:4;17467:6;17463:17;17453:27;;17421:61;17501:2;17549;17541:6;17538:14;17518:18;17515:38;17512:165;;-1:-1:-1;;;17576:33:1;;17632:4;17629:1;17622:15;17662:4;17583:3;17650:17;17512:165;17693:18;17720:104;;;;17838:1;17833:320;;;;17686:467;;17720:104;-1:-1:-1;;17753:24:1;;17741:37;;17798:16;;;;-1:-1:-1;17720:104:1;;17833:320;16788:1;16781:14;;;16825:4;16812:18;;17928:1;17942:165;17956:6;17953:1;17950:13;17942:165;;;18034:14;;18021:11;;;18014:35;18077:16;;;;17971:10;;17942:165;;;17946:3;;18136:6;18131:3;18127:16;18120:23;;17686:467;;;;;;;18169:30;18195:3;18187:6;18169:30;:::i;:::-;18162:37;17031:1174;-1:-1:-1;;;;;17031:1174:1:o;19270:245::-;19337:6;19390:2;19378:9;19369:7;19365:23;19361:32;19358:52;;;19406:1;19403;19396:12;19358:52;19438:9;19432:16;19457:28;19479:5;19457:28;:::i;21466:414::-;21668:2;21650:21;;;21707:2;21687:18;;;21680:30;21746:34;21741:2;21726:18;;21719:62;-1:-1:-1;;;21812:2:1;21797:18;;21790:48;21870:3;21855:19;;21466:414::o;21885:127::-;21946:10;21941:3;21937:20;21934:1;21927:31;21977:4;21974:1;21967:15;22001:4;21998:1;21991:15;22017:120;22057:1;22083;22073:35;;22088:18;;:::i;:::-;-1:-1:-1;22122:9:1;;22017:120::o;22142:112::-;22174:1;22200;22190:35;;22205:18;;:::i;:::-;-1:-1:-1;22239:9:1;;22142:112::o;22259:500::-;-1:-1:-1;;;;;22528:15:1;;;22510:34;;22580:15;;22575:2;22560:18;;22553:43;22627:2;22612:18;;22605:34;;;22675:3;22670:2;22655:18;;22648:31;;;22453:4;;22696:57;;22733:19;;22725:6;22696:57;:::i;:::-;22688:65;22259:500;-1:-1:-1;;;;;;22259:500:1:o;22764:249::-;22833:6;22886:2;22874:9;22865:7;22861:23;22857:32;22854:52;;;22902:1;22899;22892:12;22854:52;22934:9;22928:16;22953:30;22977:5;22953:30;:::i

Swarm Source

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