ETH Price: $2,695.34 (+4.95%)
Gas: 2 Gwei

Token

AnonymiceBreedingPuzzle (BABYMICEPUZZLE)
 

Overview

Max Total Supply

10 BABYMICEPUZZLE

Holders

9

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BABYMICEPUZZLE
0x9634445e293a87ab77ca3cf5b43da94aabc544b6
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:
AnonymiceBreedingPuzzle

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 2 of 14 : ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    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 (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _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);

        _balances[to] += 1;
        _owners[tokenId] = 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);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        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);

        _balances[from] -= 1;
        _balances[to] += 1;
        _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 3 of 14 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @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 4 of 14 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 5 of 14 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @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.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @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-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 6 of 14 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 7 of 14 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @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 8 of 14 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 14 : Context.sol
// SPDX-License-Identifier: MIT

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 10 of 14 : Strings.sol
// SPDX-License-Identifier: MIT

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 11 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 12 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT

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 13 of 14 : AnonymiceBreedingPuzzle.sol
// contracts/AnonymiceBreedingPuzzle.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./AnonymiceLibrary.sol";

contract AnonymiceBreedingPuzzle is ERC721Enumerable, Ownable {
    /*

  ____  ____    ___   ____   __ __  ___ ___  ____   __    ___      ____  __ __  _____  _____  _        ___ 
 /    ||    \  /   \ |    \ |  |  ||   |   ||    | /  ]  /  _]    |    \|  |  ||     ||     || |      /  _]
|  o  ||  _  ||     ||  _  ||  |  || _   _ | |  | /  /  /  [_     |  o  )  |  ||__/  ||__/  || |     /  [_ 
|     ||  |  ||  O  ||  |  ||  ~  ||  \_/  | |  |/  /  |    _]    |   _/|  |  ||   __||   __|| |___ |    _]
|  _  ||  |  ||     ||  |  ||___, ||   |   | |  /   \_ |   [_     |  |  |  :  ||  /  ||  /  ||     ||   [_ 
|  |  ||  |  ||     ||  |  ||     ||   |   | |  \     ||     |    |  |  |     ||     ||     ||     ||     |
|__|__||__|__| \___/ |__|__||____/ |___|___||____\____||_____|    |__|   \__,_||_____||_____||_____||_____|
                                                                                                           
*/

    using AnonymiceLibrary for uint256;
    string[] internal puzzlePieces;

    constructor() ERC721("AnonymiceBreedingPuzzle", "BABYMICEPUZZLE") {}

    function setPuzzlePieces(string[] memory _puzzlePieces) public onlyOwner {
        puzzlePieces = _puzzlePieces;
    }

    function puzzleForKeyPart2() public pure returns (string memory) {
        return "A35ef9B7B8";
    }

    function puzzleForKeyPart3() public pure returns (string memory) {
        return
            "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAATCAMAAABsiTl5AAAA81BMVEX///8EBwf8/Pzx8fH39/fV1dXDw8OvsLDh4uIMDw/19fXFxsacnZ3+/v7u7+/j5OSxsrKnqKifoKCWl5eHiIiQkZGKjIz5+fno6emqrKzb29u2t7eUlZX7+/v29vbr6+vm5ubd3d2Zmprt7e3f39/MzMy/wMC7vLy4ubm0tbWipKR+gIB7fX3Z2dnX19fQ0dF4enrNzs7Jysqsra2EhoZydHRnaWk1ODjs7e2kpqahoqKTlJSNj486PDwUFxe9vr5QUlJMTk5GSEgvMjLS0tLHyMhucHBjZGRbXV1WWFiAgoIcHh5CREReYGApLS0kJyciJCQ5Gw5uAAAD+klEQVRIx+1Ux27bQBScZVchxS5Soqjee7G6Lcm2YtlO+/+vCd9KCHzIIUgOueSBWGDwyJ23M8PF//rdEs4aoE9Hf7GDfX+Hknm/jAl07pcBpgPnmbecJzeN7lu2Qqj4+aIhE/U1UB0Za+GOpSwCudfHFgJ/r/JW5v7YRPP0WSGgnI4yps7gOuHbaich63kCgIAlX4sPLOUCKDyx1MQI0exxqneWMmcKrDOA9D1jbj5bLu1EminF2J3+nbFXak0YWwkHOd2VAVQujC3xibHLGsgfk/ckq4FaDoD6wFg1k0Fb+Ujs34gHCfF4/pFYbX4gRo2I8chYR39hqewHYqlNxMGXG/EX4ydxFduPxMlDUq9I6tVS4lKvXspoDmryTepFGmbfvkn9mkjt3aTOq2NAKCq4Sv35kEjtmwQSlS8y5MtpxqV+PCVSRzep+yuPpI4E/HmlSwBiCX9cema5hSC7W46Gi16Mwiff4KjzEupQlr00gecoW0du0q/z1i47kBGxB4WA6N4VIDqfprxV8OwGqtmdzEHNqaD8Nsnxluq3Smgv5zoAI8VSRcnFMAKgOXh2xNfEFwBofWUPHW3FWAigbtUzRbJ2QmNItgBf/3YNV+wydo9tspD9DVOczo2O3DATMnGujU2Q62vinWJRbiRGT4krCZct1GAQcc5GwQqS3V/4fO+Mqc9fGbMBjFppcS6skpbI3ZJGln5iqQUdOEnSU36fLBq92EXhMFIqPGrVgxGb6RNjR8pJEk0rd04xVqQE3bFHKW+7XoOMU/vRGFbqq4LrhpcAA/Y4JLRxJ1WE7+8znedpZ+mouw53a/z9IYvhE/8jAWXiK8i89VsEzMVkjM63FFEh7fv7GC/sKOFfVs6ZAUHtwEFgF4H1xhQ4GtWaSGJy5qhut2NIG/M6bRj1A7T3LhdD6tgiJOV6w6G8UUWIqlXmqlmmiFIYirw1dgoCqo5MosV9qadIC7HV40MEmaxoFVo1fveFRk8ZztcOCZ+PNOsAV1M2FK5STZD28JB3ibfb1t4w6+U8kWZX5UwPaqZJZIItd7uI5GaPwqXMpYlR8fILslUrIt79DNc2CVdlDlnlqW6j02zNkoX+pkwshUFYR8SH9wWjBhexT6dyYKjVYrk0ownlLhqtaWYttMfAUBFLZsPUkNUoXAZUrVtFoUvhGhR9TdqH9pnk3NqbtqA6PU5csHtZWcxu9mNCu3AxhhN6Sp7Q2fMkjFx+xtJsoXp4Hsx3INT1ayq6e88kZG99BdtN1InpXH6xn84P2gM+uzBKA6VqHVT5XAUQKjnwSjfoui1cWxiudaBaFn5xCRlktTHUr6hO7q5pAdAIdECrCBxIch4Q5H8Z6h/U2m9gd+ZVVAAAAABJRU5ErkJggg==";
    }

    function puzzleForKeyPart4() public pure returns (string memory) {
        return "ZTRhMjM1NWU2NA==";
    }

    function puzzleForKeyPart5() public pure returns (string memory) {
        return
            "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAKlBMVEX///9/f3+/v7/v7++Pj4/f39/Pz8+vr69wcHCfn59gYGBAQEBQUFAwMDB4Nu6UAAAFbklEQVR42u2YO4/TQBSFj+04m4XGDlk2CxROeEPjQBAvIYU3SBQBVggQRUC8q2WFeHSBCESZBYEQNGEB0dLQIyFR85M4x9wlNZOGYj6tT+bOzd6bsT3XnoHH4/F4PB6Px+PxeDwej8fj8Xgm5DRWqPSAex02lhKZl1fk3poVuUqvC2Fj3MwQDy8BcW9eZmASd1oSmf39cCIIKIfX6vfPZigPizC3gOjw4UIsU5hVJAGcOB5IGWG6tyoDnozA5oCB80MmwFEey2cmSLK8I0f0YR0D2umynx6Y0CrllLA1QZImkwR5RaECnq6FNhCjovirTTgQcR2IeHWciNd3UX6yIUOUzg15dXgTldMZSa33R0pPOM641tEtNoDH87+xyKN9FMbZTLJAidOummOHiQvxEmXQMitKFlUMH7K5KlKSYOwwcS6QyTQDzh/pIlwogbQ1SVM2Gg2GvjeEHCYuNJVkcJllaxCoQA5UIEc2hlK2k0m612EOihN9BWu/zFjAoOrUhGwlKY4K+56k5pA4ka7vUlUgu+hanZVpSVbRyIvniYkTEaswFp+z8eVRD3jK2jh15AgQ79ii1pkegofr8sIhcUzSZISb9vSl5JRdlLjJJGrRq04dEo/n39AciROQeE5SpUSz5kCQUhAOMSH3M6BIsi/uAK0pmpVyZo4ARH5n9s5RoiOMteZYDjQVayuY6RYScwSaRdMzNKdmaTqwp8yApV3859qeEUcSfuUg6pZODpoP2XqmolmNKQ7sSxlhPtRIsKjLQbMtswlzkIQvfeiDf24MFOvsuhEwgzfFw8niX/rrUPB4iJE+u3Bh9t5H6nwH0afHfeDcoxyoNBir1OgVDl78TUPgdOMzsLQpgQvl3kYwdkbR9Q27IOrCZpgjUivOJJvh8fwDGyXl3G4nij2IRaRPa+p7btPE5gTuMtqq7QsmWF60yOMqclHfu/oVDtjsRjVTq2OyaznTmBg1uQmbJwkdUif2bWesac25+ehXIZbk7lb+7JqqwKVNHN2b8nf3JMEmJmnpIkzVEhPFUp2yejatvtKsOZxP123VQQsxTgKrzNVIduR+uvQUtNsp39crxGLdj5/ZM2bQpp1fzt2TxFVpI2G6VzBppFor1HLet8dyrZBmeGMtaA1Eh8fzf9FappTSnHowo1nPYcRfpeYNR4DEkSaPW1HHquRuzW7DWvKaQXFPclbvvWGTgjs9Fs0aB3E17bNe1nvmra3rmbgmCXSSKuFKkgHYSsBM8ZbEvD8wMpnodO2wKrlyavSxtDUxr0yJe5JL8dCq5EZdk7V4zQKsJ0s/TMz7MxqZOBC8KJ4iINv6QLuW6/xkam3hhal+/uONH9ZziV9ie/43llLdwkWBtFWn9RHrmU6lV3i05+BEVqw/I5vk4z5hPRfiDlWZNk471q5wwaK1a0qX5tZXqvU59+uKWqY5dbUYVBdOBJJSbnUEUWJ9a/XyOwctW9/S21KfhuOe5OhKRbybWhIZkqaN8+QOjYlVzIlbfwZitb0fJdY3wA2gihktSrT2VpIur44T+rdT6UhPqRO8sWrfrO9AvYNotj6UQ1fiPVv3Ung8/xlxVTIrmeORwKBpu51GgxM2nJlgOTc/xeq0TxuF4yQybbdTlDvnga1BDge0qWmrzt1IbLeTm59m3pKEMnd8GNIbulRh29TEO5Cpnq1Etfkp09bG90NlylQFUjihTU1bPz+wNbU2PwvTknxIv1qSZil3XseTfvHLbXdggMTMS/bWakkSqvMGzv1NGaVpu53a/CxM2+28uJV914/we2e3TbAVFUnONXvUm7b5aeZmkC08rjW7xdaUx+PxeDwej8fj8Xg8Ho/H4/F4PB4XfgOWBejCvz/AGAAAAABJRU5ErkJggg==";
    }

    function puzzleForKeyPart6() public pure returns (string memory) {
        return
            "data:image/gif;base64,R0lGODlhDQFHAIAAAFdXV////yH5BAAHAP8AIf8LWE1QIERhdGFYTVA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJyB4OnhtcHRrPSdJbWFnZTo6RXhpZlRvb2wgMTIuMjknPgo8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6ZGM9J2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJz4KICA8ZGM6ZGVzY3JpcHRpb24+CiAgIDxyZGY6QWx0PgogICAgPHJkZjpsaSB4bWw6bGFuZz0neC1kZWZhdWx0Jz5kZGUzMzY2OTwvcmRmOmxpPgogICA8L3JkZjpBbHQ+CiAgPC9kYzpkZXNjcmlwdGlvbj4KICA8ZGM6dGl0bGU+CiAgIDxyZGY6QWx0PgogICAgPHJkZjpsaSB4bWw6bGFuZz0neC1kZWZhdWx0Jz5kZGUzMzY2OTwvcmRmOmxpPgogICA8L3JkZjpBbHQ+CiAgPC9kYzp0aXRsZT4KIDwvcmRmOkRlc2NyaXB0aW9uPgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSd3Jz8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAALAAAAAANAUcAAAL/jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJRQCm1Kq1Gs1qKdfudQsOL7zkqfgsLpPRbK3a244/3125fUn/3vfGvJUPOOSHFVjoM0hlqLiDaLb4aNMIAEk5I1mJ+XKJQWjgSDmZybB54RjqyXKKoyoKQWpxqsp6MltT2zramBErJdWZ6Pn7Kfw5RhiK/Kf3F/DV2RzLzFz4WjHd3IsKPawgjH1wm53NO4mMba79Lb5e/s1rWM016guMvm2abq/eIJ1/jtru3rt14HoFvIbLwy1ZBd2N0faO4T5+EAse/KduYEOJ/wAdpkuosNgzYAKD1TtWTlaxBNOwmHF2MtrKmMnumQSJM6fOnTx7+vwJNKjQoUSJrjTWrVQ4ea6IiJy1FF6EqBOrWoU1VdBHqpACOqAK9SEHrlwjicXplaIvejJZqSQ5lRg4l9GMoayX7+7RtSxZvjX1DI2+eX0JWuVYNhhEkvjchWtnD51Gf2oLs9vIB2FSyx87bw38ICJlx1c7Rq5oEjDczZw/00zsZDLrhphRb6UN7avkvP6WQqY82Lbvs7hlw2aiOtew1XBp0vOre7lzw2vvsk0tM3rbuU/bHi8KvcR38EbHkz+PPr369ezbu38PP4h5GHu/fpg/uyj+FsEJ7pqnLoFb6P23AlmtaTCfgOdJo1d2wjXIjzfaceddhNOVhCExBD7SmGh+cZMRa4/RZmB1JFY2V4jC4ZbbhotEdMxmHmYI2omeEecRhjjmyCBjhbmoSIe1eTTjOCyKI5tYu40m4opOEnnjTyN1R+F2Oq7WjXRgAZbbTdGlKN1zYr4EZHxmnolmmmquyWabbr4JZ5xyzklnnXbeGUABADs=";
    }

    function mintPieceForKeyPart7(uint8 _pieceNum) public {
        require(!_exists(_pieceNum), "Piece has already been minted!");
        require(
            _pieceNum >= 0 && _pieceNum <= 9,
            "Must enter a valid piece ID!"
        );

        _mint(msg.sender, _pieceNum);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Token must exist");

        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    string(
                        AnonymiceLibrary.encode(
                            abi.encodePacked(
                                '{"name": "Anonymice Breeding Puzzle Piece #',
                                _tokenId.toString(),
                                '","image": "',
                                puzzlePieces[_tokenId],
                                '",',
                                '"attributes":[{"trait_type": "Piece Number", "value": "',
                                _tokenId.toString(),
                                '"}]}'
                            )
                        )
                    )
                )
            );
    }
}

