ETH Price: $2,605.48 (-2.70%)
Gas: 1 Gwei

Token

WizardsWitches (WnW)
 

Overview

Max Total Supply

442 WnW

Holders

105

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WnW
0x88eaedf0866d90383027b6f82b96a0555d90e3a5
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:
WizardsWitches

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-22
*/

// SPDX-License-Identifier: MIT
// File: contracts/Address.sol


pragma solidity ^0.8.6;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.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);

    /**
     * @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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

// File: contracts/ERC721.sol



pragma solidity ^0.8.7;








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

    // Mapping from token ID to owner address
    address[] internal _owners;
    // Mapping for custom creations
    address[] internal _customOwners;

    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;
        }
        for( uint i; i < _customOwners.length; ++i ){
            if(owner == _customOwners[i])
            ++count;
        }
        return count;
    }

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        if(tokenId > 8887){
            uint256 temp = tokenId - 8888;
            return temp < _customOwners.length && _customOwners[temp] != address(0);
        }
        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);
        if(tokenId > 8887)
            _customOwners.push(to);
        else
        _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);
        if(tokenId > 8887){
            _customOwners[tokenId-8888] = to;
        }
        else{
        _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 {}
}
// File: contracts/ERC721Enumerable.sol



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 + _customOwners.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        if(index > 8887){
            require(index - 8888 < _customOwners.length, "ERC721Enumerable: custom index out of bounds");
            return index; 
        }
        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) {
        if(index > 8887){
            uint256 temp = index-8888;
            require(temp < balanceOf(owner), "ERC721: custom index out of bounds");
            uint counter;
            for(uint i; i < _customOwners.length; i++){
                if(owner == _customOwners[i]){
                    if(counter == temp) return i;
                    else counter++;
                }
            }
        }
        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");
    }
    
}
// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/dreamers.sol



pragma solidity ^0.8.7;




contract WizardsWitches is ERC721Enumerable, ReentrancyGuard, Ownable {
    uint256 public maxTokens;  
    address public proxyRegistryAddress;
    string public baseURI;
    string public customURI;
    bool public devMintLocked;
    uint256 public devCreations;
    uint256 public constant devReserves = 200;
    uint256 public constant maxMintsPerTx = 6;
    uint256 public constant tokenPrice = 0.022 ether;


    event Minted(address indexed account, uint256 tokenId);

    mapping(address => bool) public projectProxy;


    constructor(
        string memory _baseURI,
        address _proxyRegistryAddress
        )
        ERC721("WizardsWitches", "WnW")
        {
            baseURI = _baseURI;
            proxyRegistryAddress = _proxyRegistryAddress;
        }
    
   //Set Base URI
    function setBaseURI(string memory _baseURI) 
        external 
        onlyOwner 
        {
            baseURI = _baseURI;
        }

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

    function setProxyRegistryAddress(address _proxyRegistryAddress)
        external
        onlyOwner
        {
            proxyRegistryAddress = _proxyRegistryAddress;
        }
    


    function isOwnerOf(address account, uint256[] calldata _tokenIds)
        external
        view
        returns (bool)
        {
            for(uint256 i; i < _tokenIds.length; ++i)
            {
                if(i > 8887){
                    if(_customOwners[_tokenIds[i-8888]] == account)
                    return true;
                }
                if(_owners[_tokenIds[i]] != account)
                    return false;
            }
            return true;
        }

    function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds)
        public 
        {
            for (uint256 i = 0; i < _tokenIds.length; i++)
            {
            transferFrom(_from, _to, _tokenIds[i]);
            }
        }

    function batchSafeTransferFrom(address _from, address _to, uint256[] memory _tokenIds, bytes memory data_)
        public
        {
            for (uint256 i = 0; i < _tokenIds.length; i++)
            {
            safeTransferFrom(_from, _to, _tokenIds[i], data_);
            }
        }

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

    // for custom creations
    function setCustomURI(string memory _customURI)
        external
        onlyOwner
        {
            customURI = _customURI;
        }
       
       //Cannot be turned back, tread carefully
    function lockDevMint()
        public
        onlyOwner
        {
        devMintLocked=true;
        }


   function togglePublicSale(uint256 _maxTokens)
        external
        onlyOwner
        {
            require(maxTokens == 0, "public sale has already begun!");
            maxTokens = _maxTokens;
        }
    
    function publicMint(uint256 count)
        public
        nonReentrant
        payable
        {
            uint256 totalSupply = _owners.length;

            require(totalSupply + count <= maxTokens - devCreations, "Pick a smaller number to summon, the contracts are almost fully filled!");
            require(count <= maxMintsPerTx, "You lack the power to summon more than 5 at a time!");
            require(count * tokenPrice == msg.value, "Your sacrifice is found lacking. Invalid funds provided.");
    
            for(uint i; i < count; i++)
            { 
                _mint(_msgSender(), totalSupply + i);
                emit Minted(_msgSender(), totalSupply + i);
            }
        }

    function burn(uint256 tokenId)
        public
        { 
            require(_isApprovedOrOwner(_msgSender(), tokenId), "Not approved to burn.");
            _burn(tokenId);
        }

//swap this to address, to
    function devCustomMint(uint256 specialId)
        external
        onlyOwner
        {
            require(!devMintLocked, "Dev mint is locked! Collection is final!");
            devCreations++;
            maxTokens++;
            _mint(_msgSender(), specialId);
            emit Minted(_msgSender(), specialId);
        }

    function collectDevReserves()
        external
        onlyOwner
        {
            require(_owners.length == 0, 'Reserves already taken.');
                devMintLocked = false;
                devCreations = 0;
                for(uint256 i; i < devReserves; i++)
                    _mint(_msgSender(), i);
        }

    
    function walletOfOwner(address _owner)
        public
        view 
        returns (uint256[] memory)
        {
            uint256 tokenCount = balanceOf(_owner);
                if (tokenCount == 0) return new uint256[](0);

            uint256[] memory tokensId = new uint256[](tokenCount);
                for (uint256 i; i < tokenCount; i++) 
                {
                    tokensId[i] = tokenOfOwnerByIndex(_owner, i);
                }
        return tokensId;
    }


    //Allow owner to withdraw eth
    function withdraw()
    public 
    nonReentrant
    onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

    function _mint(address to, uint256 tokenId)
        internal
        virtual
        override
        {
        if(tokenId > 8887){
            _customOwners.push(to);
        }
        else{
        _owners.push(to);
        }
        emit Transfer(address(0), to, tokenId);
        }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"batchSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectDevReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devCreations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"specialId","type":"uint256"}],"name":"devCustomMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devMintLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devReserves","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":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDevMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"string","name":"_customURI","type":"string"}],"name":"setCustomURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","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":"_maxTokens","type":"uint256"}],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200355738038062003557833981016040819052620000349162000200565b604080518082018252600e81526d57697a617264735769746368657360901b602080830191825283518085019094526003845262576e5760e81b90840152815191929162000085916000916200013d565b5080516200009b9060019060208401906200013d565b5050600160065550620000ae33620000eb565b8151620000c390600a9060208501906200013d565b50600980546001600160a01b0319166001600160a01b03929092169190911790555062000344565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014b90620002f1565b90600052602060002090601f0160209004810192826200016f5760008555620001ba565b82601f106200018a57805160ff1916838001178555620001ba565b82800160010185558215620001ba579182015b82811115620001ba5782518255916020019190600101906200019d565b50620001c8929150620001cc565b5090565b5b80821115620001c85760008155600101620001cd565b80516001600160a01b0381168114620001fb57600080fd5b919050565b600080604083850312156200021457600080fd5b82516001600160401b03808211156200022c57600080fd5b818501915085601f8301126200024157600080fd5b8151818111156200025657620002566200032e565b604051601f8201601f19908116603f011681019083821181831017156200028157620002816200032e565b816040528281526020935088848487010111156200029e57600080fd5b600091505b82821015620002c25784820184015181830185015290830190620002a3565b82821115620002d45760008484830101525b9550620002e6915050858201620001e3565b925050509250929050565b600181811c908216806200030657607f821691505b602082108114156200032857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61320380620003546000396000f3fe6080604052600436106102dc5760003560e01c80636c0360eb11610184578063b88d4fde116100d6578063d41593ba1161008a578063e985e9c511610064578063e985e9c5146107a1578063f2fde38b146107c1578063f3993d11146107e157600080fd5b8063d41593ba14610756578063dc30158b14610776578063e83157421461078b57600080fd5b8063c87b56dd116100bb578063c87b56dd146106f6578063cd7c032614610716578063d26ea6c01461073657600080fd5b8063b88d4fde146106b6578063c870c012146106d657600080fd5b80638cf7be7e11610138578063977b65e511610112578063977b65e5146106675780639a7c8e691461067c578063a22cb4651461069657600080fd5b80638cf7be7e146106145780638da5cb5b1461063457806395d89b411461065257600080fd5b8063715018a611610169578063715018a6146105ce578063792efa08146105e35780637ff9b596146105f957600080fd5b80636c0360eb1461059957806370a08231146105ae57600080fd5b806341c4c8031161023d5780634d44660c116101f15780635a4fee30116101cb5780635a4fee30146105295780635bab26e2146105495780636352211e1461057957600080fd5b80634d44660c146104c95780634f6ccce7146104e957806355f804b31461050957600080fd5b806342966c681161022257806342966c6814610467578063438b63001461048757806346e55746146104b457600080fd5b806341c4c8031461043257806342842e0e1461044757600080fd5b806318160ddd116102945780632db11544116102795780632db11544146103ea5780632f745c59146103fd5780633ccfd60b1461041d57600080fd5b806318160ddd146103a757806323b872dd146103ca57600080fd5b806306fdde03116102c557806306fdde031461032d578063081812fc1461034f578063095ea7b31461038757600080fd5b806301ffc9a7146102e157806306fd513314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc366004612de6565b610801565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610845565b005b34801561033957600080fd5b506103426108b3565b60405161030d919061300e565b34801561035b57600080fd5b5061036f61036a366004612e86565b610945565b6040516001600160a01b03909116815260200161030d565b34801561039357600080fd5b5061032b6103a2366004612dba565b6109cd565b3480156103b357600080fd5b506103bc610aff565b60405190815260200161030d565b3480156103d657600080fd5b5061032b6103e5366004612c5e565b610b16565b61032b6103f8366004612e86565b610b9e565b34801561040957600080fd5b506103bc610418366004612dba565b610e20565b34801561042957600080fd5b5061032b611068565b34801561043e57600080fd5b50610342611193565b34801561045357600080fd5b5061032b610462366004612c5e565b611221565b34801561047357600080fd5b5061032b610482366004612e86565b61123c565b34801561049357600080fd5b506104a76104a2366004612b1d565b61129d565b60405161030d9190612fca565b3480156104c057600080fd5b5061032b611356565b3480156104d557600080fd5b506103016104e4366004612cff565b611438565b3480156104f557600080fd5b506103bc610504366004612e86565b611529565b34801561051557600080fd5b5061032b610524366004612e3d565b611610565b34801561053557600080fd5b5061032b610544366004612bd5565b611681565b34801561055557600080fd5b50610301610564366004612b1d565b600e6020526000908152604090205460ff1681565b34801561058557600080fd5b5061036f610594366004612e86565b6116cb565b3480156105a557600080fd5b506103426117b9565b3480156105ba57600080fd5b506103bc6105c9366004612b1d565b6117c6565b3480156105da57600080fd5b5061032b611903565b3480156105ef57600080fd5b506103bc600d5481565b34801561060557600080fd5b506103bc664e28e2290f000081565b34801561062057600080fd5b5061032b61062f366004612e86565b611969565b34801561064057600080fd5b506007546001600160a01b031661036f565b34801561065e57600080fd5b50610342611a18565b34801561067357600080fd5b506103bc60c881565b34801561068857600080fd5b50600c546103019060ff1681565b3480156106a257600080fd5b5061032b6106b1366004612d87565b611a27565b3480156106c257600080fd5b5061032b6106d1366004612c9f565b611aec565b3480156106e257600080fd5b5061032b6106f1366004612e3d565b611b7a565b34801561070257600080fd5b50610342610711366004612e86565b611be7565b34801561072257600080fd5b5060095461036f906001600160a01b031681565b34801561074257600080fd5b5061032b610751366004612b1d565b611c85565b34801561076257600080fd5b5061032b610771366004612e86565b611d01565b34801561078257600080fd5b506103bc600681565b34801561079757600080fd5b506103bc60085481565b3480156107ad57600080fd5b506103016107bc366004612b3a565b611e40565b3480156107cd57600080fd5b5061032b6107dc366004612b1d565b611f29565b3480156107ed57600080fd5b5061032b6107fc366004612b73565b612008565b60006001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000148061083f575061083f8261204a565b92915050565b6007546001600160a01b031633146108a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600c805460ff19166001179055565b6060600080546108c2906130e0565b80601f01602080910402602001604051908101604052809291908181526020018280546108ee906130e0565b801561093b5780601f106109105761010080835404028352916020019161093b565b820191906000526020600020905b81548152906001019060200180831161091e57829003601f168201915b5050505050905090565b6000610950826120e5565b6109b15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161089b565b506000908152600460205260409020546001600160a01b031690565b60006109d8826116cb565b9050806001600160a01b0316836001600160a01b03161415610a625760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161089b565b336001600160a01b0382161480610a7e5750610a7e8133611e40565b610af05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161089b565b610afa8383612191565b505050565b600354600254600091610b1191613052565b905090565b610b21335b826121ff565b610b935760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161089b565b610afa8383836122c1565b60026006541415610bf15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161089b565b6002600681905554600d54600854610c09919061309d565b610c138383613052565b1115610cad5760405162461bcd60e51b815260206004820152604760248201527f5069636b206120736d616c6c6572206e756d62657220746f2073756d6d6f6e2c60448201527f2074686520636f6e7472616374732061726520616c6d6f73742066756c6c792060648201527f66696c6c65642100000000000000000000000000000000000000000000000000608482015260a40161089b565b6006821115610d245760405162461bcd60e51b815260206004820152603360248201527f596f75206c61636b2074686520706f77657220746f2073756d6d6f6e206d6f7260448201527f65207468616e203520617420612074696d652100000000000000000000000000606482015260840161089b565b34610d36664e28e2290f00008461307e565b14610da95760405162461bcd60e51b815260206004820152603860248201527f596f75722073616372696669636520697320666f756e64206c61636b696e672e60448201527f20496e76616c69642066756e64732070726f76696465642e0000000000000000606482015260840161089b565b60005b82811015610e1657610dc733610dc28385613052565b6124bb565b337f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe610df38385613052565b60405190815260200160405180910390a280610e0e8161311b565b915050610dac565b5050600160065550565b60006122b7821115610f2f576000610e3a6122b88461309d565b9050610e45846117c6565b8110610eb95760405162461bcd60e51b815260206004820152602260248201527f4552433732313a20637573746f6d20696e646578206f7574206f6620626f756e60448201527f6473000000000000000000000000000000000000000000000000000000000000606482015260840161089b565b6000805b600354811015610f2b5760038181548110610eda57610eda613176565b6000918252602090912001546001600160a01b0387811691161415610f195782821415610f0b57925061083f915050565b81610f158161311b565b9250505b80610f238161311b565b915050610ebd565b5050505b610f38836117c6565b8210610f9a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161089b565b6000805b60025481101561100b5760028181548110610fbb57610fbb613176565b6000918252602090912001546001600160a01b0386811691161415610ff95783821415610feb57915061083f9050565b81610ff58161311b565b9250505b806110038161311b565b915050610f9e565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161089b565b600260065414156110bb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161089b565b60026006556007546001600160a01b0316331461111a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600061112e6007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611178576040519150601f19603f3d011682016040523d82523d6000602084013e61117d565b606091505b505090508061118b57600080fd5b506001600655565b600b80546111a0906130e0565b80601f01602080910402602001604051908101604052809291908181526020018280546111cc906130e0565b80156112195780601f106111ee57610100808354040283529160200191611219565b820191906000526020600020905b8154815290600101906020018083116111fc57829003601f168201915b505050505081565b610afa83838360405180602001604052806000815250611aec565b61124533610b1b565b6112915760405162461bcd60e51b815260206004820152601560248201527f4e6f7420617070726f76656420746f206275726e2e0000000000000000000000604482015260640161089b565b61129a8161259d565b50565b606060006112aa836117c6565b9050806112cb5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112e6576112e661318c565b60405190808252806020026020018201604052801561130f578160200160208202803683370190505b50905060005b828110156112c3576113278582610e20565b82828151811061133957611339613176565b60209081029190910101528061134e8161311b565b915050611315565b6007546001600160a01b031633146113b05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600254156114005760405162461bcd60e51b815260206004820152601760248201527f526573657276657320616c72656164792074616b656e2e000000000000000000604482015260640161089b565b600c805460ff191690556000600d8190555b60c881101561129a57611426335b826124bb565b806114308161311b565b915050611412565b6000805b8281101561151c576122b78111156114b3576001600160a01b038516600385856114686122b88661309d565b81811061147757611477613176565b905060200201358154811061148e5761148e613176565b6000918252602090912001546001600160a01b031614156114b3576001915050611522565b846001600160a01b031660028585848181106114d1576114d1613176565b90506020020135815481106114e8576114e8613176565b6000918252602090912001546001600160a01b03161461150c576000915050611522565b6115158161311b565b905061143c565b50600190505b9392505050565b60006122b78211156115aa576003546115446122b88461309d565b106115a65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20637573746f6d20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161089b565b5090565b60025482106115a65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161089b565b6007546001600160a01b0316331461166a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b805161167d90600a90602084019061298f565b5050565b60005b82518110156116c4576116b285858584815181106116a4576116a4613176565b602002602001015185611aec565b806116bc8161311b565b915050611684565b5050505050565b6000806122b78311156117125760036116e66122b88561309d565b815481106116f6576116f6613176565b6000918252602090912001546001600160a01b0316905061173d565b6002838154811061172557611725613176565b6000918252602090912001546001600160a01b031690505b6001600160a01b03811661083f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161089b565b600a80546111a0906130e0565b60006001600160a01b0382166118445760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161089b565b6000805b6002548110156118a0576002818154811061186557611865613176565b6000918252602090912001546001600160a01b03858116911614156118905761188d8261311b565b91505b6118998161311b565b9050611848565b5060005b6003548110156118fc57600381815481106118c1576118c1613176565b6000918252602090912001546001600160a01b03858116911614156118ec576118e98261311b565b91505b6118f58161311b565b90506118a4565b5092915050565b6007546001600160a01b0316331461195d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b611967600061261f565b565b6007546001600160a01b031633146119c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b60085415611a135760405162461bcd60e51b815260206004820152601e60248201527f7075626c69632073616c652068617320616c726561647920626567756e210000604482015260640161089b565b600855565b6060600180546108c2906130e0565b6001600160a01b038216331415611a805760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161089b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611af633836121ff565b611b685760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161089b565b611b7484848484612671565b50505050565b6007546001600160a01b03163314611bd45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b805161167d90600b90602084019061298f565b6060611bf2826120e5565b611c3e5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000604482015260640161089b565b6122b7821115611c7a57600b611c53836126fa565b604051602001611c64929190612ee7565b6040516020818303038152906040529050919050565b600a611c53836126fa565b6007546001600160a01b03163314611cdf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611d5b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600c5460ff1615611dd45760405162461bcd60e51b815260206004820152602860248201527f446576206d696e74206973206c6f636b65642120436f6c6c656374696f6e206960448201527f732066696e616c21000000000000000000000000000000000000000000000000606482015260840161089b565b600d8054906000611de48361311b565b909155505060088054906000611df98361311b565b9190505550611e086114203390565b60405181815233907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe9060200160405180910390a250565b6009546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611ea657600080fd5b505afa158015611eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ede9190612e20565b6001600160a01b03161415611ef757600191505061083f565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6007546001600160a01b03163314611f835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b6001600160a01b038116611fff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161089b565b61129a8161261f565b60005b8151811015611b7457612038848484848151811061202b5761202b613176565b6020026020010151610b16565b806120428161311b565b91505061200b565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806120ad57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061083f57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461083f565b60006122b782111561214a5760006120ff6122b88461309d565b60035490915081108015611522575060006001600160a01b03166003828154811061212c5761212c613176565b6000918252602090912001546001600160a01b031614159392505050565b6002548210801561083f575060006001600160a01b03166002838154811061217457612174613176565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121c6826116cb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061220a826120e5565b61226b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161089b565b6000612276836116cb565b9050806001600160a01b0316846001600160a01b031614806122b15750836001600160a01b03166122a684610945565b6001600160a01b0316145b80611f215750611f218185611e40565b826001600160a01b03166122d4826116cb565b6001600160a01b0316146123505760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161089b565b6001600160a01b0382166123cb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161089b565b6123d6600082612191565b6122b7811115612432578160036123ef6122b88461309d565b815481106123ff576123ff613176565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612475565b816002828154811061244657612446613176565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122b781111561251557600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b038416179055612561565b600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0384161790555b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006125a8826116cb565b90506125b5600083612191565b6000600283815481106125ca576125ca613176565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61267c8484846122c1565b6126888484848461282c565b611b745760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089b565b60608161273a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612764578061274e8161311b565b915061275d9050600a8361306a565b915061273e565b60008167ffffffffffffffff81111561277f5761277f61318c565b6040519080825280601f01601f1916602001820160405280156127a9576020820181803683370190505b5090505b8415611f21576127be60018361309d565b91506127cb600a86613136565b6127d6906030613052565b60f81b8183815181106127eb576127eb613176565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612825600a8661306a565b94506127ad565b60006001600160a01b0384163b1561298457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612870903390899088908890600401612f8e565b602060405180830381600087803b15801561288a57600080fd5b505af19250505080156128ba575060408051601f3d908101601f191682019092526128b791810190612e03565b60015b61296a573d8080156128e8576040519150601f19603f3d011682016040523d82523d6000602084013e6128ed565b606091505b5080516129625760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f21565b506001949350505050565b82805461299b906130e0565b90600052602060002090601f0160209004810192826129bd5760008555612a03565b82601f106129d657805160ff1916838001178555612a03565b82800160010185558215612a03579182015b82811115612a035782518255916020019190600101906129e8565b506115a69291505b808211156115a65760008155600101612a0b565b600067ffffffffffffffff831115612a3957612a3961318c565b612a4c601f8401601f1916602001613021565b9050828152838383011115612a6057600080fd5b828260208301376000602084830101529392505050565b600082601f830112612a8857600080fd5b8135602067ffffffffffffffff821115612aa457612aa461318c565b8160051b612ab3828201613021565b838152828101908684018388018501891015612ace57600080fd5b600093505b85841015612af1578035835260019390930192918401918401612ad3565b50979650505050505050565b600082601f830112612b0e57600080fd5b61152283833560208501612a1f565b600060208284031215612b2f57600080fd5b8135611522816131a2565b60008060408385031215612b4d57600080fd5b8235612b58816131a2565b91506020830135612b68816131a2565b809150509250929050565b600080600060608486031215612b8857600080fd5b8335612b93816131a2565b92506020840135612ba3816131a2565b9150604084013567ffffffffffffffff811115612bbf57600080fd5b612bcb86828701612a77565b9150509250925092565b60008060008060808587031215612beb57600080fd5b8435612bf6816131a2565b93506020850135612c06816131a2565b9250604085013567ffffffffffffffff80821115612c2357600080fd5b612c2f88838901612a77565b93506060870135915080821115612c4557600080fd5b50612c5287828801612afd565b91505092959194509250565b600080600060608486031215612c7357600080fd5b8335612c7e816131a2565b92506020840135612c8e816131a2565b929592945050506040919091013590565b60008060008060808587031215612cb557600080fd5b8435612cc0816131a2565b93506020850135612cd0816131a2565b925060408501359150606085013567ffffffffffffffff811115612cf357600080fd5b612c5287828801612afd565b600080600060408486031215612d1457600080fd5b8335612d1f816131a2565b9250602084013567ffffffffffffffff80821115612d3c57600080fd5b818601915086601f830112612d5057600080fd5b813581811115612d5f57600080fd5b8760208260051b8501011115612d7457600080fd5b6020830194508093505050509250925092565b60008060408385031215612d9a57600080fd5b8235612da5816131a2565b915060208301358015158114612b6857600080fd5b60008060408385031215612dcd57600080fd5b8235612dd8816131a2565b946020939093013593505050565b600060208284031215612df857600080fd5b8135611522816131b7565b600060208284031215612e1557600080fd5b8151611522816131b7565b600060208284031215612e3257600080fd5b8151611522816131a2565b600060208284031215612e4f57600080fd5b813567ffffffffffffffff811115612e6657600080fd5b8201601f81018413612e7757600080fd5b611f2184823560208401612a1f565b600060208284031215612e9857600080fd5b5035919050565b60008151808452612eb78160208601602086016130b4565b601f01601f19169290920160200192915050565b60008151612edd8185602086016130b4565b9290920192915050565b600080845481600182811c915080831680612f0357607f831692505b6020808410821415612f2357634e487b7160e01b86526022600452602486fd5b818015612f375760018114612f4857612f75565b60ff19861689528489019650612f75565b60008b81526020902060005b86811015612f6d5781548b820152908501908301612f54565b505084890196505b505050505050612f858185612ecb565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc06080830184612e9f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561300257835183529284019291840191600101612fe6565b50909695505050505050565b6020815260006115226020830184612e9f565b604051601f8201601f1916810167ffffffffffffffff8111828210171561304a5761304a61318c565b604052919050565b600082198211156130655761306561314a565b500190565b60008261307957613079613160565b500490565b60008160001904831182151516156130985761309861314a565b500290565b6000828210156130af576130af61314a565b500390565b60005b838110156130cf5781810151838201526020016130b7565b83811115611b745750506000910152565b600181811c908216806130f457607f821691505b6020821081141561311557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561312f5761312f61314a565b5060010190565b60008261314557613145613160565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461129a57600080fd5b6001600160e01b03198116811461129a57600080fdfea264697066735822122038e8f87df5743e25f81c2e467cdc826dffaabaae6a4dcb80bf8bc9706891304d64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000001e525eeaf261ca41b809884cbde9dd9e1619573a000000000000000000000000000000000000000000000000000000000000005368747470733a2f2f647265616d65722e6d7970696e6174612e636c6f75642f697066732f516d574850476a615542766d74647936314173746f62334c44564452686e44574e6f664c58776361654441586d342f00000000000000000000000000

Deployed Bytecode

0x6080604052600436106102dc5760003560e01c80636c0360eb11610184578063b88d4fde116100d6578063d41593ba1161008a578063e985e9c511610064578063e985e9c5146107a1578063f2fde38b146107c1578063f3993d11146107e157600080fd5b8063d41593ba14610756578063dc30158b14610776578063e83157421461078b57600080fd5b8063c87b56dd116100bb578063c87b56dd146106f6578063cd7c032614610716578063d26ea6c01461073657600080fd5b8063b88d4fde146106b6578063c870c012146106d657600080fd5b80638cf7be7e11610138578063977b65e511610112578063977b65e5146106675780639a7c8e691461067c578063a22cb4651461069657600080fd5b80638cf7be7e146106145780638da5cb5b1461063457806395d89b411461065257600080fd5b8063715018a611610169578063715018a6146105ce578063792efa08146105e35780637ff9b596146105f957600080fd5b80636c0360eb1461059957806370a08231146105ae57600080fd5b806341c4c8031161023d5780634d44660c116101f15780635a4fee30116101cb5780635a4fee30146105295780635bab26e2146105495780636352211e1461057957600080fd5b80634d44660c146104c95780634f6ccce7146104e957806355f804b31461050957600080fd5b806342966c681161022257806342966c6814610467578063438b63001461048757806346e55746146104b457600080fd5b806341c4c8031461043257806342842e0e1461044757600080fd5b806318160ddd116102945780632db11544116102795780632db11544146103ea5780632f745c59146103fd5780633ccfd60b1461041d57600080fd5b806318160ddd146103a757806323b872dd146103ca57600080fd5b806306fdde03116102c557806306fdde031461032d578063081812fc1461034f578063095ea7b31461038757600080fd5b806301ffc9a7146102e157806306fd513314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc366004612de6565b610801565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610845565b005b34801561033957600080fd5b506103426108b3565b60405161030d919061300e565b34801561035b57600080fd5b5061036f61036a366004612e86565b610945565b6040516001600160a01b03909116815260200161030d565b34801561039357600080fd5b5061032b6103a2366004612dba565b6109cd565b3480156103b357600080fd5b506103bc610aff565b60405190815260200161030d565b3480156103d657600080fd5b5061032b6103e5366004612c5e565b610b16565b61032b6103f8366004612e86565b610b9e565b34801561040957600080fd5b506103bc610418366004612dba565b610e20565b34801561042957600080fd5b5061032b611068565b34801561043e57600080fd5b50610342611193565b34801561045357600080fd5b5061032b610462366004612c5e565b611221565b34801561047357600080fd5b5061032b610482366004612e86565b61123c565b34801561049357600080fd5b506104a76104a2366004612b1d565b61129d565b60405161030d9190612fca565b3480156104c057600080fd5b5061032b611356565b3480156104d557600080fd5b506103016104e4366004612cff565b611438565b3480156104f557600080fd5b506103bc610504366004612e86565b611529565b34801561051557600080fd5b5061032b610524366004612e3d565b611610565b34801561053557600080fd5b5061032b610544366004612bd5565b611681565b34801561055557600080fd5b50610301610564366004612b1d565b600e6020526000908152604090205460ff1681565b34801561058557600080fd5b5061036f610594366004612e86565b6116cb565b3480156105a557600080fd5b506103426117b9565b3480156105ba57600080fd5b506103bc6105c9366004612b1d565b6117c6565b3480156105da57600080fd5b5061032b611903565b3480156105ef57600080fd5b506103bc600d5481565b34801561060557600080fd5b506103bc664e28e2290f000081565b34801561062057600080fd5b5061032b61062f366004612e86565b611969565b34801561064057600080fd5b506007546001600160a01b031661036f565b34801561065e57600080fd5b50610342611a18565b34801561067357600080fd5b506103bc60c881565b34801561068857600080fd5b50600c546103019060ff1681565b3480156106a257600080fd5b5061032b6106b1366004612d87565b611a27565b3480156106c257600080fd5b5061032b6106d1366004612c9f565b611aec565b3480156106e257600080fd5b5061032b6106f1366004612e3d565b611b7a565b34801561070257600080fd5b50610342610711366004612e86565b611be7565b34801561072257600080fd5b5060095461036f906001600160a01b031681565b34801561074257600080fd5b5061032b610751366004612b1d565b611c85565b34801561076257600080fd5b5061032b610771366004612e86565b611d01565b34801561078257600080fd5b506103bc600681565b34801561079757600080fd5b506103bc60085481565b3480156107ad57600080fd5b506103016107bc366004612b3a565b611e40565b3480156107cd57600080fd5b5061032b6107dc366004612b1d565b611f29565b3480156107ed57600080fd5b5061032b6107fc366004612b73565b612008565b60006001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000148061083f575061083f8261204a565b92915050565b6007546001600160a01b031633146108a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600c805460ff19166001179055565b6060600080546108c2906130e0565b80601f01602080910402602001604051908101604052809291908181526020018280546108ee906130e0565b801561093b5780601f106109105761010080835404028352916020019161093b565b820191906000526020600020905b81548152906001019060200180831161091e57829003601f168201915b5050505050905090565b6000610950826120e5565b6109b15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161089b565b506000908152600460205260409020546001600160a01b031690565b60006109d8826116cb565b9050806001600160a01b0316836001600160a01b03161415610a625760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161089b565b336001600160a01b0382161480610a7e5750610a7e8133611e40565b610af05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161089b565b610afa8383612191565b505050565b600354600254600091610b1191613052565b905090565b610b21335b826121ff565b610b935760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161089b565b610afa8383836122c1565b60026006541415610bf15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161089b565b6002600681905554600d54600854610c09919061309d565b610c138383613052565b1115610cad5760405162461bcd60e51b815260206004820152604760248201527f5069636b206120736d616c6c6572206e756d62657220746f2073756d6d6f6e2c60448201527f2074686520636f6e7472616374732061726520616c6d6f73742066756c6c792060648201527f66696c6c65642100000000000000000000000000000000000000000000000000608482015260a40161089b565b6006821115610d245760405162461bcd60e51b815260206004820152603360248201527f596f75206c61636b2074686520706f77657220746f2073756d6d6f6e206d6f7260448201527f65207468616e203520617420612074696d652100000000000000000000000000606482015260840161089b565b34610d36664e28e2290f00008461307e565b14610da95760405162461bcd60e51b815260206004820152603860248201527f596f75722073616372696669636520697320666f756e64206c61636b696e672e60448201527f20496e76616c69642066756e64732070726f76696465642e0000000000000000606482015260840161089b565b60005b82811015610e1657610dc733610dc28385613052565b6124bb565b337f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe610df38385613052565b60405190815260200160405180910390a280610e0e8161311b565b915050610dac565b5050600160065550565b60006122b7821115610f2f576000610e3a6122b88461309d565b9050610e45846117c6565b8110610eb95760405162461bcd60e51b815260206004820152602260248201527f4552433732313a20637573746f6d20696e646578206f7574206f6620626f756e60448201527f6473000000000000000000000000000000000000000000000000000000000000606482015260840161089b565b6000805b600354811015610f2b5760038181548110610eda57610eda613176565b6000918252602090912001546001600160a01b0387811691161415610f195782821415610f0b57925061083f915050565b81610f158161311b565b9250505b80610f238161311b565b915050610ebd565b5050505b610f38836117c6565b8210610f9a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161089b565b6000805b60025481101561100b5760028181548110610fbb57610fbb613176565b6000918252602090912001546001600160a01b0386811691161415610ff95783821415610feb57915061083f9050565b81610ff58161311b565b9250505b806110038161311b565b915050610f9e565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161089b565b600260065414156110bb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161089b565b60026006556007546001600160a01b0316331461111a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600061112e6007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611178576040519150601f19603f3d011682016040523d82523d6000602084013e61117d565b606091505b505090508061118b57600080fd5b506001600655565b600b80546111a0906130e0565b80601f01602080910402602001604051908101604052809291908181526020018280546111cc906130e0565b80156112195780601f106111ee57610100808354040283529160200191611219565b820191906000526020600020905b8154815290600101906020018083116111fc57829003601f168201915b505050505081565b610afa83838360405180602001604052806000815250611aec565b61124533610b1b565b6112915760405162461bcd60e51b815260206004820152601560248201527f4e6f7420617070726f76656420746f206275726e2e0000000000000000000000604482015260640161089b565b61129a8161259d565b50565b606060006112aa836117c6565b9050806112cb5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112e6576112e661318c565b60405190808252806020026020018201604052801561130f578160200160208202803683370190505b50905060005b828110156112c3576113278582610e20565b82828151811061133957611339613176565b60209081029190910101528061134e8161311b565b915050611315565b6007546001600160a01b031633146113b05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600254156114005760405162461bcd60e51b815260206004820152601760248201527f526573657276657320616c72656164792074616b656e2e000000000000000000604482015260640161089b565b600c805460ff191690556000600d8190555b60c881101561129a57611426335b826124bb565b806114308161311b565b915050611412565b6000805b8281101561151c576122b78111156114b3576001600160a01b038516600385856114686122b88661309d565b81811061147757611477613176565b905060200201358154811061148e5761148e613176565b6000918252602090912001546001600160a01b031614156114b3576001915050611522565b846001600160a01b031660028585848181106114d1576114d1613176565b90506020020135815481106114e8576114e8613176565b6000918252602090912001546001600160a01b03161461150c576000915050611522565b6115158161311b565b905061143c565b50600190505b9392505050565b60006122b78211156115aa576003546115446122b88461309d565b106115a65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20637573746f6d20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161089b565b5090565b60025482106115a65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161089b565b6007546001600160a01b0316331461166a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b805161167d90600a90602084019061298f565b5050565b60005b82518110156116c4576116b285858584815181106116a4576116a4613176565b602002602001015185611aec565b806116bc8161311b565b915050611684565b5050505050565b6000806122b78311156117125760036116e66122b88561309d565b815481106116f6576116f6613176565b6000918252602090912001546001600160a01b0316905061173d565b6002838154811061172557611725613176565b6000918252602090912001546001600160a01b031690505b6001600160a01b03811661083f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161089b565b600a80546111a0906130e0565b60006001600160a01b0382166118445760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161089b565b6000805b6002548110156118a0576002818154811061186557611865613176565b6000918252602090912001546001600160a01b03858116911614156118905761188d8261311b565b91505b6118998161311b565b9050611848565b5060005b6003548110156118fc57600381815481106118c1576118c1613176565b6000918252602090912001546001600160a01b03858116911614156118ec576118e98261311b565b91505b6118f58161311b565b90506118a4565b5092915050565b6007546001600160a01b0316331461195d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b611967600061261f565b565b6007546001600160a01b031633146119c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b60085415611a135760405162461bcd60e51b815260206004820152601e60248201527f7075626c69632073616c652068617320616c726561647920626567756e210000604482015260640161089b565b600855565b6060600180546108c2906130e0565b6001600160a01b038216331415611a805760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161089b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611af633836121ff565b611b685760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161089b565b611b7484848484612671565b50505050565b6007546001600160a01b03163314611bd45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b805161167d90600b90602084019061298f565b6060611bf2826120e5565b611c3e5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000604482015260640161089b565b6122b7821115611c7a57600b611c53836126fa565b604051602001611c64929190612ee7565b6040516020818303038152906040529050919050565b600a611c53836126fa565b6007546001600160a01b03163314611cdf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611d5b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600c5460ff1615611dd45760405162461bcd60e51b815260206004820152602860248201527f446576206d696e74206973206c6f636b65642120436f6c6c656374696f6e206960448201527f732066696e616c21000000000000000000000000000000000000000000000000606482015260840161089b565b600d8054906000611de48361311b565b909155505060088054906000611df98361311b565b9190505550611e086114203390565b60405181815233907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe9060200160405180910390a250565b6009546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611ea657600080fd5b505afa158015611eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ede9190612e20565b6001600160a01b03161415611ef757600191505061083f565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6007546001600160a01b03163314611f835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b6001600160a01b038116611fff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161089b565b61129a8161261f565b60005b8151811015611b7457612038848484848151811061202b5761202b613176565b6020026020010151610b16565b806120428161311b565b91505061200b565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806120ad57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061083f57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461083f565b60006122b782111561214a5760006120ff6122b88461309d565b60035490915081108015611522575060006001600160a01b03166003828154811061212c5761212c613176565b6000918252602090912001546001600160a01b031614159392505050565b6002548210801561083f575060006001600160a01b03166002838154811061217457612174613176565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121c6826116cb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061220a826120e5565b61226b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161089b565b6000612276836116cb565b9050806001600160a01b0316846001600160a01b031614806122b15750836001600160a01b03166122a684610945565b6001600160a01b0316145b80611f215750611f218185611e40565b826001600160a01b03166122d4826116cb565b6001600160a01b0316146123505760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161089b565b6001600160a01b0382166123cb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161089b565b6123d6600082612191565b6122b7811115612432578160036123ef6122b88461309d565b815481106123ff576123ff613176565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612475565b816002828154811061244657612446613176565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122b781111561251557600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b038416179055612561565b600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0384161790555b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006125a8826116cb565b90506125b5600083612191565b6000600283815481106125ca576125ca613176565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61267c8484846122c1565b6126888484848461282c565b611b745760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089b565b60608161273a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612764578061274e8161311b565b915061275d9050600a8361306a565b915061273e565b60008167ffffffffffffffff81111561277f5761277f61318c565b6040519080825280601f01601f1916602001820160405280156127a9576020820181803683370190505b5090505b8415611f21576127be60018361309d565b91506127cb600a86613136565b6127d6906030613052565b60f81b8183815181106127eb576127eb613176565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612825600a8661306a565b94506127ad565b60006001600160a01b0384163b1561298457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612870903390899088908890600401612f8e565b602060405180830381600087803b15801561288a57600080fd5b505af19250505080156128ba575060408051601f3d908101601f191682019092526128b791810190612e03565b60015b61296a573d8080156128e8576040519150601f19603f3d011682016040523d82523d6000602084013e6128ed565b606091505b5080516129625760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f21565b506001949350505050565b82805461299b906130e0565b90600052602060002090601f0160209004810192826129bd5760008555612a03565b82601f106129d657805160ff1916838001178555612a03565b82800160010185558215612a03579182015b82811115612a035782518255916020019190600101906129e8565b506115a69291505b808211156115a65760008155600101612a0b565b600067ffffffffffffffff831115612a3957612a3961318c565b612a4c601f8401601f1916602001613021565b9050828152838383011115612a6057600080fd5b828260208301376000602084830101529392505050565b600082601f830112612a8857600080fd5b8135602067ffffffffffffffff821115612aa457612aa461318c565b8160051b612ab3828201613021565b838152828101908684018388018501891015612ace57600080fd5b600093505b85841015612af1578035835260019390930192918401918401612ad3565b50979650505050505050565b600082601f830112612b0e57600080fd5b61152283833560208501612a1f565b600060208284031215612b2f57600080fd5b8135611522816131a2565b60008060408385031215612b4d57600080fd5b8235612b58816131a2565b91506020830135612b68816131a2565b809150509250929050565b600080600060608486031215612b8857600080fd5b8335612b93816131a2565b92506020840135612ba3816131a2565b9150604084013567ffffffffffffffff811115612bbf57600080fd5b612bcb86828701612a77565b9150509250925092565b60008060008060808587031215612beb57600080fd5b8435612bf6816131a2565b93506020850135612c06816131a2565b9250604085013567ffffffffffffffff80821115612c2357600080fd5b612c2f88838901612a77565b93506060870135915080821115612c4557600080fd5b50612c5287828801612afd565b91505092959194509250565b600080600060608486031215612c7357600080fd5b8335612c7e816131a2565b92506020840135612c8e816131a2565b929592945050506040919091013590565b60008060008060808587031215612cb557600080fd5b8435612cc0816131a2565b93506020850135612cd0816131a2565b925060408501359150606085013567ffffffffffffffff811115612cf357600080fd5b612c5287828801612afd565b600080600060408486031215612d1457600080fd5b8335612d1f816131a2565b9250602084013567ffffffffffffffff80821115612d3c57600080fd5b818601915086601f830112612d5057600080fd5b813581811115612d5f57600080fd5b8760208260051b8501011115612d7457600080fd5b6020830194508093505050509250925092565b60008060408385031215612d9a57600080fd5b8235612da5816131a2565b915060208301358015158114612b6857600080fd5b60008060408385031215612dcd57600080fd5b8235612dd8816131a2565b946020939093013593505050565b600060208284031215612df857600080fd5b8135611522816131b7565b600060208284031215612e1557600080fd5b8151611522816131b7565b600060208284031215612e3257600080fd5b8151611522816131a2565b600060208284031215612e4f57600080fd5b813567ffffffffffffffff811115612e6657600080fd5b8201601f81018413612e7757600080fd5b611f2184823560208401612a1f565b600060208284031215612e9857600080fd5b5035919050565b60008151808452612eb78160208601602086016130b4565b601f01601f19169290920160200192915050565b60008151612edd8185602086016130b4565b9290920192915050565b600080845481600182811c915080831680612f0357607f831692505b6020808410821415612f2357634e487b7160e01b86526022600452602486fd5b818015612f375760018114612f4857612f75565b60ff19861689528489019650612f75565b60008b81526020902060005b86811015612f6d5781548b820152908501908301612f54565b505084890196505b505050505050612f858185612ecb565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc06080830184612e9f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561300257835183529284019291840191600101612fe6565b50909695505050505050565b6020815260006115226020830184612e9f565b604051601f8201601f1916810167ffffffffffffffff8111828210171561304a5761304a61318c565b604052919050565b600082198211156130655761306561314a565b500190565b60008261307957613079613160565b500490565b60008160001904831182151516156130985761309861314a565b500290565b6000828210156130af576130af61314a565b500390565b60005b838110156130cf5781810151838201526020016130b7565b83811115611b745750506000910152565b600181811c908216806130f457607f821691505b6020821081141561311557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561312f5761312f61314a565b5060010190565b60008261314557613145613160565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461129a57600080fd5b6001600160e01b03198116811461129a57600080fdfea264697066735822122038e8f87df5743e25f81c2e467cdc826dffaabaae6a4dcb80bf8bc9706891304d64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000001e525eeaf261ca41b809884cbde9dd9e1619573a000000000000000000000000000000000000000000000000000000000000005368747470733a2f2f647265616d65722e6d7970696e6174612e636c6f75642f697066732f516d574850476a615542766d74647936314173746f62334c44564452686e44574e6f664c58776361654441586d342f00000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://dreamer.mypinata.cloud/ipfs/QmWHPGjaUBvmtdy61Astob3LDVDRhnDWNofLXwcaeDAXm4/
Arg [1] : _proxyRegistryAddress (address): 0x1E525EEAF261cA41b809884CBDE9DD9E1619573A

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000001e525eeaf261ca41b809884cbde9dd9e1619573a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000053
Arg [3] : 68747470733a2f2f647265616d65722e6d7970696e6174612e636c6f75642f69
Arg [4] : 7066732f516d574850476a615542766d74647936314173746f62334c44564452
Arg [5] : 686e44574e6f664c58776361654441586d342f00000000000000000000000000


Deployed Bytecode Sourcemap

34527:6330:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30035:224;;;;;;;;;;-1:-1:-1;30035:224:0;;;;;:::i;:::-;;:::i;:::-;;;11004:14:1;;10997:22;10979:41;;10967:2;10952:18;30035:224:0;;;;;;;;37852:108;;;;;;;;;;;;;:::i;:::-;;18241:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;19053:308::-;;;;;;;;;;-1:-1:-1;19053:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9619:55:1;;;9601:74;;9589:2;9574:18;19053:308:0;9455:226:1;18576:411:0;;;;;;;;;;-1:-1:-1;18576:411:0;;;;;:::i;:::-;;:::i;30335:133::-;;;;;;;;;;;;;:::i;:::-;;;21795:25:1;;;21783:2;21768:18;30335:133:0;21649:177:1;20112:376:0;;;;;;;;;;-1:-1:-1;20112:376:0;;;;;:::i;:::-;;:::i;38194:720::-;;;;;;:::i;:::-;;:::i;31007:907::-;;;;;;;;;;-1:-1:-1;31007:907:0;;;;;:::i;:::-;;:::i;40373:176::-;;;;;;;;;;;;;:::i;34707:23::-;;;;;;;;;;;;;:::i;20559:185::-;;;;;;;;;;-1:-1:-1;20559:185:0;;;;;:::i;:::-;;:::i;38922:188::-;;;;;;;;;;-1:-1:-1;38922:188:0;;;;;:::i;:::-;;:::i;39833:495::-;;;;;;;;;;-1:-1:-1;39833:495:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39487:332::-;;;;;;;;;;;;;:::i;36117:496::-;;;;;;;;;;-1:-1:-1;36117:496:0;;;;;:::i;:::-;;:::i;30545:378::-;;;;;;;;;;-1:-1:-1;30545:378:0;;;;;:::i;:::-;;:::i;35357:138::-;;;;;;;;;;-1:-1:-1;35357:138:0;;;;;:::i;:::-;;:::i;36893:298::-;;;;;;;;;;-1:-1:-1;36893:298:0;;;;;:::i;:::-;;:::i;35021:44::-;;;;;;;;;;-1:-1:-1;35021:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17712:462;;;;;;;;;;-1:-1:-1;17712:462:0;;;;;:::i;:::-;;:::i;34679:21::-;;;;;;;;;;;;;:::i;17127:523::-;;;;;;;;;;-1:-1:-1;17127:523:0;;;;;:::i;:::-;;:::i;33638:103::-;;;;;;;;;;;;;:::i;34769:27::-;;;;;;;;;;;;;;;;34899:48;;;;;;;;;;;;34936:11;34899:48;;37969:213;;;;;;;;;;-1:-1:-1;37969:213:0;;;;;:::i;:::-;;:::i;32987:87::-;;;;;;;;;;-1:-1:-1;33060:6:0;;-1:-1:-1;;;;;33060:6:0;32987:87;;18410:104;;;;;;;;;;;;;:::i;34803:41::-;;;;;;;;;;;;34841:3;34803:41;;34737:25;;;;;;;;;;-1:-1:-1;34737:25:0;;;;;;;;19433:327;;;;;;;;;;-1:-1:-1;19433:327:0;;;;;:::i;:::-;;:::i;20815:365::-;;;;;;;;;;-1:-1:-1;20815:365:0;;;;;:::i;:::-;;:::i;37645:143::-;;;;;;;;;;-1:-1:-1;37645:143:0;;;;;:::i;:::-;;:::i;35503:409::-;;;;;;;;;;-1:-1:-1;35503:409:0;;;;;:::i;:::-;;:::i;34637:35::-;;;;;;;;;;-1:-1:-1;34637:35:0;;;;-1:-1:-1;;;;;34637:35:0;;;35920:181;;;;;;;;;;-1:-1:-1;35920:181:0;;;;;:::i;:::-;;:::i;39146:333::-;;;;;;;;;;-1:-1:-1;39146:333:0;;;;;:::i;:::-;;:::i;34851:41::-;;;;;;;;;;;;34891:1;34851:41;;34604:24;;;;;;;;;;;;;;;;37199:409;;;;;;;;;;-1:-1:-1;37199:409:0;;;;;:::i;:::-;;:::i;33896:201::-;;;;;;;;;;-1:-1:-1;33896:201:0;;;;;:::i;:::-;;:::i;36621:264::-;;;;;;;;;;-1:-1:-1;36621:264:0;;;;;:::i;:::-;;:::i;30035:224::-;30137:4;-1:-1:-1;;;;;;30161:50:0;;30176:35;30161:50;;:90;;;30215:36;30239:11;30215:23;:36::i;:::-;30154:97;30035:224;-1:-1:-1;;30035:224:0:o;37852:108::-;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;;;;;;;;;37930:13:::1;:18:::0;;-1:-1:-1;;37930:18:0::1;37944:4;37930:18;::::0;;37852:108::o;18241:100::-;18295:13;18328:5;18321:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18241:100;:::o;19053:308::-;19174:7;19221:16;19229:7;19221;:16::i;:::-;19199:110;;;;-1:-1:-1;;;19199:110:0;;16695:2:1;19199:110:0;;;16677:21:1;16734:2;16714:18;;;16707:30;16773:34;16753:18;;;16746:62;-1:-1:-1;;;16824:18:1;;;16817:42;16876:19;;19199:110:0;16493:408:1;19199:110:0;-1:-1:-1;19329:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;19329:24:0;;19053:308::o;18576:411::-;18657:13;18673:23;18688:7;18673:14;:23::i;:::-;18657:39;;18721:5;-1:-1:-1;;;;;18715:11:0;:2;-1:-1:-1;;;;;18715:11:0;;;18707:57;;;;-1:-1:-1;;;18707:57:0;;18229:2:1;18707:57:0;;;18211:21:1;18268:2;18248:18;;;18241:30;18307:34;18287:18;;;18280:62;18378:3;18358:18;;;18351:31;18399:19;;18707:57:0;18027:397:1;18707:57:0;15691:10;-1:-1:-1;;;;;18799:21:0;;;;:62;;-1:-1:-1;18824:37:0;18841:5;15691:10;37199:409;:::i;18824:37::-;18777:168;;;;-1:-1:-1;;;18777:168:0;;15099:2:1;18777:168:0;;;15081:21:1;15138:2;15118:18;;;15111:30;15177:34;15157:18;;;15150:62;15248:26;15228:18;;;15221:54;15292:19;;18777:168:0;14897:420:1;18777:168:0;18958:21;18967:2;18971:7;18958:8;:21::i;:::-;18646:341;18576:411;;:::o;30335:133::-;30440:13;:20;30423:7;:14;30396:7;;30423:37;;;:::i;:::-;30416:44;;30335:133;:::o;20112:376::-;20321:41;15691:10;20340:12;20354:7;20321:18;:41::i;:::-;20299:140;;;;-1:-1:-1;;;20299:140:0;;19463:2:1;20299:140:0;;;19445:21:1;19502:2;19482:18;;;19475:30;19541:34;19521:18;;;19514:62;19612:19;19592:18;;;19585:47;19649:19;;20299:140:0;19261:413:1;20299:140:0;20452:28;20462:4;20468:2;20472:7;20452:9;:28::i;38194:720::-;13985:1;14583:7;;:19;;14575:63;;;;-1:-1:-1;;;14575:63:0;;21078:2:1;14575:63:0;;;21060:21:1;21117:2;21097:18;;;21090:30;21156:33;21136:18;;;21129:61;21207:18;;14575:63:0;20876:355:1;14575:63:0;13985:1;14716:7;:18;;;38330:14;38404:12:::1;::::0;38392:9:::1;::::0;:24:::1;::::0;38404:12;38392:24:::1;:::i;:::-;38369:19;38383:5:::0;38369:11;:19:::1;:::i;:::-;:47;;38361:131;;;::::0;-1:-1:-1;;;38361:131:0;;18983:2:1;38361:131:0::1;::::0;::::1;18965:21:1::0;19022:2;19002:18;;;18995:30;19061:34;19041:18;;;19034:62;19132:34;19112:18;;;19105:62;19204:9;19183:19;;;19176:38;19231:19;;38361:131:0::1;18781:475:1::0;38361:131:0::1;34891:1;38515:5;:22;;38507:86;;;::::0;-1:-1:-1;;;38507:86:0;;11860:2:1;38507:86:0::1;::::0;::::1;11842:21:1::0;11899:2;11879:18;;;11872:30;11938:34;11918:18;;;11911:62;12009:21;11989:18;;;11982:49;12048:19;;38507:86:0::1;11658:415:1::0;38507:86:0::1;38638:9;38616:18;34936:11;38616:5:::0;:18:::1;:::i;:::-;:31;38608:100;;;::::0;-1:-1:-1;;;38608:100:0;;20653:2:1;38608:100:0::1;::::0;::::1;20635:21:1::0;20692:2;20672:18;;;20665:30;20731:34;20711:18;;;20704:62;20802:26;20782:18;;;20775:54;20846:19;;38608:100:0::1;20451:420:1::0;38608:100:0::1;38733:6;38729:174;38745:5;38741:1;:9;38729:174;;;38790:36;15691:10:::0;38810:15:::1;38824:1:::0;38810:11;:15:::1;:::i;:::-;38790:5;:36::i;:::-;15691:10:::0;38850:37:::1;38871:15;38885:1:::0;38871:11;:15:::1;:::i;:::-;38850:37;::::0;21795:25:1;;;21783:2;21768:18;38850:37:0::1;;;;;;;38752:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38729:174;;;-1:-1:-1::0;;13941:1:0;14895:7;:22;-1:-1:-1;38194:720:0:o;31007:907::-;31104:15;31143:4;31135:5;:12;31132:407;;;31163:12;31178:10;31184:4;31178:5;:10;:::i;:::-;31163:25;;31218:16;31228:5;31218:9;:16::i;:::-;31211:4;:23;31203:70;;;;-1:-1:-1;;;31203:70:0;;11457:2:1;31203:70:0;;;11439:21:1;11496:2;11476:18;;;11469:30;11535:34;11515:18;;;11508:62;11606:4;11586:18;;;11579:32;11628:19;;31203:70:0;11255:398:1;31203:70:0;31288:12;31319:6;31315:213;31331:13;:20;31327:24;;31315:213;;;31388:13;31402:1;31388:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;31379:25:0;;;31388:16;;31379:25;31376:137;;;31442:4;31431:7;:15;31428:65;;;31455:1;-1:-1:-1;31448:8:0;;-1:-1:-1;;31448:8:0;31428:65;31484:9;;;;:::i;:::-;;;;31428:65;31353:3;;;;:::i;:::-;;;;31315:213;;;;31148:391;;31132:407;31565:16;31575:5;31565:9;:16::i;:::-;31557:5;:24;31549:80;;;;-1:-1:-1;;;31549:80:0;;12689:2:1;31549:80:0;;;12671:21:1;12728:2;12708:18;;;12701:30;12767:34;12747:18;;;12740:62;-1:-1:-1;;;12818:18:1;;;12811:41;12869:19;;31549:80:0;12487:407:1;31549:80:0;31642:10;31667:6;31663:178;31679:7;:14;31675:18;;31663:178;;;31726:7;31734:1;31726:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;31717:19:0;;;31726:10;;31717:19;31714:116;;;31768:5;31759;:14;31756:58;;;31782:1;-1:-1:-1;31775:8:0;;-1:-1:-1;31775:8:0;31756:58;31807:7;;;;:::i;:::-;;;;31756:58;31695:3;;;;:::i;:::-;;;;31663:178;;;-1:-1:-1;31853:53:0;;-1:-1:-1;;;31853:53:0;;12689:2:1;31853:53:0;;;12671:21:1;12728:2;12708:18;;;12701:30;12767:34;12747:18;;;12740:62;-1:-1:-1;;;12818:18:1;;;12811:41;12869:19;;31853:53:0;12487:407:1;40373:176:0;13985:1;14583:7;;:19;;14575:63;;;;-1:-1:-1;;;14575:63:0;;21078:2:1;14575:63:0;;;21060:21:1;21117:2;21097:18;;;21090:30;21156:33;21136:18;;;21129:61;21207:18;;14575:63:0;20876:355:1;14575:63:0;13985:1;14716:7;:18;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23:::1;33199:68;;;::::0;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0::1;::::0;::::1;17090:21:1::0;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0::1;16906:356:1::0;33199:68:0::1;40451:7:::2;40472;33060:6:::0;;-1:-1:-1;;;;;33060:6:0;;32987:87;40472:7:::2;-1:-1:-1::0;;;;;40464:21:0::2;40493;40464:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40450:69;;;40538:2;40530:11;;;::::0;::::2;;-1:-1:-1::0;13941:1:0;14895:7;:22;40373:176::o;34707:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20559:185::-;20697:39;20714:4;20720:2;20724:7;20697:39;;;;;;;;;;;;:16;:39::i;38922:188::-;39002:41;15691:10;39021:12;15611:98;39002:41;38994:75;;;;-1:-1:-1;;;38994:75:0;;17879:2:1;38994:75:0;;;17861:21:1;17918:2;17898:18;;;17891:30;17957:23;17937:18;;;17930:51;17998:18;;38994:75:0;17677:345:1;38994:75:0;39084:14;39090:7;39084:5;:14::i;:::-;38922:188;:::o;39833:495::-;39921:16;39963:18;39984:17;39994:6;39984:9;:17::i;:::-;39963:38;-1:-1:-1;40024:15:0;40020:44;;40048:16;;;40062:1;40048:16;;;;;;;;;;;-1:-1:-1;40041:23:0;39833:495;-1:-1:-1;;;39833:495:0:o;40020:44::-;40081:25;40123:10;40109:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40109:25:0;;40081:53;;40158:9;40153:142;40173:10;40169:1;:14;40153:142;;;40245:30;40265:6;40273:1;40245:19;:30::i;:::-;40231:8;40240:1;40231:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;40185:3;;;;:::i;:::-;;;;40153:142;;39487:332;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;16906:356:1;33199:68:0;39586:7:::1;:14:::0;:19;39578:55:::1;;;::::0;-1:-1:-1;;;39578:55:0;;18631:2:1;39578:55:0::1;::::0;::::1;18613:21:1::0;18670:2;18650:18;;;18643:30;18709:25;18689:18;;;18682:53;18752:18;;39578:55:0::1;18429:347:1::0;39578:55:0::1;39652:13;:21:::0;;-1:-1:-1;;39652:21:0::1;::::0;;39668:5:::1;39692:12;:16:::0;;;39727:80:::1;34841:3;39742:1;:15;39727:80;;;39785:22;15691:10:::0;39791:12:::1;39805:1;39785:5;:22::i;:::-;39759:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39727:80;;36117:496:::0;36233:4;36267:9;36263:313;36278:20;;;36263:313;;;36344:4;36340:1;:8;36337:135;;;-1:-1:-1;;;;;36375:43:0;;:13;36389:9;;36399:6;36401:4;36399:1;:6;:::i;:::-;36389:17;;;;;;;:::i;:::-;;;;;;;36375:32;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36375:32:0;:43;36372:80;;;36448:4;36441:11;;;;;36372:80;36518:7;-1:-1:-1;;;;;36493:32:0;:7;36501:9;;36511:1;36501:12;;;;;;;:::i;:::-;;;;;;;36493:21;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36493:21:0;:32;36490:70;;36555:5;36548:12;;;;;36490:70;36300:3;;;:::i;:::-;;;36263:313;;;;36597:4;36590:11;;36117:496;;;;;;:::o;30545:378::-;30620:7;30651:4;30643:5;:12;30640:163;;;30694:13;:20;30679:12;30687:4;30679:5;:12;:::i;:::-;:35;30671:92;;;;-1:-1:-1;;;30671:92:0;;21438:2:1;30671:92:0;;;21420:21:1;21477:2;21457:18;;;21450:30;21516:34;21496:18;;;21489:62;-1:-1:-1;;;21567:18:1;;;21560:42;21619:19;;30671:92:0;21236:408:1;30671:92:0;-1:-1:-1;30785:5:0;30545:378::o;30640:163::-;30829:7;:14;30821:22;;30813:79;;;;-1:-1:-1;;;30813:79:0;;20240:2:1;30813:79:0;;;20222:21:1;20279:2;20259:18;;;20252:30;20318:34;20298:18;;;20291:62;-1:-1:-1;;;20369:18:1;;;20362:42;20421:19;;30813:79:0;20038:408:1;35357:138:0;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;16906:356:1;33199:68:0;35465:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;35357:138:::0;:::o;36893:298::-;37045:9;37040:140;37064:9;:16;37060:1;:20;37040:140;;;37115:49;37132:5;37139:3;37144:9;37154:1;37144:12;;;;;;;;:::i;:::-;;;;;;;37158:5;37115:16;:49::i;:::-;37082:3;;;;:::i;:::-;;;;37040:140;;;;36893:298;;;;:::o;17712:462::-;17829:7;17854:13;17891:4;17881:7;:14;17878:145;;;17919:13;17933:12;17941:4;17933:7;:12;:::i;:::-;17919:27;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17919:27:0;;-1:-1:-1;17878:145:0;;;17995:7;18003;17995:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17995:16:0;;-1:-1:-1;17878:145:0;-1:-1:-1;;;;;18055:19:0;;18033:110;;;;-1:-1:-1;;;18033:110:0;;15935:2:1;18033:110:0;;;15917:21:1;15974:2;15954:18;;;15947:30;16013:34;15993:18;;;15986:62;16084:11;16064:18;;;16057:39;16113:19;;18033:110:0;15733:405:1;34679:21:0;;;;;;;:::i;17127:523::-;17249:4;-1:-1:-1;;;;;17280:19:0;;17272:74;;;;-1:-1:-1;;;17272:74:0;;15524:2:1;17272:74:0;;;15506:21:1;15563:2;15543:18;;;15536:30;15602:34;15582:18;;;15575:62;15673:12;15653:18;;;15646:40;15703:19;;17272:74:0;15322:406:1;17272:74:0;17359:10;17385:6;17380:109;17397:7;:14;17393:18;;17380:109;;;17444:7;17452:1;17444:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17435:19:0;;;17444:10;;17435:19;17431:46;;;17470:7;;;:::i;:::-;;;17431:46;17413:3;;;:::i;:::-;;;17380:109;;;;17504:6;17499:121;17516:13;:20;17512:24;;17499:121;;;17570:13;17584:1;17570:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17561:25:0;;;17570:16;;17561:25;17558:50;;;17601:7;;;:::i;:::-;;;17558:50;17538:3;;;:::i;:::-;;;17499:121;;;-1:-1:-1;17637:5:0;17127:523;-1:-1:-1;;17127:523:0:o;33638:103::-;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;16906:356:1;33199:68:0;33703:30:::1;33730:1;33703:18;:30::i;:::-;33638:103::o:0;37969:213::-;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;16906:356:1;33199:68:0;38084:9:::1;::::0;:14;38076:57:::1;;;::::0;-1:-1:-1;;;38076:57:0;;19881:2:1;38076:57:0::1;::::0;::::1;19863:21:1::0;19920:2;19900:18;;;19893:30;19959:32;19939:18;;;19932:60;20009:18;;38076:57:0::1;19679:354:1::0;38076:57:0::1;38148:9;:22:::0;37969:213::o;18410:104::-;18466:13;18499:7;18492:14;;;;;:::i;19433:327::-;-1:-1:-1;;;;;19568:24:0;;15691:10;19568:24;;19560:62;;;;-1:-1:-1;;;19560:62:0;;14332:2:1;19560:62:0;;;14314:21:1;14371:2;14351:18;;;14344:30;14410:27;14390:18;;;14383:55;14455:18;;19560:62:0;14130:349:1;19560:62:0;15691:10;19635:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;19635:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;19635:53:0;;;;;;;;;;19704:48;;10979:41:1;;;19635:42:0;;15691:10;19704:48;;10952:18:1;19704:48:0;;;;;;;19433:327;;:::o;20815:365::-;21004:41;15691:10;21037:7;21004:18;:41::i;:::-;20982:140;;;;-1:-1:-1;;;20982:140:0;;19463:2:1;20982:140:0;;;19445:21:1;19502:2;19482:18;;;19475:30;19541:34;19521:18;;;19514:62;19612:19;19592:18;;;19585:47;19649:19;;20982:140:0;19261:413:1;20982:140:0;21133:39;21147:4;21153:2;21157:7;21166:5;21133:13;:39::i;:::-;20815:365;;;;:::o;37645:143::-;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;16906:356:1;33199:68:0;37754:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;35503:409::-:0;35605:13;35652:17;35660:8;35652:7;:17::i;:::-;35644:51;;;;-1:-1:-1;;;35644:51:0;;16345:2:1;35644:51:0;;;16327:21:1;16384:2;16364:18;;;16357:30;16423:23;16403:18;;;16396:51;16464:18;;35644:51:0;16143:345:1;35644:51:0;35724:4;35713:8;:15;35710:107;;;35778:9;35789:26;35806:8;35789:16;:26::i;:::-;35761:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35747:70;;35503:409;;;:::o;35710:107::-;35863:7;35872:26;35889:8;35872:16;:26::i;35920:181::-;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;16906:356:1;33199:68:0;36045:20:::1;:44:::0;;-1:-1:-1;;;;;;36045:44:0::1;-1:-1:-1::0;;;;;36045:44:0;;;::::1;::::0;;;::::1;::::0;;35920:181::o;39146:333::-;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;16906:356:1;33199:68:0;39258:13:::1;::::0;::::1;;39257:14;39249:67;;;::::0;-1:-1:-1;;;39249:67:0;;12280:2:1;39249:67:0::1;::::0;::::1;12262:21:1::0;12319:2;12299:18;;;12292:30;12358:34;12338:18;;;12331:62;12429:10;12409:18;;;12402:38;12457:19;;39249:67:0::1;12078:404:1::0;39249:67:0::1;39331:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;39360:9:0::1;:11:::0;;;:9:::1;:11;::::0;::::1;:::i;:::-;;;;;;39386:30;39392:12;15691:10:::0;;15611:98;39386:30:::1;39436:31;::::0;21795:25:1;;;15691:10:0;;39436:31:::1;::::0;21783:2:1;21768:18;39436:31:0::1;;;;;;;39146:333:::0;:::o;37199:409::-;37414:20;;37462:29;;;;;-1:-1:-1;;;;;9619:55:1;;;37462:29:0;;;9601:74:1;37326:4:0;;37414:20;;;37454:50;;;;37414:20;;37462:21;;9574:18:1;;37462:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37454:50:0;;37450:84;;;37530:4;37523:11;;;;;37450:84;-1:-1:-1;;;;;20002:25:0;;;19973:4;20002:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37556:40;37549:47;37199:409;-1:-1:-1;;;;37199:409:0:o;33896:201::-;33060:6;;-1:-1:-1;;;;;33060:6:0;15691:10;33207:23;33199:68;;;;-1:-1:-1;;;33199:68:0;;17108:2:1;33199:68:0;;;17090:21:1;;;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;17238:18;;33199:68:0;16906:356:1;33199:68:0;-1:-1:-1;;;;;33985:22:0;::::1;33977:73;;;::::0;-1:-1:-1;;;33977:73:0;;13520:2:1;33977:73:0::1;::::0;::::1;13502:21:1::0;13559:2;13539:18;;;13532:30;13598:34;13578:18;;;13571:62;13669:8;13649:18;;;13642:36;13695:19;;33977:73:0::1;13318:402:1::0;33977:73:0::1;34061:28;34080:8;34061:18;:28::i;36621:264::-:0;36750:9;36745:129;36769:9;:16;36765:1;:20;36745:129;;;36820:38;36833:5;36840:3;36845:9;36855:1;36845:12;;;;;;;;:::i;:::-;;;;;;;36820;:38::i;:::-;36787:3;;;;:::i;:::-;;;;36745:129;;16708:355;16855:4;-1:-1:-1;;;;;;16897:40:0;;16912:25;16897:40;;:105;;-1:-1:-1;;;;;;;16954:48:0;;16969:33;16954:48;16897:105;:158;;;-1:-1:-1;5378:25:0;-1:-1:-1;;;;;;5363:40:0;;;17019:36;5254:157;22727:325;22792:4;22822;22812:7;:14;22809:160;;;22842:12;22857:14;22867:4;22857:7;:14;:::i;:::-;22900:13;:20;22842:29;;-1:-1:-1;22893:27:0;;:64;;;;;22955:1;-1:-1:-1;;;;;22924:33:0;:13;22938:4;22924:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;22924:19:0;:33;;22886:71;22727:325;-1:-1:-1;;;22727:325:0:o;22809:160::-;22996:7;:14;22986:24;;:58;;;;;23042:1;-1:-1:-1;;;;;23014:30:0;:7;23022;23014:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23014:16:0;:30;;22979:65;22727:325;-1:-1:-1;;22727:325:0:o;27114:174::-;27189:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;27189:29:0;-1:-1:-1;;;;;27189:29:0;;;;;;;;:24;;27243:23;27189:24;27243:14;:23::i;:::-;-1:-1:-1;;;;;27234:46:0;;;;;;;;;;;27114:174;;:::o;23219:452::-;23348:4;23392:16;23400:7;23392;:16::i;:::-;23370:110;;;;-1:-1:-1;;;23370:110:0;;14686:2:1;23370:110:0;;;14668:21:1;14725:2;14705:18;;;14698:30;14764:34;14744:18;;;14737:62;-1:-1:-1;;;14815:18:1;;;14808:42;14867:19;;23370:110:0;14484:408:1;23370:110:0;23491:13;23507:23;23522:7;23507:14;:23::i;:::-;23491:39;;23560:5;-1:-1:-1;;;;;23549:16:0;:7;-1:-1:-1;;;;;23549:16:0;;:64;;;;23606:7;-1:-1:-1;;;;;23582:31:0;:20;23594:7;23582:11;:20::i;:::-;-1:-1:-1;;;;;23582:31:0;;23549:64;:113;;;;23630:32;23647:5;23654:7;23630:16;:32::i;26330:666::-;26503:4;-1:-1:-1;;;;;26476:31:0;:23;26491:7;26476:14;:23::i;:::-;-1:-1:-1;;;;;26476:31:0;;26454:122;;;;-1:-1:-1;;;26454:122:0;;17469:2:1;26454:122:0;;;17451:21:1;17508:2;17488:18;;;17481:30;17547:34;17527:18;;;17520:62;17618:11;17598:18;;;17591:39;17647:19;;26454:122:0;17267:405:1;26454:122:0;-1:-1:-1;;;;;26595:16:0;;26587:65;;;;-1:-1:-1;;;26587:65:0;;13927:2:1;26587:65:0;;;13909:21:1;13966:2;13946:18;;;13939:30;14005:34;13985:18;;;13978:62;14076:6;14056:18;;;14049:34;14100:19;;26587:65:0;13725:400:1;26587:65:0;26769:29;26786:1;26790:7;26769:8;:29::i;:::-;26822:4;26812:7;:14;26809:135;;;26872:2;26842:13;26856:12;26864:4;26856:7;:12;:::i;:::-;26842:27;;;;;;;;:::i;:::-;;;;;;;;;:32;;;;;-1:-1:-1;;;;;26842:32:0;;;;;-1:-1:-1;;;;;26842:32:0;;;;;;26809:135;;;26930:2;26911:7;26919;26911:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;-1:-1:-1;;;;;26911:21:0;;;;;-1:-1:-1;;;;;26911:21:0;;;;;;26809:135;26980:7;26976:2;-1:-1:-1;;;;;26961:27:0;26970:4;-1:-1:-1;;;;;26961:27:0;;;;;;;;;;;26330:666;;;:::o;40557:297::-;40687:4;40677:7;:14;40674:120;;;40707:13;:22;;;;;;;-1:-1:-1;40707:22:0;;;;;;;;-1:-1:-1;;;;;;40707:22:0;-1:-1:-1;;;;;40707:22:0;;;;;40674:120;;;40766:7;:16;;;;;;;-1:-1:-1;40766:16:0;;;;;;;;-1:-1:-1;;;;;;40766:16:0;-1:-1:-1;;;;;40766:16:0;;;;;40674:120;40809:33;;40834:7;;-1:-1:-1;;;;;40809:33:0;;;40826:1;;40809:33;;40826:1;;40809:33;40557:297;;:::o;25661:332::-;25721:13;25737:23;25752:7;25737:14;:23::i;:::-;25721:39;;25862:29;25879:1;25883:7;25862:8;:29::i;:::-;25929:1;25902:7;25910;25902:16;;;;;;;;:::i;:::-;;;;;;;;;:29;;-1:-1:-1;;;;;;25902:29:0;-1:-1:-1;;;;;25902:29:0;;;;;;25949:36;;25977:7;;25949:36;;;;;25902:16;;25949:36;25710:283;25661:332;:::o;34257:191::-;34350:6;;;-1:-1:-1;;;;;34367:17:0;;;-1:-1:-1;;;;;;34367:17:0;;;;;;;34400:40;;34350:6;;;34367:17;34350:6;;34400:40;;34331:16;;34400:40;34320:128;34257:191;:::o;22062:352::-;22219:28;22229:4;22235:2;22239:7;22219:9;:28::i;:::-;22280:48;22303:4;22309:2;22313:7;22322:5;22280:22;:48::i;:::-;22258:148;;;;-1:-1:-1;;;22258:148:0;;13101:2:1;22258:148:0;;;13083:21:1;13140:2;13120:18;;;13113:30;13179:34;13159:18;;;13152:62;13250:20;13230:18;;;13223:48;13288:19;;22258:148:0;12899:414:1;682:723:0;738:13;959:10;955:53;;-1:-1:-1;;986:10:0;;;;;;;;;;;;;;;;;;682:723::o;955:53::-;1033:5;1018:12;1074:78;1081:9;;1074:78;;1107:8;;;;:::i;:::-;;-1:-1:-1;1130:10:0;;-1:-1:-1;1138:2:0;1130:10;;:::i;:::-;;;1074:78;;;1162:19;1194:6;1184:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1184:17:0;;1162:39;;1212:154;1219:10;;1212:154;;1246:11;1256:1;1246:11;;:::i;:::-;;-1:-1:-1;1315:10:0;1323:2;1315:5;:10;:::i;:::-;1302:24;;:2;:24;:::i;:::-;1289:39;;1272:6;1279;1272:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1343:11:0;1352:2;1343:11;;:::i;:::-;;;1212:154;;27853:980;28008:4;-1:-1:-1;;;;;28029:13:0;;248:20;296:8;28025:801;;28082:175;;-1:-1:-1;;;28082:175:0;;-1:-1:-1;;;;;28082:36:0;;;;;:175;;15691:10;;28176:4;;28203:7;;28233:5;;28082:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28082:175:0;;;;;;;;-1:-1:-1;;28082:175:0;;;;;;;;;;;;:::i;:::-;;;28061:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28440:13:0;;28436:320;;28483:108;;-1:-1:-1;;;28483:108:0;;13101:2:1;28483:108:0;;;13083:21:1;13140:2;13120:18;;;13113:30;13179:34;13159:18;;;13152:62;13250:20;13230:18;;;13223:48;13288:19;;28483:108:0;12899:414:1;28436:320:0;28706:6;28700:13;28691:6;28687:2;28683:15;28676:38;28061:710;-1:-1:-1;;;;;;28321:51:0;-1:-1:-1;;;28321:51:0;;-1:-1:-1;28314:58:0;;28025:801;-1:-1:-1;28810:4:0;27853:980;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:723::-;479:5;532:3;525:4;517:6;513:17;509:27;499:55;;550:1;547;540:12;499:55;586:6;573:20;612:4;635:18;631:2;628:26;625:52;;;657:18;;:::i;:::-;703:2;700:1;696:10;726:28;750:2;746;742:11;726:28;:::i;:::-;788:15;;;819:12;;;;851:15;;;885;;;881:24;;878:33;-1:-1:-1;875:53:1;;;924:1;921;914:12;875:53;946:1;937:10;;956:163;970:2;967:1;964:9;956:163;;;1027:17;;1015:30;;988:1;981:9;;;;;1065:12;;;;1097;;956:163;;;-1:-1:-1;1137:5:1;425:723;-1:-1:-1;;;;;;;425:723:1:o;1153:220::-;1195:5;1248:3;1241:4;1233:6;1229:17;1225:27;1215:55;;1266:1;1263;1256:12;1215:55;1288:79;1363:3;1354:6;1341:20;1334:4;1326:6;1322:17;1288:79;:::i;1378:247::-;1437:6;1490:2;1478:9;1469:7;1465:23;1461:32;1458:52;;;1506:1;1503;1496:12;1458:52;1545:9;1532:23;1564:31;1589:5;1564:31;:::i;1630:388::-;1698:6;1706;1759:2;1747:9;1738:7;1734:23;1730:32;1727:52;;;1775:1;1772;1765:12;1727:52;1814:9;1801:23;1833:31;1858:5;1833:31;:::i;:::-;1883:5;-1:-1:-1;1940:2:1;1925:18;;1912:32;1953:33;1912:32;1953:33;:::i;:::-;2005:7;1995:17;;;1630:388;;;;;:::o;2023:624::-;2125:6;2133;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2249:9;2236:23;2268:31;2293:5;2268:31;:::i;:::-;2318:5;-1:-1:-1;2375:2:1;2360:18;;2347:32;2388:33;2347:32;2388:33;:::i;:::-;2440:7;-1:-1:-1;2498:2:1;2483:18;;2470:32;2525:18;2514:30;;2511:50;;;2557:1;2554;2547:12;2511:50;2580:61;2633:7;2624:6;2613:9;2609:22;2580:61;:::i;:::-;2570:71;;;2023:624;;;;;:::o;2652:844::-;2772:6;2780;2788;2796;2849:3;2837:9;2828:7;2824:23;2820:33;2817:53;;;2866:1;2863;2856:12;2817:53;2905:9;2892:23;2924:31;2949:5;2924:31;:::i;:::-;2974:5;-1:-1:-1;3031:2:1;3016:18;;3003:32;3044:33;3003:32;3044:33;:::i;:::-;3096:7;-1:-1:-1;3154:2:1;3139:18;;3126:32;3177:18;3207:14;;;3204:34;;;3234:1;3231;3224:12;3204:34;3257:61;3310:7;3301:6;3290:9;3286:22;3257:61;:::i;:::-;3247:71;;3371:2;3360:9;3356:18;3343:32;3327:48;;3400:2;3390:8;3387:16;3384:36;;;3416:1;3413;3406:12;3384:36;;3439:51;3482:7;3471:8;3460:9;3456:24;3439:51;:::i;:::-;3429:61;;;2652:844;;;;;;;:::o;3501:456::-;3578:6;3586;3594;3647:2;3635:9;3626:7;3622:23;3618:32;3615:52;;;3663:1;3660;3653:12;3615:52;3702:9;3689:23;3721:31;3746:5;3721:31;:::i;:::-;3771:5;-1:-1:-1;3828:2:1;3813:18;;3800:32;3841:33;3800:32;3841:33;:::i;:::-;3501:456;;3893:7;;-1:-1:-1;;;3947:2:1;3932:18;;;;3919:32;;3501:456::o;3962:665::-;4057:6;4065;4073;4081;4134:3;4122:9;4113:7;4109:23;4105:33;4102:53;;;4151:1;4148;4141:12;4102:53;4190:9;4177:23;4209:31;4234:5;4209:31;:::i;:::-;4259:5;-1:-1:-1;4316:2:1;4301:18;;4288:32;4329:33;4288:32;4329:33;:::i;:::-;4381:7;-1:-1:-1;4435:2:1;4420:18;;4407:32;;-1:-1:-1;4490:2:1;4475:18;;4462:32;4517:18;4506:30;;4503:50;;;4549:1;4546;4539:12;4503:50;4572:49;4613:7;4604:6;4593:9;4589:22;4572:49;:::i;4632:750::-;4727:6;4735;4743;4796:2;4784:9;4775:7;4771:23;4767:32;4764:52;;;4812:1;4809;4802:12;4764:52;4851:9;4838:23;4870:31;4895:5;4870:31;:::i;:::-;4920:5;-1:-1:-1;4976:2:1;4961:18;;4948:32;4999:18;5029:14;;;5026:34;;;5056:1;5053;5046:12;5026:34;5094:6;5083:9;5079:22;5069:32;;5139:7;5132:4;5128:2;5124:13;5120:27;5110:55;;5161:1;5158;5151:12;5110:55;5201:2;5188:16;5227:2;5219:6;5216:14;5213:34;;;5243:1;5240;5233:12;5213:34;5296:7;5291:2;5281:6;5278:1;5274:14;5270:2;5266:23;5262:32;5259:45;5256:65;;;5317:1;5314;5307:12;5256:65;5348:2;5344;5340:11;5330:21;;5370:6;5360:16;;;;;4632:750;;;;;:::o;5387:416::-;5452:6;5460;5513:2;5501:9;5492:7;5488:23;5484:32;5481:52;;;5529:1;5526;5519:12;5481:52;5568:9;5555:23;5587:31;5612:5;5587:31;:::i;:::-;5637:5;-1:-1:-1;5694:2:1;5679:18;;5666:32;5736:15;;5729:23;5717:36;;5707:64;;5767:1;5764;5757:12;5808:315;5876:6;5884;5937:2;5925:9;5916:7;5912:23;5908:32;5905:52;;;5953:1;5950;5943:12;5905:52;5992:9;5979:23;6011:31;6036:5;6011:31;:::i;:::-;6061:5;6113:2;6098:18;;;;6085:32;;-1:-1:-1;;;5808:315:1:o;6128:245::-;6186:6;6239:2;6227:9;6218:7;6214:23;6210:32;6207:52;;;6255:1;6252;6245:12;6207:52;6294:9;6281:23;6313:30;6337:5;6313:30;:::i;6378:249::-;6447:6;6500:2;6488:9;6479:7;6475:23;6471:32;6468:52;;;6516:1;6513;6506:12;6468:52;6548:9;6542:16;6567:30;6591:5;6567:30;:::i;6632:280::-;6731:6;6784:2;6772:9;6763:7;6759:23;6755:32;6752:52;;;6800:1;6797;6790:12;6752:52;6832:9;6826:16;6851:31;6876:5;6851:31;:::i;6917:450::-;6986:6;7039:2;7027:9;7018:7;7014:23;7010:32;7007:52;;;7055:1;7052;7045:12;7007:52;7095:9;7082:23;7128:18;7120:6;7117:30;7114:50;;;7160:1;7157;7150:12;7114:50;7183:22;;7236:4;7228:13;;7224:27;-1:-1:-1;7214:55:1;;7265:1;7262;7255:12;7214:55;7288:73;7353:7;7348:2;7335:16;7330:2;7326;7322:11;7288:73;:::i;7372:180::-;7431:6;7484:2;7472:9;7463:7;7459:23;7455:32;7452:52;;;7500:1;7497;7490:12;7452:52;-1:-1:-1;7523:23:1;;7372:180;-1:-1:-1;7372:180:1:o;7557:257::-;7598:3;7636:5;7630:12;7663:6;7658:3;7651:19;7679:63;7735:6;7728:4;7723:3;7719:14;7712:4;7705:5;7701:16;7679:63;:::i;:::-;7796:2;7775:15;-1:-1:-1;;7771:29:1;7762:39;;;;7803:4;7758:50;;7557:257;-1:-1:-1;;7557:257:1:o;7819:185::-;7861:3;7899:5;7893:12;7914:52;7959:6;7954:3;7947:4;7940:5;7936:16;7914:52;:::i;:::-;7982:16;;;;;7819:185;-1:-1:-1;;7819:185:1:o;8009:1231::-;8185:3;8214:1;8247:6;8241:13;8277:3;8299:1;8327:9;8323:2;8319:18;8309:28;;8387:2;8376:9;8372:18;8409;8399:61;;8453:4;8445:6;8441:17;8431:27;;8399:61;8479:2;8527;8519:6;8516:14;8496:18;8493:38;8490:222;;;-1:-1:-1;;;8561:3:1;8554:90;8667:4;8664:1;8657:15;8697:4;8692:3;8685:17;8490:222;8728:18;8755:104;;;;8873:1;8868:320;;;;8721:467;;8755:104;-1:-1:-1;;8788:24:1;;8776:37;;8833:16;;;;-1:-1:-1;8755:104:1;;8868:320;22184:1;22177:14;;;22221:4;22208:18;;8963:1;8977:165;8991:6;8988:1;8985:13;8977:165;;;9069:14;;9056:11;;;9049:35;9112:16;;;;9006:10;;8977:165;;;8981:3;;9171:6;9166:3;9162:16;9155:23;;8721:467;;;;;;;9204:30;9230:3;9222:6;9204:30;:::i;:::-;9197:37;8009:1231;-1:-1:-1;;;;;8009:1231:1:o;9686:511::-;9880:4;-1:-1:-1;;;;;9990:2:1;9982:6;9978:15;9967:9;9960:34;10042:2;10034:6;10030:15;10025:2;10014:9;10010:18;10003:43;;10082:6;10077:2;10066:9;10062:18;10055:34;10125:3;10120:2;10109:9;10105:18;10098:31;10146:45;10186:3;10175:9;10171:19;10163:6;10146:45;:::i;:::-;10138:53;9686:511;-1:-1:-1;;;;;;9686:511:1:o;10202:632::-;10373:2;10425:21;;;10495:13;;10398:18;;;10517:22;;;10344:4;;10373:2;10596:15;;;;10570:2;10555:18;;;10344:4;10639:169;10653:6;10650:1;10647:13;10639:169;;;10714:13;;10702:26;;10783:15;;;;10748:12;;;;10675:1;10668:9;10639:169;;;-1:-1:-1;10825:3:1;;10202:632;-1:-1:-1;;;;;;10202:632:1:o;11031:219::-;11180:2;11169:9;11162:21;11143:4;11200:44;11240:2;11229:9;11225:18;11217:6;11200:44;:::i;21831:275::-;21902:2;21896:9;21967:2;21948:13;;-1:-1:-1;;21944:27:1;21932:40;;22002:18;21987:34;;22023:22;;;21984:62;21981:88;;;22049:18;;:::i;:::-;22085:2;22078:22;21831:275;;-1:-1:-1;21831:275:1:o;22237:128::-;22277:3;22308:1;22304:6;22301:1;22298:13;22295:39;;;22314:18;;:::i;:::-;-1:-1:-1;22350:9:1;;22237:128::o;22370:120::-;22410:1;22436;22426:35;;22441:18;;:::i;:::-;-1:-1:-1;22475:9:1;;22370:120::o;22495:168::-;22535:7;22601:1;22597;22593:6;22589:14;22586:1;22583:21;22578:1;22571:9;22564:17;22560:45;22557:71;;;22608:18;;:::i;:::-;-1:-1:-1;22648:9:1;;22495:168::o;22668:125::-;22708:4;22736:1;22733;22730:8;22727:34;;;22741:18;;:::i;:::-;-1:-1:-1;22778:9:1;;22668:125::o;22798:258::-;22870:1;22880:113;22894:6;22891:1;22888:13;22880:113;;;22970:11;;;22964:18;22951:11;;;22944:39;22916:2;22909:10;22880:113;;;23011:6;23008:1;23005:13;23002:48;;;-1:-1:-1;;23046:1:1;23028:16;;23021:27;22798:258::o;23061:437::-;23140:1;23136:12;;;;23183;;;23204:61;;23258:4;23250:6;23246:17;23236:27;;23204:61;23311:2;23303:6;23300:14;23280:18;23277:38;23274:218;;;-1:-1:-1;;;23345:1:1;23338:88;23449:4;23446:1;23439:15;23477:4;23474:1;23467:15;23274:218;;23061:437;;;:::o;23503:135::-;23542:3;-1:-1:-1;;23563:17:1;;23560:43;;;23583:18;;:::i;:::-;-1:-1:-1;23630:1:1;23619:13;;23503:135::o;23643:112::-;23675:1;23701;23691:35;;23706:18;;:::i;:::-;-1:-1:-1;23740:9:1;;23643:112::o;23760:184::-;-1:-1:-1;;;23809:1:1;23802:88;23909:4;23906:1;23899:15;23933:4;23930:1;23923:15;23949:184;-1:-1:-1;;;23998:1:1;23991:88;24098:4;24095:1;24088:15;24122:4;24119:1;24112:15;24138:184;-1:-1:-1;;;24187:1:1;24180:88;24287:4;24284:1;24277:15;24311:4;24308:1;24301:15;24327:184;-1:-1:-1;;;24376:1:1;24369:88;24476:4;24473:1;24466:15;24500:4;24497:1;24490:15;24516:154;-1:-1:-1;;;;;24595:5:1;24591:54;24584:5;24581:65;24571:93;;24660:1;24657;24650:12;24675:177;-1:-1:-1;;;;;;24753:5:1;24749:78;24742:5;24739:89;24729:117;;24842:1;24839;24832:12

Swarm Source

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