File 14 of 14 : AnonymiceLibrary.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library AnonymiceLibrary {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }

    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }

    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[{"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":"uint8","name":"_pieceNum","type":"uint8"}],"name":"mintPieceForKeyPart7","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"puzzleForKeyPart2","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"puzzleForKeyPart3","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"puzzleForKeyPart4","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"puzzleForKeyPart5","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"puzzleForKeyPart6","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"_puzzlePieces","type":"string[]"}],"name":"setPuzzlePieces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","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"}]

60806040523480156200001157600080fd5b50604080518082018252601781527f416e6f6e796d6963654272656564696e6750757a7a6c6500000000000000000060208083019182528351808501909452600e84526d424142594d49434550555a5a4c4560901b9084015281519192916200007d916000916200010c565b508051620000939060019060208401906200010c565b505050620000b0620000aa620000b660201b60201c565b620000ba565b620001ef565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011a90620001b2565b90600052602060002090601f0160209004810192826200013e576000855562000189565b82601f106200015957805160ff191683800117855562000189565b8280016001018555821562000189579182015b82811115620001895782518255916020019190600101906200016c565b50620001979291506200019b565b5090565b5b808211156200019757600081556001016200019c565b600281046001821680620001c757607f821691505b60208210811415620001e957634e487b7160e01b600052602260045260246000fd5b50919050565b6146a680620001ff6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80636352211e116100de5780639ddcf00811610097578063bcee0c8811610071578063bcee0c8814610306578063c87b56dd14610319578063e985e9c51461032c578063f2fde38b1461033f5761018e565b80639ddcf008146102d8578063a22cb465146102e0578063b88d4fde146102f35761018e565b80636352211e1461029257806370a08231146102a5578063715018a6146102b857806380d92a3c146102c05780638da5cb5b146102c857806395d89b41146102d05761018e565b8063223c09951161014b5780633ebd1601116101255780633ebd16011461025157806341124e721461025957806342842e0e1461026c5780634f6ccce71461027f5761018e565b8063223c09951461022357806323b872dd1461022b5780632f745c591461023e5761018e565b806301ffc9a71461019357806306fdde03146101bc578063081812fc146101d1578063095ea7b3146101f15780630c86a6411461020657806318160ddd1461020e575b600080fd5b6101a66101a13660046118b3565b610352565b6040516101b39190611b9b565b60405180910390f35b6101c461037f565b6040516101b39190611ba6565b6101e46101df3660046118eb565b610411565b6040516101b39190611b4a565b6102046101ff3660046117d6565b61045d565b005b6101c46104f5565b610216610518565b6040516101b391906120ff565b6101c461051e565b6102046102393660046116e8565b610548565b61021661024c3660046117d6565b610580565b6101c46105d2565b6102046102673660046117ff565b6105f5565b61020461027a3660046116e8565b61064b565b61021661028d3660046118eb565b610666565b6101e46102a03660046118eb565b6106c1565b6102166102b3366004611695565b6106f6565b61020461073a565b6101c4610785565b6101e46107a9565b6101c46107b8565b6101c46107c7565b6102046102ee36600461179c565b6107ea565b610204610301366004611723565b6108b8565b610204610314366004611903565b6108f7565b6101c46103273660046118eb565b610954565b6101a661033a3660046116b6565b610a07565b61020461034d366004611695565b610a35565b60006001600160e01b0319821663780e9d6360e01b1480610377575061037782610aa3565b90505b919050565b60606000805461038e906121cc565b80601f01602080910402602001604051908101604052809291908181526020018280546103ba906121cc565b80156104075780601f106103dc57610100808354040283529160200191610407565b820191906000526020600020905b8154815290600101906020018083116103ea57829003601f168201915b5050505050905090565b600061041c82610ae3565b6104415760405162461bcd60e51b815260040161043890611f57565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610468826106c1565b9050806001600160a01b0316836001600160a01b0316141561049c5760405162461bcd60e51b815260040161043890612021565b806001600160a01b03166104ae610b00565b6001600160a01b031614806104ca57506104ca8161033a610b00565b6104e65760405162461bcd60e51b815260040161043890611dd1565b6104f08383610b04565b505050565b6060604051806114e001604052806114b281526020016122cf6114b29139905090565b60085490565b60408051808201909152601081526f5a5452684d6a4d314e5755324e413d3d60801b602082015290565b610559610553610b00565b82610b72565b6105755760405162461bcd60e51b815260040161043890612062565b6104f0838383610bf7565b600061058b836106f6565b82106105a95760405162461bcd60e51b815260040161043890611bb9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606040518061082001604052806107ea81526020016137816107ea9139905090565b6105fd610b00565b6001600160a01b031661060e6107a9565b6001600160a01b0316146106345760405162461bcd60e51b815260040161043890611fa3565b805161064790600b9060208401906114db565b5050565b6104f0838383604051806020016040528060008152506108b8565b6000610670610518565b821061068e5760405162461bcd60e51b8152600401610438906120b3565b600882815481106106af57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806103775760405162461bcd60e51b815260040161043890611ea2565b60006001600160a01b03821661071e5760405162461bcd60e51b815260040161043890611e58565b506001600160a01b031660009081526003602052604090205490565b610742610b00565b6001600160a01b03166107536107a9565b6001600160a01b0316146107795760405162461bcd60e51b815260040161043890611fa3565b6107836000610d24565b565b60408051808201909152600a815269082666acacc72846e84760b31b602082015290565b600a546001600160a01b031690565b60606001805461038e906121cc565b60606040518061074001604052806107068152602001613f6b6107069139905090565b6107f2610b00565b6001600160a01b0316826001600160a01b031614156108235760405162461bcd60e51b815260040161043890611d4e565b8060056000610830610b00565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610874610b00565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516108ac9190611b9b565b60405180910390a35050565b6108c96108c3610b00565b83610b72565b6108e55760405162461bcd60e51b815260040161043890612062565b6108f184848484610d76565b50505050565b6109038160ff16610ae3565b156109205760405162461bcd60e51b815260040161043890611eeb565b60098160ff1611156109445760405162461bcd60e51b815260040161043890611cd3565b610951338260ff16610da9565b50565b606061095f82610ae3565b61097b5760405162461bcd60e51b815260040161043890611e2e565b6109e161098783610e88565b600b84815481106109a857634e487b7160e01b600052603260045260246000fd5b906000526020600020016109bb85610e88565b6040516020016109cd939291906119d9565b604051602081830303815290604052610fa3565b6040516020016109f19190611b05565b6040516020818303038152906040529050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a3d610b00565b6001600160a01b0316610a4e6107a9565b6001600160a01b031614610a745760405162461bcd60e51b815260040161043890611fa3565b6001600160a01b038116610a9a5760405162461bcd60e51b815260040161043890611c56565b61095181610d24565b60006001600160e01b031982166380ac58cd60e01b1480610ad457506001600160e01b03198216635b5e139f60e01b145b8061037757506103778261111a565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b39826106c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610b7d82610ae3565b610b995760405162461bcd60e51b815260040161043890611d85565b6000610ba4836106c1565b9050806001600160a01b0316846001600160a01b03161480610bdf5750836001600160a01b0316610bd484610411565b6001600160a01b0316145b80610bef5750610bef8185610a07565b949350505050565b826001600160a01b0316610c0a826106c1565b6001600160a01b031614610c305760405162461bcd60e51b815260040161043890611fd8565b6001600160a01b038216610c565760405162461bcd60e51b815260040161043890611d0a565b610c61838383611133565b610c6c600082610b04565b6001600160a01b0383166000908152600360205260408120805460019290610c95908490612189565b90915550506001600160a01b0382166000908152600360205260408120805460019290610cc390849061213e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610d81848484610bf7565b610d8d848484846111bc565b6108f15760405162461bcd60e51b815260040161043890611c04565b6001600160a01b038216610dcf5760405162461bcd60e51b815260040161043890611f22565b610dd881610ae3565b15610df55760405162461bcd60e51b815260040161043890611c9c565b610e0160008383611133565b6001600160a01b0382166000908152600360205260408120805460019290610e2a90849061213e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081610ead57506040805180820190915260018152600360fc1b602082015261037a565b8160005b8115610ed75780610ec181612207565b9150610ed09050600a83612156565b9150610eb1565b60008167ffffffffffffffff811115610f0057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610f2a576020820181803683370190505b5090505b8415610bef57610f3f600183612189565b9150610f4c600a86612222565b610f5790603061213e565b60f81b818381518110610f7a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350610f9c600a86612156565b9450610f2e565b6060815160001415610fc4575060408051602081019091526000815261037a565b600060405180606001604052806040815260200161228f6040913990506000600384516002610ff3919061213e565b610ffd9190612156565b61100890600461216a565b9050600061101782602061213e565b67ffffffffffffffff81111561103d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611067576020820181803683370190505b509050818152600183018586518101602084015b818310156110d55760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161107b565b6003895106600181146110ef57600281146111005761110c565b613d3d60f01b60011983015261110c565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b031981166301ffc9a760e01b14919050565b61113e8383836104f0565b6001600160a01b03831661115a57611155816112d7565b61117d565b816001600160a01b0316836001600160a01b03161461117d5761117d838261131b565b6001600160a01b03821661119957611194816113b8565b6104f0565b826001600160a01b0316826001600160a01b0316146104f0576104f08282611491565b60006111d0846001600160a01b03166114d5565b156112cc57836001600160a01b031663150b7a026111ec610b00565b8786866040518563ffffffff1660e01b815260040161120e9493929190611b5e565b602060405180830381600087803b15801561122857600080fd5b505af1925050508015611258575060408051601f3d908101601f19168201909252611255918101906118cf565b60015b6112b2573d808015611286576040519150601f19603f3d011682016040523d82523d6000602084013e61128b565b606091505b5080516112aa5760405162461bcd60e51b815260040161043890611c04565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bef565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001611328846106f6565b6113329190612189565b600083815260076020526040902054909150808214611385576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906113ca90600190612189565b6000838152600960205260408120546008805493945090928490811061140057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061142f57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061147557634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061149c836106f6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b828054828255906000526020600020908101928215611528579160200282015b828111156115285782518051611518918491602090910190611538565b50916020019190600101906114fb565b506115349291506115b8565b5090565b828054611544906121cc565b90600052602060002090601f01602090048101928261156657600085556115ac565b82601f1061157f57805160ff19168380011785556115ac565b828001600101855582156115ac579182015b828111156115ac578251825591602001919060010190611591565b506115349291506115d5565b808211156115345760006115cc82826115ea565b506001016115b8565b5b8082111561153457600081556001016115d6565b5080546115f6906121cc565b6000825580601f106116085750610951565b601f01602090049060005260206000209081019061095191906115d5565b600067ffffffffffffffff83111561164057611640612262565b611653601f8401601f1916602001612108565b905082815283838301111561166757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461037a57600080fd5b6000602082840312156116a6578081fd5b6116af8261167e565b9392505050565b600080604083850312156116c8578081fd5b6116d18361167e565b91506116df6020840161167e565b90509250929050565b6000806000606084860312156116fc578081fd5b6117058461167e565b92506117136020850161167e565b9150604084013590509250925092565b60008060008060808587031215611738578081fd5b6117418561167e565b935061174f6020860161167e565b925060408501359150606085013567ffffffffffffffff811115611771578182fd5b8501601f81018713611781578182fd5b61179087823560208401611626565b91505092959194509250565b600080604083850312156117ae578182fd5b6117b78361167e565b9150602083013580151581146117cb578182fd5b809150509250929050565b600080604083850312156117e8578182fd5b6117f18361167e565b946020939093013593505050565b60006020808385031215611811578182fd5b823567ffffffffffffffff80821115611828578384fd5b818501915085601f83011261183b578384fd5b81358181111561184d5761184d612262565b61185a8485830201612108565b8181528481019250838501865b838110156118a557813586018a603f820112611881578889fd5b6118928b8983013560408401611626565b8652509386019390860190600101611867565b509098975050505050505050565b6000602082840312156118c4578081fd5b81356116af81612278565b6000602082840312156118e0578081fd5b81516116af81612278565b6000602082840312156118fc578081fd5b5035919050565b600060208284031215611914578081fd5b813560ff811681146116af578182fd5b6000815180845261193c8160208601602086016121a0565b601f01601f19169290920160200192915050565b600081516119628185602086016121a0565b9290920192915050565b61088b60f21b815260020190565b7f2261747472696275746573223a5b7b2274726169745f74797065223a2022506981527f656365204e756d626572222c202276616c7565223a2022000000000000000000602082015260370190565b63227d5d7d60e01b815260040190565b60007f7b226e616d65223a2022416e6f6e796d696365204272656564696e672050757a825260206a7a6c65205069656365202360a81b818401528551611a2581602b8601848a016121a0565b6b11161134b6b0b3b2911d101160a11b602b918501918201528554603790849060028104600180831680611a5a57607f831692505b878310811415611a7857634e487b7160e01b89526022600452602489fd5b808015611a8c5760018114611aa157611ad1565b60ff1985168888015283880187019550611ad1565b611aaa8d612132565b8a5b85811015611ac75781548a82018a0152908401908a01611aac565b5050868489010195505b5050505050611af8611af3611aed611ae88461196c565b61197a565b89611950565b6119c9565b9998505050505050505050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000082528251611b3d81601d8501602087016121a0565b91909101601d0192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b9190830184611924565b9695505050505050565b901515815260200190565b6000602082526116af6020830184611924565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601c908201527f4d75737420656e74657220612076616c69642070696563652049442100000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526010908201526f151bdad95b881b5d5cdd08195e1a5cdd60821b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601e908201527f50696563652068617320616c7265616479206265656e206d696e746564210000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561212a5761212a612262565b604052919050565b60009081526020902090565b6000821982111561215157612151612236565b500190565b6000826121655761216561224c565b500490565b600081600019048311821515161561218457612184612236565b500290565b60008282101561219b5761219b612236565b500390565b60005b838110156121bb5781810151838201526020016121a3565b838111156108f15750506000910152565b6002810460018216806121e057607f821691505b6020821081141561220157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561221b5761221b612236565b5060010190565b6000826122315761223161224c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461095157600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f646174613a696d6167652f6769663b6261736536342c52306c474f446c68445146484149414141466458562f2f2f2f79483542414148415038414966384c574531514945526864474659545641385033687759574e725a585167596d566e615734394a2b2b3776796367615751394a3163315454424e63454e6c61476c49656e4a6c5533704f56474e3661324d355a43632f50676f3865447034625842745a585268494868746247357a4f6e67394a32466b62324a6c4f6d357a4f6d316c644745764a7942344f6e6874634852725053644a6257466e5a546f36525868705a6c5276623277674d5449754d6a6b6e50676f38636d526d4f6c4a455269423462577875637a70795a4759394a326830644841364c79393364336375647a4d7562334a6e4c7a45354f546b764d4449764d6a4974636d526d4c584e35626e52686543317563794d6e50676f4b494478795a4759365247567a59334a706348527062323467636d526d4f6d4669623356305053636e4369416765473173626e4d365a474d394a326830644841364c79397764584a734c6d39795a79396b5979396c624756745a573530637938784c6a45764a7a344b494341385a474d365a47567a59334a70634852706232342b43694167494478795a4759365157783050676f674943416750484a6b5a6a70736153423462577736624746755a7a306e6543316b5a575a68645778304a7a356b5a47557a4d7a59324f547776636d526d4f6d787050676f67494341384c334a6b5a6a70426248512b436941675043396b597a706b5a584e6a636d6c7764476c76626a344b494341385a474d3664476c306247552b43694167494478795a4759365157783050676f674943416750484a6b5a6a70736153423462577736624746755a7a306e6543316b5a575a68645778304a7a356b5a47557a4d7a59324f547776636d526d4f6d787050676f67494341384c334a6b5a6a70426248512b436941675043396b597a7030615852735a54344b49447776636d526d4f6b526c63324e79615842306157397550676f384c334a6b5a6a70535245592b436a777665447034625842745a58526850676f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f385033687759574e725a5851675a57356b505364334a7a382b41662f2b2f667a372b766e34392f6231395050793866447637753373362b7270364f666d3565546a3475486733393764334e766132646a583174585530394c52304d2f4f7a637a4c79736e4978386246784d50437763432f7672323875377135754c65327462537a7372477772363674724b75717161696e7071576b6f364b686f4a2b656e5a79626d706d596c3561566c4a4f536b5a43506a6f324d6934714a6949654768595344676f4741663335396648743665586833646e563063334a786347397562577872616d6c6f5a325a6c5a474e6959574266586c31635731705a5746645756565254556c46515430354e5445744b53556848526b564551304a425144382b505477374f6a6b344e7a59314e444d794d5441764c6930734b796f704b43636d4a53516a4969456748783464484273614752675846685555457849524541384f4451774c43676b494277594642414d43415141414c4141414141414e4155634141414c2f6a492b70792b30506f357930326f757a33727a3744346269534a626d696162717972627543386679544e66326a6566367a76662b4477774b683853693859684d4b70664d70764d4a5251436d314b7131477331714b6466756451734f4c377a6b716667734c705052624b33613234342f3331323566556e2f33766647764a55504f4f534846566a6f4d30686c714c6944614c6234614e4d4941456b3549316d4a2b584b4a51576a6753446d5a7962423534526a7179584b4b6f796f4b51577078717370364d6c7454327a72616d4245724a64575a36506e374b6677355268694b2f4b6633462f445632527a4c7a467a34576a48643349734b506177676a4831776d35334e4f346d4d626137394c6235652f733172574d30313667754d766d326162712f65494a312f6a7472753372743134486f467649624c7779315a4264324e3066614f3454352b454173652f4b647559454f4a2f774164706b756f734e677a59414b4431547457546c6178424e4f776d4846324d74724b6d4d6e756d51534a4d36664f6e5478372b76774a4e4b6a516f55534a726a54577256513465613649694a79314646364571424f72576f553156644248717041434f71414b39534548726c776a696358706c614976656a4a5a715351356c5267346c39474d6f617958372b37527453785a766a58314449322b6558304a577556594e6868456b766a636857746e4435314766326f4c7339764942324653797838376277333849434a6c783163375271356f456a44637a5a772f30307a735a444c72687068526236554e3761766b7650365751715938324c62767337686c773261694f7465773158427030764f7265376c7a77327676736b30744d33726275552f624869384b76635233384562486b7a2b505072333639657a6275333850503468354748752f6670672f75796a2b4673454a3770716e4c6f466236503233416c6d7461544366674f644a6f316432776a58496a7a666163656464684e4f5668434578424437536d47682b635a4d5261342f525a6d42314a46593256346a43345a6262686f7445644d786d486d5949326f6d6545656352686a6a6d7943426a68626d6f534965316554546a4f43794b493574597534306d346f704f456e6e6a54794e31522b46324f7137576a585267415a62625464476c4b4e317a597234455a48786d6e6f6c6d6d6d7175795761626272344a5a3578797a6b6c6e6e586265475541424144733d646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141414d67414141444942414d414141426664724f74414141414b6c424d5645582f2f2f392f66332b2f76372f76372b2b506a342f6633392f507a382b7672363977634843666e3539675947424151454251554641774d4442344e75365541414146626b6c4551565234327532594f342f54514253466a2b30346d345847446c6b324378524f6545506a514241764959553353425142566767515255433871325746654853424345535a425945514e47454230644c514979465238354d347839776c4e5a4f47596a3674542b624f7a643662735433586e6f4848342f463450423650782b5078654477656a38666a3858676d3544525771505341657830326c684b5a6c31666b33706f56755571764332466a334d775144793842635739655a6d415364316f536d663339634349494b496658367666505a696750697a4333674f6a7734554973553568564a4147634f4235494757473674796f446e6f7a41356f434238304d6d774645657932636d534c4b38493066305952304432756d796e7836593043726c6c4c4131515a496d6b775235526145436e7136464e68436a6f766972545467516352324965485763694e64335558367949554f557a673135645867546c644d5a53613333523070504f4d3634317445744e6f444838372b78794b4e39464d625a544c4a4169644f756d6d4f4869517678456d58514d69744b466c554d48374b354b6c4b53594f777763533651795451447a682f70496c776f6762513153564d3247673247766a6545484359754e4a566b634a6c6c6178436f5141355549456332686c4b326b306d363132454f69684e394257752f7a466a416f4f72556847776c4b59344b2b35366b357041346b613776556c5567752b68616e5a5670535662527949766e69596b544561737746702b7a3865565244336a4b326a6831354167513739696931706b65676f66723873496863557a535a4953623976536c354a52646c4c6a4a4a47725271303464456f2f6e3339416369524f51654535537055537a356b43515568414f4d5348334d36424973692f75414b30706d7056795a6f34415248356e397335526f694f4d74655a59446a515661797559365259536377536152644d7a4e4b646d61547177703879417056333835397165455563536675556736705a4f44706f503258716d6f6c6d4e4b51377353786c6850745249734b6a4c51624d7473776c7a6b495176666569446632344d464f767375684577677a664677386e69582f727255504234694a452b7533426839743548366e774830616648666544636f78796f4e426972314f6756446c373854555067644f4d7a734c51706751766c336b5977646b625239513237494f72435a70676a5569764f4a4a7668386677444779586c3347346e696a324952615250612b703762745045356754754d7471713751736d57463630794f4d71636c4866752f6f5644746a73526a565471324f79617a6e546d42673175516d624a776b645569663262576573616332352b656858495a626b376c622b374a7171774b564e484e3262386e66334a4d456d4a6d6e70496b7a564568504655703279656a617476744b734f5a7850313233565151737854674b727a4e56496475522b75765155744e73703339637278474c646a352f5a4d326251707031667a7432547846567049324736567a427070466f7231484c6574386479725a426d65474d74614131456838667a66394661707054536e486f776f316e50596352667065594e523444456b53615057314848717552757a57374457764b6151584650636c627676574754676a7339467330614233453137624e65316e766d726133726d62676d435853534b75464b6b6748595373424d385a6245764438774d706e6f644f32774b726c7961765378744455787230794a65354a4c3864437135455a646b3756347a514b734a30732f544d7a374d78715a4f4243384b4a3469494e7636514c7557362f786b616d336868616c2b2f754f4e48395a7a69563969652f34336c6c4c64776b57427446576e395248726d55366c56336930352b42455671772f4935766b347a356850526669446c575a4e6b34373171357777614b316130715835745a5871765535392b754b57715935646255595642644f424a4a53626e554555574a39612f58794f77637457392f5332314b6668754f65354f684b526279625768495a6b71614e382b514f6a596c567a496c6266775a69746230664a6459337741326769686b745372543256704975723434542b7264543655685071524f3873577266724f394176594e6f746a36555131666950567633556e67382f786c78565449726d654f52774b42707535314767784d326e4a6c674f54632f786571305478754634795179626264546c44766e676131424467653071576d727a743149624c65546d35396d33704b454d6e6438474e4962756c5268323954454f3543706e71314574666b703039624739304e6c796c5146556a696854553162507a2b774e625532507776546b6e7849763171535a696c33587365546676484c62586467674d544d532f6257616b6b5371764d477a76314e47615670753533612f43784d322b3238754a563931342f77653265335462415646556e4f4e5876556d37623561655a6d6b433038726a573778646155782b5078654477656a38666a38586738486f2f48342f46345042345866674f5742656a43767a2f41474141414141424a52553545726b4a6767673d3d646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141414867414141415443414d414141427369546c35414141413831424d5645582f2f2f3845427766382f507a7838664833392f66563164584477384f76734c44683475494d44772f3139665846787361636e5a332b2f763775372b2f6a354f537873724b6e714b69666f4b43576c356548694969516b5a474b6a497a352b666e6f36656d71724b7a6232397532743765556c5a58372b2f763239766272362b766d357562643364325a6d7072743765336633392f4d7a4d792f774d4337764c793475626d3074625769704b522b674942376658335a32646e583139665130644634656e724e7a73374a7973717372613245686f5a796448526e61576b314f446a733765326b707161686f714b546c4a534e6a343836504477554678653976723551556c4a4d546b3547534567764d6a4c5330744c48794d68756348426a5a4752625856315757466941676f49634868354352455265594741704c53306b4a7963694a43513547773575414141442b6b6c4551565249782b315578323762514253635a566368785335536f716a65653747364c636d3259746c4f2b2f2b764364394b43487a494955674f7565534257474477794a32334d3850462f2f7264457334616f4539486637474466582b486b6e6d2f6a416c30377063427067506e6d6265634a7a654e376c753251716a342b614968452f55315542305a612b474f705377437564664846674a2f722f4a573576375952505030575347676e493479707337674f7548626169636836336b436749416c583473504c4f55434b447978314d514930657878716e65574d6d634b72444f413944316a626a35624c7531456d696e46324a332b6e624658616b305957776b484f643256415651756a4333786962484c477367666b2f636b71344661446f4436774667316b3046622b556a7333346748436646342f70465962583467526f324938636859523339687165774859716c4e784d4758472f45583479647846647550784d6c445571394936745653346c4b765873706f446d727954657046476d6266766b6e396d6b6a743361544f71324e414b437134537633356b456a746d7751536c533879354d74707871562b50435653527a65702b797550704934452f486d6c5377426943583963656d613568534337573436476931364d77696666344b6a7a457570516c7230306765636f5730647530712f7a316934376b42477842345741364e34564944716670727856384f774771746d647a45484e716144384e736e786c757133536d6776357a6f414938565352636e464d414b674f586832784e66454677426f6657555048573346574169676274557a52624a32516d4e49746742662f33594e562b7779646f39747370443944564f637a6f324f334441544d6e47756a553251363276696e574a526269524754346b72435a637431474151636335477751715333562f34664f2b4d7163396647624d426a467070635336736b706249335a4a476c6e3569715155644f456e53553336664c427139324558684d464971504772566778476236524e6a5238704a456b30726430347856715145336246484b572b37586f4f4d552f76524746627171344c7268706341412f59344a4c52784a315745372b387a6e6564705a2b6d6f75773533612f7a3949597668452f386a415758694b386938395673457a4d566b6a4d3633464645683766763747432f734b4f46665673365a415548747745466746344831786851344774576153474a793571687574324e49472f4d3662526a31413754334c686444367467694a4f56367736473855555749716c586d716c6d6d694649596972773164676f43716f354d6f735639716164494337485634304d456d61786f46566f3166766546526b385a7a74634f435a2b504e4f734156314d32464b3553545a4432384a42336962666231743477362b55386b575a583555775061715a4a5a49497464377549354761507771584d70596c523866494c736c557249743739444e63324356646c446c6e6c7157366a30327a4e6b6f582b706b777368554659523853483977576a4268657854366479594b6a5659726b306f776e6c4c68717461575974744d66415542464c5a7350556b4e556f58415a55725674466f557668476852395464714839706e6b334e716274714136505535637348745a57637875396d4e437533417868684e365370375132664d6b6a46782b78744a736f58703448737833494e5431617971366538386b5a4739394264744e31496e70584836786e38345032674d2b757a424b4136567148565435584155514b6a6e77536a666f756931635778697564614261466e357843526c6b745448557236684f37713570416441496445437243427849636834513548385a36682f55326d3967642b5a56564141414141424a52553545726b4a6767673d3da264697066735822122043f4caf8d59ca13926d5560b8158baf5353d18bb7f2b36643fc4296af3b4f51064736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80636352211e116100de5780639ddcf00811610097578063bcee0c8811610071578063bcee0c8814610306578063c87b56dd14610319578063e985e9c51461032c578063f2fde38b1461033f5761018e565b80639ddcf008146102d8578063a22cb465146102e0578063b88d4fde146102f35761018e565b80636352211e1461029257806370a08231146102a5578063715018a6146102b857806380d92a3c146102c05780638da5cb5b146102c857806395d89b41146102d05761018e565b8063223c09951161014b5780633ebd1601116101255780633ebd16011461025157806341124e721461025957806342842e0e1461026c5780634f6ccce71461027f5761018e565b8063223c09951461022357806323b872dd1461022b5780632f745c591461023e5761018e565b806301ffc9a71461019357806306fdde03146101bc578063081812fc146101d1578063095ea7b3146101f15780630c86a6411461020657806318160ddd1461020e575b600080fd5b6101a66101a13660046118b3565b610352565b6040516101b39190611b9b565b60405180910390f35b6101c461037f565b6040516101b39190611ba6565b6101e46101df3660046118eb565b610411565b6040516101b39190611b4a565b6102046101ff3660046117d6565b61045d565b005b6101c46104f5565b610216610518565b6040516101b391906120ff565b6101c461051e565b6102046102393660046116e8565b610548565b61021661024c3660046117d6565b610580565b6101c46105d2565b6102046102673660046117ff565b6105f5565b61020461027a3660046116e8565b61064b565b61021661028d3660046118eb565b610666565b6101e46102a03660046118eb565b6106c1565b6102166102b3366004611695565b6106f6565b61020461073a565b6101c4610785565b6101e46107a9565b6101c46107b8565b6101c46107c7565b6102046102ee36600461179c565b6107ea565b610204610301366004611723565b6108b8565b610204610314366004611903565b6108f7565b6101c46103273660046118eb565b610954565b6101a661033a3660046116b6565b610a07565b61020461034d366004611695565b610a35565b60006001600160e01b0319821663780e9d6360e01b1480610377575061037782610aa3565b90505b919050565b60606000805461038e906121cc565b80601f01602080910402602001604051908101604052809291908181526020018280546103ba906121cc565b80156104075780601f106103dc57610100808354040283529160200191610407565b820191906000526020600020905b8154815290600101906020018083116103ea57829003601f168201915b5050505050905090565b600061041c82610ae3565b6104415760405162461bcd60e51b815260040161043890611f57565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610468826106c1565b9050806001600160a01b0316836001600160a01b0316141561049c5760405162461bcd60e51b815260040161043890612021565b806001600160a01b03166104ae610b00565b6001600160a01b031614806104ca57506104ca8161033a610b00565b6104e65760405162461bcd60e51b815260040161043890611dd1565b6104f08383610b04565b505050565b6060604051806114e001604052806114b281526020016122cf6114b29139905090565b60085490565b60408051808201909152601081526f5a5452684d6a4d314e5755324e413d3d60801b602082015290565b610559610553610b00565b82610b72565b6105755760405162461bcd60e51b815260040161043890612062565b6104f0838383610bf7565b600061058b836106f6565b82106105a95760405162461bcd60e51b815260040161043890611bb9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606040518061082001604052806107ea81526020016137816107ea9139905090565b6105fd610b00565b6001600160a01b031661060e6107a9565b6001600160a01b0316146106345760405162461bcd60e51b815260040161043890611fa3565b805161064790600b9060208401906114db565b5050565b6104f0838383604051806020016040528060008152506108b8565b6000610670610518565b821061068e5760405162461bcd60e51b8152600401610438906120b3565b600882815481106106af57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806103775760405162461bcd60e51b815260040161043890611ea2565b60006001600160a01b03821661071e5760405162461bcd60e51b815260040161043890611e58565b506001600160a01b031660009081526003602052604090205490565b610742610b00565b6001600160a01b03166107536107a9565b6001600160a01b0316146107795760405162461bcd60e51b815260040161043890611fa3565b6107836000610d24565b565b60408051808201909152600a815269082666acacc72846e84760b31b602082015290565b600a546001600160a01b031690565b60606001805461038e906121cc565b60606040518061074001604052806107068152602001613f6b6107069139905090565b6107f2610b00565b6001600160a01b0316826001600160a01b031614156108235760405162461bcd60e51b815260040161043890611d4e565b8060056000610830610b00565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610874610b00565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516108ac9190611b9b565b60405180910390a35050565b6108c96108c3610b00565b83610b72565b6108e55760405162461bcd60e51b815260040161043890612062565b6108f184848484610d76565b50505050565b6109038160ff16610ae3565b156109205760405162461bcd60e51b815260040161043890611eeb565b60098160ff1611156109445760405162461bcd60e51b815260040161043890611cd3565b610951338260ff16610da9565b50565b606061095f82610ae3565b61097b5760405162461bcd60e51b815260040161043890611e2e565b6109e161098783610e88565b600b84815481106109a857634e487b7160e01b600052603260045260246000fd5b906000526020600020016109bb85610e88565b6040516020016109cd939291906119d9565b604051602081830303815290604052610fa3565b6040516020016109f19190611b05565b6040516020818303038152906040529050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a3d610b00565b6001600160a01b0316610a4e6107a9565b6001600160a01b031614610a745760405162461bcd60e51b815260040161043890611fa3565b6001600160a01b038116610a9a5760405162461bcd60e51b815260040161043890611c56565b61095181610d24565b60006001600160e01b031982166380ac58cd60e01b1480610ad457506001600160e01b03198216635b5e139f60e01b145b8061037757506103778261111a565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b39826106c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610b7d82610ae3565b610b995760405162461bcd60e51b815260040161043890611d85565b6000610ba4836106c1565b9050806001600160a01b0316846001600160a01b03161480610bdf5750836001600160a01b0316610bd484610411565b6001600160a01b0316145b80610bef5750610bef8185610a07565b949350505050565b826001600160a01b0316610c0a826106c1565b6001600160a01b031614610c305760405162461bcd60e51b815260040161043890611fd8565b6001600160a01b038216610c565760405162461bcd60e51b815260040161043890611d0a565b610c61838383611133565b610c6c600082610b04565b6001600160a01b0383166000908152600360205260408120805460019290610c95908490612189565b90915550506001600160a01b0382166000908152600360205260408120805460019290610cc390849061213e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610d81848484610bf7565b610d8d848484846111bc565b6108f15760405162461bcd60e51b815260040161043890611c04565b6001600160a01b038216610dcf5760405162461bcd60e51b815260040161043890611f22565b610dd881610ae3565b15610df55760405162461bcd60e51b815260040161043890611c9c565b610e0160008383611133565b6001600160a01b0382166000908152600360205260408120805460019290610e2a90849061213e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081610ead57506040805180820190915260018152600360fc1b602082015261037a565b8160005b8115610ed75780610ec181612207565b9150610ed09050600a83612156565b9150610eb1565b60008167ffffffffffffffff811115610f0057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610f2a576020820181803683370190505b5090505b8415610bef57610f3f600183612189565b9150610f4c600a86612222565b610f5790603061213e565b60f81b818381518110610f7a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350610f9c600a86612156565b9450610f2e565b6060815160001415610fc4575060408051602081019091526000815261037a565b600060405180606001604052806040815260200161228f6040913990506000600384516002610ff3919061213e565b610ffd9190612156565b61100890600461216a565b9050600061101782602061213e565b67ffffffffffffffff81111561103d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611067576020820181803683370190505b509050818152600183018586518101602084015b818310156110d55760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161107b565b6003895106600181146110ef57600281146111005761110c565b613d3d60f01b60011983015261110c565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b031981166301ffc9a760e01b14919050565b61113e8383836104f0565b6001600160a01b03831661115a57611155816112d7565b61117d565b816001600160a01b0316836001600160a01b03161461117d5761117d838261131b565b6001600160a01b03821661119957611194816113b8565b6104f0565b826001600160a01b0316826001600160a01b0316146104f0576104f08282611491565b60006111d0846001600160a01b03166114d5565b156112cc57836001600160a01b031663150b7a026111ec610b00565b8786866040518563ffffffff1660e01b815260040161120e9493929190611b5e565b602060405180830381600087803b15801561122857600080fd5b505af1925050508015611258575060408051601f3d908101601f19168201909252611255918101906118cf565b60015b6112b2573d808015611286576040519150601f19603f3d011682016040523d82523d6000602084013e61128b565b606091505b5080516112aa5760405162461bcd60e51b815260040161043890611c04565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bef565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001611328846106f6565b6113329190612189565b600083815260076020526040902054909150808214611385576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906113ca90600190612189565b6000838152600960205260408120546008805493945090928490811061140057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061142f57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061147557634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061149c836106f6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b828054828255906000526020600020908101928215611528579160200282015b828111156115285782518051611518918491602090910190611538565b50916020019190600101906114fb565b506115349291506115b8565b5090565b828054611544906121cc565b90600052602060002090601f01602090048101928261156657600085556115ac565b82601f1061157f57805160ff19168380011785556115ac565b828001600101855582156115ac579182015b828111156115ac578251825591602001919060010190611591565b506115349291506115d5565b808211156115345760006115cc82826115ea565b506001016115b8565b5b8082111561153457600081556001016115d6565b5080546115f6906121cc565b6000825580601f106116085750610951565b601f01602090049060005260206000209081019061095191906115d5565b600067ffffffffffffffff83111561164057611640612262565b611653601f8401601f1916602001612108565b905082815283838301111561166757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461037a57600080fd5b6000602082840312156116a6578081fd5b6116af8261167e565b9392505050565b600080604083850312156116c8578081fd5b6116d18361167e565b91506116df6020840161167e565b90509250929050565b6000806000606084860312156116fc578081fd5b6117058461167e565b92506117136020850161167e565b9150604084013590509250925092565b60008060008060808587031215611738578081fd5b6117418561167e565b935061174f6020860161167e565b925060408501359150606085013567ffffffffffffffff811115611771578182fd5b8501601f81018713611781578182fd5b61179087823560208401611626565b91505092959194509250565b600080604083850312156117ae578182fd5b6117b78361167e565b9150602083013580151581146117cb578182fd5b809150509250929050565b600080604083850312156117e8578182fd5b6117f18361167e565b946020939093013593505050565b60006020808385031215611811578182fd5b823567ffffffffffffffff80821115611828578384fd5b818501915085601f83011261183b578384fd5b81358181111561184d5761184d612262565b61185a8485830201612108565b8181528481019250838501865b838110156118a557813586018a603f820112611881578889fd5b6118928b8983013560408401611626565b8652509386019390860190600101611867565b509098975050505050505050565b6000602082840312156118c4578081fd5b81356116af81612278565b6000602082840312156118e0578081fd5b81516116af81612278565b6000602082840312156118fc578081fd5b5035919050565b600060208284031215611914578081fd5b813560ff811681146116af578182fd5b6000815180845261193c8160208601602086016121a0565b601f01601f19169290920160200192915050565b600081516119628185602086016121a0565b9290920192915050565b61088b60f21b815260020190565b7f2261747472696275746573223a5b7b2274726169745f74797065223a2022506981527f656365204e756d626572222c202276616c7565223a2022000000000000000000602082015260370190565b63227d5d7d60e01b815260040190565b60007f7b226e616d65223a2022416e6f6e796d696365204272656564696e672050757a825260206a7a6c65205069656365202360a81b818401528551611a2581602b8601848a016121a0565b6b11161134b6b0b3b2911d101160a11b602b918501918201528554603790849060028104600180831680611a5a57607f831692505b878310811415611a7857634e487b7160e01b89526022600452602489fd5b808015611a8c5760018114611aa157611ad1565b60ff1985168888015283880187019550611ad1565b611aaa8d612132565b8a5b85811015611ac75781548a82018a0152908401908a01611aac565b5050868489010195505b5050505050611af8611af3611aed611ae88461196c565b61197a565b89611950565b6119c9565b9998505050505050505050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000082528251611b3d81601d8501602087016121a0565b91909101601d0192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b9190830184611924565b9695505050505050565b901515815260200190565b6000602082526116af6020830184611924565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601c908201527f4d75737420656e74657220612076616c69642070696563652049442100000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526010908201526f151bdad95b881b5d5cdd08195e1a5cdd60821b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601e908201527f50696563652068617320616c7265616479206265656e206d696e746564210000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561212a5761212a612262565b604052919050565b60009081526020902090565b6000821982111561215157612151612236565b500190565b6000826121655761216561224c565b500490565b600081600019048311821515161561218457612184612236565b500290565b60008282101561219b5761219b612236565b500390565b60005b838110156121bb5781810151838201526020016121a3565b838111156108f15750506000910152565b6002810460018216806121e057607f821691505b6020821081141561220157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561221b5761221b612236565b5060010190565b6000826122315761223161224c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461095157600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f646174613a696d6167652f6769663b6261736536342c52306c474f446c68445146484149414141466458562f2f2f2f79483542414148415038414966384c574531514945526864474659545641385033687759574e725a585167596d566e615734394a2b2b3776796367615751394a3163315454424e63454e6c61476c49656e4a6c5533704f56474e3661324d355a43632f50676f3865447034625842745a585268494868746247357a4f6e67394a32466b62324a6c4f6d357a4f6d316c644745764a7942344f6e6874634852725053644a6257466e5a546f36525868705a6c5276623277674d5449754d6a6b6e50676f38636d526d4f6c4a455269423462577875637a70795a4759394a326830644841364c79393364336375647a4d7562334a6e4c7a45354f546b764d4449764d6a4974636d526d4c584e35626e52686543317563794d6e50676f4b494478795a4759365247567a59334a706348527062323467636d526d4f6d4669623356305053636e4369416765473173626e4d365a474d394a326830644841364c79397764584a734c6d39795a79396b5979396c624756745a573530637938784c6a45764a7a344b494341385a474d365a47567a59334a70634852706232342b43694167494478795a4759365157783050676f674943416750484a6b5a6a70736153423462577736624746755a7a306e6543316b5a575a68645778304a7a356b5a47557a4d7a59324f547776636d526d4f6d787050676f67494341384c334a6b5a6a70426248512b436941675043396b597a706b5a584e6a636d6c7764476c76626a344b494341385a474d3664476c306247552b43694167494478795a4759365157783050676f674943416750484a6b5a6a70736153423462577736624746755a7a306e6543316b5a575a68645778304a7a356b5a47557a4d7a59324f547776636d526d4f6d787050676f67494341384c334a6b5a6a70426248512b436941675043396b597a7030615852735a54344b49447776636d526d4f6b526c63324e79615842306157397550676f384c334a6b5a6a70535245592b436a777665447034625842745a58526850676f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674369416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943414b49434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749434167494341674943416749416f385033687759574e725a5851675a57356b505364334a7a382b41662f2b2f667a372b766e34392f6231395050793866447637753373362b7270364f666d3565546a3475486733393764334e766132646a583174585530394c52304d2f4f7a637a4c79736e4978386246784d50437763432f7672323875377135754c65327462537a7372477772363674724b75717161696e7071576b6f364b686f4a2b656e5a79626d706d596c3561566c4a4f536b5a43506a6f324d6934714a6949654768595344676f4741663335396648743665586833646e563063334a786347397562577872616d6c6f5a325a6c5a474e6959574266586c31635731705a5746645756565254556c46515430354e5445744b53556848526b564551304a425144382b505477374f6a6b344e7a59314e444d794d5441764c6930734b796f704b43636d4a53516a4969456748783464484273614752675846685555457849524541384f4451774c43676b494277594642414d43415141414c4141414141414e4155634141414c2f6a492b70792b30506f357930326f757a33727a3744346269534a626d696162717972627543386679544e66326a6566367a76662b4477774b683853693859684d4b70664d70764d4a5251436d314b7131477331714b6466756451734f4c377a6b716667734c705052624b33613234342f3331323566556e2f33766647764a55504f4f534846566a6f4d30686c714c6944614c6234614e4d4941456b3549316d4a2b584b4a51576a6753446d5a7962423534526a7179584b4b6f796f4b51577078717370364d6c7454327a72616d4245724a64575a36506e374b6677355268694b2f4b6633462f445632527a4c7a467a34576a48643349734b506177676a4831776d35334e4f346d4d626137394c6235652f733172574d30313667754d766d326162712f65494a312f6a7472753372743134486f467649624c7779315a4264324e3066614f3454352b454173652f4b647559454f4a2f774164706b756f734e677a59414b4431547457546c6178424e4f776d4846324d74724b6d4d6e756d51534a4d36664f6e5478372b76774a4e4b6a516f55534a726a54577256513465613649694a79314646364571424f72576f553156644248717041434f71414b39534548726c776a696358706c614976656a4a5a715351356c5267346c39474d6f617958372b37527453785a766a58314449322b6558304a577556594e6868456b766a636857746e4435314766326f4c7339764942324653797838376277333849434a6c783163375271356f456a44637a5a772f30307a735a444c72687068526236554e3761766b7650365751715938324c62767337686c773261694f7465773158427030764f7265376c7a77327676736b30744d33726275552f624869384b76635233384562486b7a2b505072333639657a6275333850503468354748752f6670672f75796a2b4673454a3770716e4c6f466236503233416c6d7461544366674f644a6f316432776a58496a7a666163656464684e4f5668434578424437536d47682b635a4d5261342f525a6d42314a46593256346a43345a6262686f7445644d786d486d5949326f6d6545656352686a6a6d7943426a68626d6f534965316554546a4f43794b493574597534306d346f704f456e6e6a54794e31522b46324f7137576a585267415a62625464476c4b4e317a597234455a48786d6e6f6c6d6d6d7175795761626272344a5a3578797a6b6c6e6e586265475541424144733d646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141414d67414141444942414d414141426664724f74414141414b6c424d5645582f2f2f392f66332b2f76372f76372b2b506a342f6633392f507a382b7672363977634843666e3539675947424151454251554641774d4442344e75365541414146626b6c4551565234327532594f342f54514253466a2b30346d345847446c6b324378524f6545506a514241764959553353425142566767515255433871325746654853424345535a425945514e47454230644c514979465238354d347839776c4e5a4f47596a3674542b624f7a643662735433586e6f4848342f463450423650782b5078654477656a38666a3858676d3544525771505341657830326c684b5a6c31666b33706f56755571764332466a334d775144793842635739655a6d415364316f536d663339634349494b496658367666505a696750697a4333674f6a7734554973553568564a4147634f4235494757473674796f446e6f7a41356f434238304d6d774645657932636d534c4b38493066305952304432756d796e7836593043726c6c4c4131515a496d6b775235526145436e7136464e68436a6f766972545467516352324965485763694e64335558367949554f557a673135645867546c644d5a53613333523070504f4d3634317445744e6f444838372b78794b4e39464d625a544c4a4169644f756d6d4f4869517678456d58514d69744b466c554d48374b354b6c4b53594f777763533651795451447a682f70496c776f6762513153564d3247673247766a6545484359754e4a566b634a6c6c6178436f5141355549456332686c4b326b306d363132454f69684e394257752f7a466a416f4f72556847776c4b59344b2b35366b357041346b613776556c5567752b68616e5a5670535662527949766e69596b544561737746702b7a3865565244336a4b326a6831354167513739696931706b65676f66723873496863557a535a4953623976536c354a52646c4c6a4a4a47725271303464456f2f6e3339416369524f51654535537055537a356b43515568414f4d5348334d36424973692f75414b30706d7056795a6f34415248356e397335526f694f4d74655a59446a515661797559365259536377536152644d7a4e4b646d61547177703879417056333835397165455563536675556736705a4f44706f503258716d6f6c6d4e4b51377353786c6850745249734b6a4c51624d7473776c7a6b495176666569446632344d464f767375684577677a664677386e69582f727255504234694a452b7533426839743548366e774830616648666544636f78796f4e426972314f6756446c373854555067644f4d7a734c51706751766c336b5977646b625239513237494f72435a70676a5569764f4a4a7668386677444779586c3347346e696a324952615250612b703762745045356754754d7471713751736d57463630794f4d71636c4866752f6f5644746a73526a565471324f79617a6e546d42673175516d624a776b645569663262576573616332352b656858495a626b376c622b374a7171774b564e484e3262386e66334a4d456d4a6d6e70496b7a564568504655703279656a617476744b734f5a7850313233565151737854674b727a4e56496475522b75765155744e73703339637278474c646a352f5a4d326251707031667a7432547846567049324736567a427070466f7231484c6574386479725a426d65474d74614131456838667a66394661707054536e486f776f316e50596352667065594e523444456b53615057314848717552757a57374457764b6151584650636c627676574754676a7339467330614233453137624e65316e766d726133726d62676d435853534b75464b6b6748595373424d385a6245764438774d706e6f644f32774b726c7961765378744455787230794a65354a4c3864437135455a646b3756347a514b734a30732f544d7a374d78715a4f4243384b4a3469494e7636514c7557362f786b616d336868616c2b2f754f4e48395a7a69563969652f34336c6c4c64776b57427446576e395248726d55366c56336930352b42455671772f4935766b347a356850526669446c575a4e6b34373171357777614b316130715835745a5871765535392b754b57715935646255595642644f424a4a53626e554555574a39612f58794f77637457392f5332314b6668754f65354f684b526279625768495a6b71614e382b514f6a596c567a496c6266775a69746230664a6459337741326769686b745372543256704975723434542b7264543655685071524f3873577266724f394176594e6f746a36555131666950567633556e67382f786c78565449726d654f52774b42707535314767784d326e4a6c674f54632f786571305478754634795179626264546c44766e676131424467653071576d727a743149624c65546d35396d33704b454d6e6438474e4962756c5268323954454f3543706e71314574666b703039624739304e6c796c5146556a696854553162507a2b774e625532507776546b6e7849763171535a696c33587365546676484c62586467674d544d532f6257616b6b5371764d477a76314e47615670753533612f43784d322b3238754a563931342f77653265335462415646556e4f4e5876556d37623561655a6d6b433038726a573778646155782b5078654477656a38666a38586738486f2f48342f46345042345866674f5742656a43767a2f41474141414141424a52553545726b4a6767673d3d646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141414867414141415443414d414141427369546c35414141413831424d5645582f2f2f3845427766382f507a7838664833392f66563164584477384f76734c44683475494d44772f3139665846787361636e5a332b2f763775372b2f6a354f537873724b6e714b69666f4b43576c356548694969516b5a474b6a497a352b666e6f36656d71724b7a6232397532743765556c5a58372b2f763239766272362b766d357562643364325a6d7072743765336633392f4d7a4d792f774d4337764c793475626d3074625769704b522b674942376658335a32646e583139665130644634656e724e7a73374a7973717372613245686f5a796448526e61576b314f446a733765326b707161686f714b546c4a534e6a343836504477554678653976723551556c4a4d546b3547534567764d6a4c5330744c48794d68756348426a5a4752625856315757466941676f49634868354352455265594741704c53306b4a7963694a43513547773575414141442b6b6c4551565249782b315578323762514253635a566368785335536f716a65653747364c636d3259746c4f2b2f2b764364394b43487a494955674f7565534257474477794a32334d3850462f2f7264457334616f4539486637474466582b486b6e6d2f6a416c30377063427067506e6d6265634a7a654e376c753251716a342b614968452f55315542305a612b474f705377437564664846674a2f722f4a573576375952505030575347676e493479707337674f7548626169636836336b436749416c583473504c4f55434b447978314d514930657878716e65574d6d634b72444f413944316a626a35624c7531456d696e46324a332b6e624658616b305957776b484f643256415651756a4333786962484c477367666b2f636b71344661446f4436774667316b3046622b556a7333346748436646342f70465962583467526f324938636859523339687165774859716c4e784d4758472f45583479647846647550784d6c445571394936745653346c4b765873706f446d727954657046476d6266766b6e396d6b6a743361544f71324e414b437134537633356b456a746d7751536c533879354d74707871562b50435653527a65702b797550704934452f486d6c5377426943583963656d613568534337573436476931364d77696666344b6a7a457570516c7230306765636f5730647530712f7a316934376b42477842345741364e34564944716670727856384f774771746d647a45484e716144384e736e786c757133536d6776357a6f414938565352636e464d414b674f586832784e66454677426f6657555048573346574169676274557a52624a32516d4e49746742662f33594e562b7779646f39747370443944564f637a6f324f334441544d6e47756a553251363276696e574a526269524754346b72435a637431474151636335477751715333562f34664f2b4d7163396647624d426a467070635336736b706249335a4a476c6e3569715155644f456e53553336664c427139324558684d464971504772566778476236524e6a5238704a456b30726430347856715145336246484b572b37586f4f4d552f76524746627171344c7268706341412f59344a4c52784a315745372b387a6e6564705a2b6d6f75773533612f7a3949597668452f386a415758694b386938395673457a4d566b6a4d3633464645683766763747432f734b4f46665673365a415548747745466746344831786851344774576153474a793571687574324e49472f4d3662526a31413754334c686444367467694a4f56367736473855555749716c586d716c6d6d694649596972773164676f43716f354d6f735639716164494337485634304d456d61786f46566f3166766546526b385a7a74634f435a2b504e4f734156314d32464b3553545a4432384a42336962666231743477362b55386b575a583555775061715a4a5a49497464377549354761507771584d70596c523866494c736c557249743739444e63324356646c446c6e6c7157366a30327a4e6b6f582b706b777368554659523853483977576a4268657854366479594b6a5659726b306f776e6c4c68717461575974744d66415542464c5a7350556b4e556f58415a55725674466f557668476852395464714839706e6b334e716274714136505535637348745a57637875396d4e437533417868684e365370375132664d6b6a46782b78744a736f58703448737833494e5431617971366538386b5a4739394264744e31496e70584836786e38345032674d2b757a424b4136567148565435584155514b6a6e77536a666f756931635778697564614261466e357843526c6b745448557236684f37713570416441496445437243427849636834513548385a36682f55326d3967642b5a56564141414141424a52553545726b4a6767673d3da264697066735822122043f4caf8d59ca13926d5560b8158baf5353d18bb7f2b36643fc4296af3b4f51064736f6c63430008000033

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.