ETH Price: $3,306.54 (+2.05%)
Gas: 4 Gwei

Token

HyperCube 01 \ Window to the Soul (HCWTTS)
 

Overview

Max Total Supply

82 HCWTTS

Holders

53

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
electralina.eth
Balance
13 HCWTTS
0x8cbedD1a40BCD5D8162Af592bC53fE494F9Bb10E
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:
HyperCubeCurated

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : Hypercube.sol
/** 
   _____       __  __     __  __     ______   ______     ______     ______     __  __     ______     ______    
  /\ _   \    /\ \_\ \   /\ \_\ \   /\  == \ /\  ___\   /\  == \   /\  ___\   /\ \/\ \   /\  == \   /\  ___\ 
 /  /_/\__\   \ \  __ \  \ \____ \  \ \  _-/ \ \  __\   \ \  __<   \ \ \____  \ \ \_\ \  \ \  __<   \ \  __\   
 \  \_\/  /    \ \_\ \_\  \/\_____\  \ \_\    \ \_____\  \ \_\ \_\  \ \_____\  \ \_____\  \ \_____\  \ \_____\ 
  \/_____/      \/_/\/_/   \/_____/   \/_/     \/_____/   \/_/ /_/   \/_____/   \/_____/   \/_____/   \/_____/ 

**/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";

contract HyperCubeCurated is ERC721Upgradeable, OwnableUpgradeable {

    using CountersUpgradeable for CountersUpgradeable.Counter;
    using StringsUpgradeable for uint256;

    uint256 private constant MAX_ARTIST_CHOICE = 10;
    uint256 private constant MAX_ITEMS = 1000;

    CountersUpgradeable.Counter private _tokenIds;

    uint256 public itemStartPrice;
    uint256 public itemEndPrice;
    uint256 public totalSupply;
    uint256 public artistChoiceMinted;
    uint256 private publicSaleDuration;
    uint256 private publicSaleStartTime;
    bool public publicSale;
    string internal baseURI;
    mapping(uint256 => bytes32) public tokenIdToHash;
    mapping(uint256 => bool) public artistChoices;
    mapping(bytes32 => uint256) private hashToTokenId;
    address public _artistAddress;
    uint256 private _totalShares;
    address[] private _payees;
    mapping(address => uint256) private _shares;
    string[] public scripts;
    string public scriptIPFSHash;

    modifier onlyArtist() {
        require( (owner() == _msgSender() || _artistAddress == _msgSender()), "only artist or owner can call");
        _;
    }

    function initialize(string memory _tokenName, string memory _tokenSymbol) initializer public {
        __ERC721_init(_tokenName, _tokenSymbol);
        __Ownable_init();
        totalSupply = 0;
        artistChoiceMinted = 0;
        _artistAddress = owner();
        publicSale = false;
        itemStartPrice = 0;
        itemEndPrice = 0;
        _totalShares = 0;
    }

    function startPublicSale(uint256 saleDuration, uint256 saleStartPrice, uint256 saleEndPrice) external onlyOwner {
        require(!publicSale, "Public sale has already begun");
        publicSaleDuration = saleDuration;
        itemStartPrice = saleStartPrice; // in case we need to restart after pause 
        itemEndPrice = saleEndPrice; // in case we need to restart after pause 
        publicSaleStartTime = block.timestamp;
        publicSale = true;
    }

    function pausePublicSale() external onlyOwner {
        publicSaleStartTime = 0;
        publicSale = false;
    }

    // generate hash
    function _generateHash() internal view returns (bytes32) {        
            return keccak256(abi.encodePacked(totalSupply, block.number, block.timestamp, msg.sender));
    }

    //purchase to
    function purchaseTo(address _to) public payable {
        require(publicSale, "Sale not started"); 
        require(totalSupply + 1 <= MAX_ITEMS, "MaxSupply");
        require(msg.value >= getMintPrice(), "low eth");
        _mintToken(_to, _generateHash());
    }

    //mint to with token hash, onlyArtist 
    function mintToWithHash(address _to, bytes32 _tokenHash) public onlyArtist {
        require(totalSupply + 1 <= MAX_ITEMS, "MaxSupply");
        require(hashToTokenId[_tokenHash] == 0, "hash already exists");
        require(artistChoiceMinted < MAX_ARTIST_CHOICE, "all artist choice minted"); 
        artistChoiceMinted++;
        artistChoices[totalSupply+1] = true;
        _mintToken(_to, _tokenHash);
    }

    // admin minting
    function adminMint(address _to, bytes32 _tokenHash) public onlyOwner {
        require(totalSupply + 1 <= MAX_ITEMS, "MaxSupply");
        bytes32 tokenHash = (_tokenHash.length != 64) ? _generateHash() : bytes32(_tokenHash); 
        _mintToken(_to, tokenHash);
    }

    //mint token
    function _mintToken(address _to, bytes32 _tokenHash) internal {
        _tokenIds.increment(); 
        uint256 newItemId = _tokenIds.current();
        _safeMint(_to, newItemId);
        totalSupply++;
       
        tokenIdToHash[newItemId] = _tokenHash; 
        hashToTokenId[_tokenHash] = newItemId;
    }

    // Owner can fix hash if Artist uploaded incorrect one, like too short
    function fixHash(uint256 _tokenId, bytes32 _newTokenHash) public onlyOwner {
        tokenIdToHash[_tokenId] = _newTokenHash; 
    }

    //Metadata
    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "!token");
        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }

    //store JS
    function addScript(string memory _script) public onlyOwner {
        scripts.push(_script);
    }

    function updateScript(uint256 _index, string memory _newScript) public onlyOwner {
        scripts[_index] = _newScript;
    }

    function setScriptIPFSHash(string memory _ipfsHash) public onlyOwner {
        scriptIPFSHash = _ipfsHash;
    } 

    //AUCTION
    function getElapsedSaleTime() internal view returns (uint256) {
        return publicSaleStartTime > 0 ? block.timestamp - publicSaleStartTime : 0;
    }

    function getRemainingSaleTime() external view returns (uint256) {
        if (publicSaleStartTime == 0) {
            return 604800; //one week, means public sale has not started yet or is paused
        }
        if (getElapsedSaleTime() >= publicSaleDuration) {
            return 0;
        }
        return (publicSaleStartTime + publicSaleDuration) - block.timestamp;
    }

    function getMintPrice() public view returns (uint256) {
        if (!publicSale) {
            return 0;
        }
        uint256 elapsed = getElapsedSaleTime();
        if (elapsed >= publicSaleDuration) {
            return itemEndPrice;
        } else {
            int256 tempPrice = int256(itemStartPrice) +
                ((int256(itemEndPrice) -
                    int256(itemStartPrice)) /
                    int256(publicSaleDuration)) *
                int256(elapsed);
            uint256 currentPrice = uint256(tempPrice);
            return
                currentPrice > itemEndPrice
                    ? currentPrice
                    : itemEndPrice;
        }
    }

    // returns script code
    function projectScriptByIndex(uint256 _index) view public returns (string memory){
        return scripts[_index];
    }

    //set Artist
    function setArtist(address _newArtistAddress) public onlyOwner {
        require(_newArtistAddress != address(0), "PaymentSplitter: account is the zero address");
        _artistAddress = _newArtistAddress; 
    }

    //withdraw!
    function withdraw(uint256 amount) public onlyArtist {
        require(_totalShares != 0, "nobody to withdraw");
        for (uint256 i=0; i<_payees.length ; i++) {
            address payee = _payees[i];
            uint256 payment = amount * _shares[payee] / _totalShares;
            AddressUpgradeable.sendValue(payable(payee), payment);
        }
    }

    /**
     * @dev Add a new payee to the contract or change shares for the existing one.
     * @param account The address of the payee to add.
     * @param accShare The number of shares owned by the payee.
     */
    function _setPayee(address account, uint256 accShare) public onlyOwner {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(accShare > 0, "PaymentSplitter: shares are 0");

        if (_shares[account] == 0) {
            _payees.push(account);
        }    
        _shares[account] = accShare;
        updateShares();
    }

    function updateShares() internal {
        _totalShares = 0;
        for (uint i = 0; i < _payees.length; i++) {
            _totalShares = _totalShares + _shares[_payees[i]];
        }
    }

}

File 2 of 13 : ERC721Upgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721Upgradeable.sol";
import "./IERC721ReceiverUpgradeable.sol";
import "./extensions/IERC721MetadataUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/StringsUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {
    using AddressUpgradeable for address;
    using StringsUpgradeable 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.
     */
    function __ERC721_init(string memory name_, string memory symbol_) internal initializer {
        __Context_init_unchained();
        __ERC165_init_unchained();
        __ERC721_init_unchained(name_, symbol_);
    }

    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
        return
            interfaceId == type(IERC721Upgradeable).interfaceId ||
            interfaceId == type(IERC721MetadataUpgradeable).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 = ERC721Upgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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(ERC721Upgradeable.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(ERC721Upgradeable.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 IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721ReceiverUpgradeable.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 {}
    uint256[44] private __gap;
}

File 3 of 13 : OwnableUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        _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);
    }
    uint256[49] private __gap;
}

File 4 of 13 : CountersUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library CountersUpgradeable {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 13 : AddressUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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 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 6 of 13 : IERC721Upgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721Upgradeable is IERC165Upgradeable {
    /**
     * @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 7 of 13 : IERC721ReceiverUpgradeable.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 IERC721ReceiverUpgradeable {
    /**
     * @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 8 of 13 : IERC721MetadataUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721Upgradeable.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
    /**
     * @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 9 of 13 : ContextUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";

/**
 * @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 ContextUpgradeable is Initializable {
    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}

File 10 of 13 : StringsUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library StringsUpgradeable {
    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 13 : ERC165Upgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable {
    function __ERC165_init() internal initializer {
        __ERC165_init_unchained();
    }

    function __ERC165_init_unchained() internal initializer {
    }
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165Upgradeable).interfaceId;
    }
    uint256[50] private __gap;
}

File 12 of 13 : Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

File 13 of 13 : IERC165Upgradeable.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 IERC165Upgradeable {
    /**
     * @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);
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_artistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"accShare","type":"uint256"}],"name":"_setPayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_script","type":"string"}],"name":"addScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_tokenHash","type":"bytes32"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artistChoiceMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artistChoices","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"},{"internalType":"bytes32","name":"_newTokenHash","type":"bytes32"}],"name":"fixHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemEndPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemStartPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_tokenHash","type":"bytes32"}],"name":"mintToWithHash","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":"pausePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"projectScriptByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"purchaseTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"scriptIPFSHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"scripts","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newArtistAddress","type":"address"}],"name":"setArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"setScriptIPFSHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleDuration","type":"uint256"},{"internalType":"uint256","name":"saleStartPrice","type":"uint256"},{"internalType":"uint256","name":"saleEndPrice","type":"uint256"}],"name":"startPublicSale","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":"","type":"uint256"}],"name":"tokenIdToHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"string","name":"_newScript","type":"string"}],"name":"updateScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615ad280620000216000396000f3fe60806040526004361061025c5760003560e01c80636352211e11610144578063b155d57e116100b6578063d15776561161007a578063d1577656146108e2578063d4c97533146108fe578063e0b212bb14610927578063e985e9c514610964578063f2fde38b146109a1578063f908108e146109ca5761025c565b8063b155d57e146107eb578063b88d4fde14610814578063c32816181461083d578063c748747d14610868578063c87b56dd146108a55761025c565b80638da5cb5b116101085780638da5cb5b146106ed57806393dd64461461071857806395d61c741461074357806395d89b411461076c578063a22cb46514610797578063a7f93ebd146107c05761025c565b80636352211e1461060a57806370a0823114610647578063715018a614610684578063831321491461069b57806388c6d35c146106c45761025c565b806333bc1c5c116101dd5780634cd88b76116101a15780634cd88b76146104fe57806355f804b314610527578063567ac4f61461055057806357cb08fb1461057b5780636003083e146105a4578063621a1f74146105cd5761025c565b806333bc1c5c1461042b5780633b37fca8146104565780633c0c0660146104815780633e8a47b9146104ac57806342842e0e146104d55761025c565b80630a2fa8c8116102245780630a2fa8c81461036c5780630c41f4971461039757806318160ddd146103ae57806323b872dd146103d95780632e1a7d4d146104025761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c957806308ff7f6114610306578063095ea7b314610343575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613f68565b6109f3565b6040516102959190614803565b60405180910390f35b3480156102aa57600080fd5b506102b3610ad5565b6040516102c09190614839565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190614067565b610b67565b6040516102fd919061479c565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190614067565b610bec565b60405161033a9190614839565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190613f2c565b610c98565b005b34801561037857600080fd5b50610381610db0565b60405161038e9190614bfb565b60405180910390f35b3480156103a357600080fd5b506103ac610db6565b005b3480156103ba57600080fd5b506103c3610e57565b6040516103d09190614bfb565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613dea565b610e5d565b005b34801561040e57600080fd5b5061042960048036038101906104249190614067565b610ebd565b005b34801561043757600080fd5b506104406110d6565b60405161044d9190614803565b60405180910390f35b34801561046257600080fd5b5061046b6110e9565b6040516104789190614839565b60405180910390f35b34801561048d57600080fd5b50610496611177565b6040516104a39190614bfb565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce9190613f2c565b61117d565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190613dea565b6113a8565b005b34801561050a57600080fd5b5061052560048036038101906105209190613ffb565b6113c8565b005b34801561053357600080fd5b5061054e60048036038101906105499190613fba565b611540565b005b34801561055c57600080fd5b506105656115d6565b6040516105729190614bfb565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190614090565b611627565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190613ef0565b6116bf565b005b3480156105d957600080fd5b506105f460048036038101906105ef9190614067565b6117bd565b604051610601919061481e565b60405180910390f35b34801561061657600080fd5b50610631600480360381019061062c9190614067565b6117d5565b60405161063e919061479c565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190613d85565b611887565b60405161067b9190614bfb565b60405180910390f35b34801561069057600080fd5b5061069961193f565b005b3480156106a757600080fd5b506106c260048036038101906106bd9190614120565b6119c7565b005b3480156106d057600080fd5b506106eb60048036038101906106e69190613ef0565b611acf565b005b3480156106f957600080fd5b50610702611cf8565b60405161070f919061479c565b60405180910390f35b34801561072457600080fd5b5061072d611d22565b60405161073a919061479c565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190613fba565b611d48565b005b34801561077857600080fd5b50610781611dde565b60405161078e9190614839565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190613eb4565b611e70565b005b3480156107cc57600080fd5b506107d5611ff1565b6040516107e29190614bfb565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d91906140cc565b61208a565b005b34801561082057600080fd5b5061083b60048036038101906108369190613e39565b612163565b005b34801561084957600080fd5b506108526121c5565b60405161085f9190614bfb565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190614067565b6121cb565b60405161089c9190614839565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190614067565b6122a1565b6040516108d99190614839565b60405180910390f35b6108fc60048036038101906108f79190613d85565b61231d565b005b34801561090a57600080fd5b5061092560048036038101906109209190613d85565b61241d565b005b34801561093357600080fd5b5061094e60048036038101906109499190614067565b61254d565b60405161095b9190614803565b60405180910390f35b34801561097057600080fd5b5061098b60048036038101906109869190613dae565b61256d565b6040516109989190614803565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c39190613d85565b612601565b005b3480156109d657600080fd5b506109f160048036038101906109ec9190613fba565b6126f9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610abe57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ace5750610acd826127b4565b5b9050919050565b606060658054610ae490615188565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1090615188565b8015610b5d5780601f10610b3257610100808354040283529160200191610b5d565b820191906000526020600020905b815481529060010190602001808311610b4057829003601f168201915b5050505050905090565b6000610b728261281e565b610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890614b1b565b60405180910390fd5b6069600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60d98181548110610bfc57600080fd5b906000526020600020016000915090508054610c1790615188565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4390615188565b8015610c905780601f10610c6557610100808354040283529160200191610c90565b820191906000526020600020905b815481529060010190602001808311610c7357829003601f168201915b505050505081565b6000610ca3826117d5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b90614b7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d3361288a565b73ffffffffffffffffffffffffffffffffffffffff161480610d625750610d6181610d5c61288a565b61256d565b5b610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890614a1b565b60405180910390fd5b610dab8383612892565b505050565b60ca5481565b610dbe61288a565b73ffffffffffffffffffffffffffffffffffffffff16610ddc611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2990614b3b565b60405180910390fd5b600060cf81905550600060d060006101000a81548160ff021916908315150217905550565b60cc5481565b610e6e610e6861288a565b8261294b565b610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea490614b9b565b60405180910390fd5b610eb8838383612a29565b505050565b610ec561288a565b73ffffffffffffffffffffffffffffffffffffffff16610ee3611cf8565b73ffffffffffffffffffffffffffffffffffffffff161480610f595750610f0861288a565b73ffffffffffffffffffffffffffffffffffffffff1660d560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f9061491b565b60405180910390fd5b600060d6541415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590614adb565b60405180910390fd5b60005b60d7805490508110156110d257600060d7828154811061102a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060d65460d860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856110a79190614f9c565b6110b19190614e54565b90506110bd8282612c85565b505080806110ca906151eb565b915050610fe1565b5050565b60d060009054906101000a900460ff1681565b60da80546110f690615188565b80601f016020809104026020016040519081016040528092919081815260200182805461112290615188565b801561116f5780601f106111445761010080835404028352916020019161116f565b820191906000526020600020905b81548152906001019060200180831161115257829003601f168201915b505050505081565b60cb5481565b61118561288a565b73ffffffffffffffffffffffffffffffffffffffff166111a3611cf8565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090614b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611260906148bb565b60405180910390fd5b600081116112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390614bdb565b60405180910390fd5b600060d860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156113585760d7829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8060d860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a4612d79565b5050565b6113c383838360405180602001604052806000815250612163565b505050565b600060019054906101000a900460ff16806113ee575060008054906101000a900460ff16155b61142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490614a9b565b60405180910390fd5b60008060019054906101000a900460ff16159050801561147d576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6114878383612e5e565b61148f612f53565b600060cc81905550600060cd819055506114a7611cf8565b60d560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060d060006101000a81548160ff021916908315150217905550600060ca81905550600060cb81905550600060d681905550801561153b5760008060016101000a81548160ff0219169083151502179055505b505050565b61154861288a565b73ffffffffffffffffffffffffffffffffffffffff16611566611cf8565b73ffffffffffffffffffffffffffffffffffffffff16146115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390614b3b565b60405180910390fd5b8060d190805190602001906115d2929190613b94565b5050565b60008060cf5414156115ed5762093a809050611624565b60ce546115f861303c565b106116065760009050611624565b4260ce5460cf546116179190614d94565b611621919061508a565b90505b90565b61162f61288a565b73ffffffffffffffffffffffffffffffffffffffff1661164d611cf8565b73ffffffffffffffffffffffffffffffffffffffff16146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90614b3b565b60405180910390fd5b8060d26000848152602001908152602001600020819055505050565b6116c761288a565b73ffffffffffffffffffffffffffffffffffffffff166116e5611cf8565b73ffffffffffffffffffffffffffffffffffffffff161461173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290614b3b565b60405180910390fd5b6103e8600160cc5461174d9190614d94565b111561178e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117859061485b565b60405180910390fd5b60006040602060ff1614156117a357816117ac565b6117ab613062565b5b90506117b88382613098565b505050565b60d26020528060005260406000206000915090505481565b6000806067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187590614a7b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90614a5b565b60405180910390fd5b606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61194761288a565b73ffffffffffffffffffffffffffffffffffffffff16611965611cf8565b73ffffffffffffffffffffffffffffffffffffffff16146119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290614b3b565b60405180910390fd5b6119c56000613107565b565b6119cf61288a565b73ffffffffffffffffffffffffffffffffffffffff166119ed611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90614b3b565b60405180910390fd5b60d060009054906101000a900460ff1615611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a9061487b565b60405180910390fd5b8260ce819055508160ca819055508060cb819055504260cf81905550600160d060006101000a81548160ff021916908315150217905550505050565b611ad761288a565b73ffffffffffffffffffffffffffffffffffffffff16611af5611cf8565b73ffffffffffffffffffffffffffffffffffffffff161480611b6b5750611b1a61288a565b73ffffffffffffffffffffffffffffffffffffffff1660d560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba19061491b565b60405180910390fd5b6103e8600160cc54611bbc9190614d94565b1115611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf49061485b565b60405180910390fd5b600060d460008381526020019081526020016000205414611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90614a3b565b60405180910390fd5b600a60cd5410611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90614afb565b60405180910390fd5b60cd6000815480929190611cab906151eb565b9190505550600160d36000600160cc54611cc59190614d94565b815260200190815260200160002060006101000a81548160ff021916908315150217905550611cf48282613098565b5050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60d560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d5061288a565b73ffffffffffffffffffffffffffffffffffffffff16611d6e611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb90614b3b565b60405180910390fd5b8060da9080519060200190611dda929190613b94565b5050565b606060668054611ded90615188565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1990615188565b8015611e665780601f10611e3b57610100808354040283529160200191611e66565b820191906000526020600020905b815481529060010190602001808311611e4957829003601f168201915b5050505050905090565b611e7861288a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd9061495b565b60405180910390fd5b80606a6000611ef361288a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fa061288a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fe59190614803565b60405180910390a35050565b600060d060009054906101000a900460ff166120105760009050612087565b600061201a61303c565b905060ce5481106120305760cb54915050612087565b60008160ce5460ca5460cb546120469190614ff6565b6120509190614dea565b61205a9190614e85565b60ca546120679190614d00565b9050600081905060cb54811161207f5760cb54612081565b805b93505050505b90565b61209261288a565b73ffffffffffffffffffffffffffffffffffffffff166120b0611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd90614b3b565b60405180910390fd5b8060d98381548110612141577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001908051906020019061215e929190613b94565b505050565b61217461216e61288a565b8361294b565b6121b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121aa90614b9b565b60405180910390fd5b6121bf848484846131cd565b50505050565b60cd5481565b606060d98281548110612207577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805461221c90615188565b80601f016020809104026020016040519081016040528092919081815260200182805461224890615188565b80156122955780601f1061226a57610100808354040283529160200191612295565b820191906000526020600020905b81548152906001019060200180831161227857829003601f168201915b50505050509050919050565b60606122ac8261281e565b6122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e2906149fb565b60405180910390fd5b60d16122f683613229565b604051602001612307929190614715565b6040516020818303038152906040529050919050565b60d060009054906101000a900460ff1661236c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612363906149db565b60405180910390fd5b6103e8600160cc5461237e9190614d94565b11156123bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b69061485b565b60405180910390fd5b6123c7611ff1565b341015612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240090614bbb565b60405180910390fd5b61241a81612415613062565b613098565b50565b61242561288a565b73ffffffffffffffffffffffffffffffffffffffff16612443611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614612499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249090614b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612500906148bb565b60405180910390fd5b8060d560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60d36020528060005260406000206000915054906101000a900460ff1681565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61260961288a565b73ffffffffffffffffffffffffffffffffffffffff16612627611cf8565b73ffffffffffffffffffffffffffffffffffffffff161461267d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267490614b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e4906148db565b60405180910390fd5b6126f681613107565b50565b61270161288a565b73ffffffffffffffffffffffffffffffffffffffff1661271f611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614b3b565b60405180910390fd5b60d9819080600181540180825580915050600190039060005260206000200160009091909190915090805190602001906127b0929190613b94565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816069600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612905836117d5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129568261281e565b612995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298c906149bb565b60405180910390fd5b60006129a0836117d5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a0f57508373ffffffffffffffffffffffffffffffffffffffff166129f784610b67565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a205750612a1f818561256d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a49826117d5565b73ffffffffffffffffffffffffffffffffffffffff1614612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9690614b5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b069061493b565b60405180910390fd5b612b1a8383836133d6565b612b25600082612892565b6001606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b75919061508a565b925050819055506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bcc9190614d94565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbf9061499b565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612cee90614739565b60006040518083038185875af1925050503d8060008114612d2b576040519150601f19603f3d011682016040523d82523d6000602084013e612d30565b606091505b5050905080612d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6b9061497b565b60405180910390fd5b505050565b600060d68190555060005b60d780549050811015612e5b5760d8600060d78381548110612dcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460d654612e429190614d94565b60d6819055508080612e53906151eb565b915050612d84565b50565b600060019054906101000a900460ff1680612e84575060008054906101000a900460ff16155b612ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eba90614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612f13576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612f1b6133db565b612f236134b4565b612f2d838361358d565b8015612f4e5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612f79575060008054906101000a900460ff16155b612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf90614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613008576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6130106133db565b613018613696565b80156130395760008060016101000a81548160ff0219169083151502179055505b50565b60008060cf541161304e57600061305d565b60cf544261305c919061508a565b5b905090565b600060cc5443423360405160200161307d949392919061474e565b60405160208183030381529060405280519060200120905090565b6130a260c961377f565b60006130ae60c9613795565b90506130ba83826137a3565b60cc60008154809291906130cd906151eb565b91905055508160d26000838152602001908152602001600020819055508060d4600084815260200190815260200160002081905550505050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131d8848484612a29565b6131e4848484846137c1565b613223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321a9061489b565b60405180910390fd5b50505050565b60606000821415613271576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133d1565b600082905060005b600082146132a357808061328c906151eb565b915050600a8261329c9190614e54565b9150613279565b60008167ffffffffffffffff8111156132e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133175781602001600182028036833780820191505090505b5090505b600085146133ca57600182613330919061508a565b9150600a8561333f9190615262565b603061334b9190614d94565b60f81b818381518110613387577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133c39190614e54565b945061331b565b8093505050505b919050565b505050565b600060019054906101000a900460ff1680613401575060008054906101000a900460ff16155b613440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343790614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613490576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156134b15760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806134da575060008054906101000a900460ff16155b613519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351090614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613569576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561358a5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806135b3575060008054906101000a900460ff16155b6135f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e990614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613642576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8260659080519060200190613658929190613b94565b50816066908051906020019061366f929190613b94565b5080156136915760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806136bc575060008054906101000a900460ff16155b6136fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f290614a9b565b60405180910390fd5b60008060019054906101000a900460ff16159050801561374b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61375b61375661288a565b613107565b801561377c5760008060016101000a81548160ff0219169083151502179055505b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b6137bd828260405180602001604052806000815250613958565b5050565b60006137e28473ffffffffffffffffffffffffffffffffffffffff166139b3565b1561394b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261380b61288a565b8786866040518563ffffffff1660e01b815260040161382d94939291906147b7565b602060405180830381600087803b15801561384757600080fd5b505af192505050801561387857506040513d601f19601f820116820180604052508101906138759190613f91565b60015b6138fb573d80600081146138a8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ad565b606091505b506000815114156138f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ea9061489b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613950565b600190505b949350505050565b61396283836139c6565b61396f60008484846137c1565b6139ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a59061489b565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2d90614abb565b60405180910390fd5b613a3f8161281e565b15613a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a76906148fb565b60405180910390fd5b613a8b600083836133d6565b6001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613adb9190614d94565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613ba090615188565b90600052602060002090601f016020900481019282613bc25760008555613c09565b82601f10613bdb57805160ff1916838001178555613c09565b82800160010185558215613c09579182015b82811115613c08578251825591602001919060010190613bed565b5b509050613c169190613c1a565b5090565b5b80821115613c33576000816000905550600101613c1b565b5090565b6000613c4a613c4584614c3b565b614c16565b905082815260208101848484011115613c6257600080fd5b613c6d848285615146565b509392505050565b6000613c88613c8384614c6c565b614c16565b905082815260208101848484011115613ca057600080fd5b613cab848285615146565b509392505050565b600081359050613cc281615a29565b92915050565b600081359050613cd781615a40565b92915050565b600081359050613cec81615a57565b92915050565b600081359050613d0181615a6e565b92915050565b600081519050613d1681615a6e565b92915050565b600082601f830112613d2d57600080fd5b8135613d3d848260208601613c37565b91505092915050565b600082601f830112613d5757600080fd5b8135613d67848260208601613c75565b91505092915050565b600081359050613d7f81615a85565b92915050565b600060208284031215613d9757600080fd5b6000613da584828501613cb3565b91505092915050565b60008060408385031215613dc157600080fd5b6000613dcf85828601613cb3565b9250506020613de085828601613cb3565b9150509250929050565b600080600060608486031215613dff57600080fd5b6000613e0d86828701613cb3565b9350506020613e1e86828701613cb3565b9250506040613e2f86828701613d70565b9150509250925092565b60008060008060808587031215613e4f57600080fd5b6000613e5d87828801613cb3565b9450506020613e6e87828801613cb3565b9350506040613e7f87828801613d70565b925050606085013567ffffffffffffffff811115613e9c57600080fd5b613ea887828801613d1c565b91505092959194509250565b60008060408385031215613ec757600080fd5b6000613ed585828601613cb3565b9250506020613ee685828601613cc8565b9150509250929050565b60008060408385031215613f0357600080fd5b6000613f1185828601613cb3565b9250506020613f2285828601613cdd565b9150509250929050565b60008060408385031215613f3f57600080fd5b6000613f4d85828601613cb3565b9250506020613f5e85828601613d70565b9150509250929050565b600060208284031215613f7a57600080fd5b6000613f8884828501613cf2565b91505092915050565b600060208284031215613fa357600080fd5b6000613fb184828501613d07565b91505092915050565b600060208284031215613fcc57600080fd5b600082013567ffffffffffffffff811115613fe657600080fd5b613ff284828501613d46565b91505092915050565b6000806040838503121561400e57600080fd5b600083013567ffffffffffffffff81111561402857600080fd5b61403485828601613d46565b925050602083013567ffffffffffffffff81111561405157600080fd5b61405d85828601613d46565b9150509250929050565b60006020828403121561407957600080fd5b600061408784828501613d70565b91505092915050565b600080604083850312156140a357600080fd5b60006140b185828601613d70565b92505060206140c285828601613cdd565b9150509250929050565b600080604083850312156140df57600080fd5b60006140ed85828601613d70565b925050602083013567ffffffffffffffff81111561410a57600080fd5b61411685828601613d46565b9150509250929050565b60008060006060848603121561413557600080fd5b600061414386828701613d70565b935050602061415486828701613d70565b925050604061416586828701613d70565b9150509250925092565b614178816150be565b82525050565b61418f61418a826150be565b615234565b82525050565b61419e816150d0565b82525050565b6141ad816150dc565b82525050565b60006141be82614cb2565b6141c88185614cc8565b93506141d8818560208601615155565b6141e18161534f565b840191505092915050565b60006141f782614cbd565b6142018185614ce4565b9350614211818560208601615155565b61421a8161534f565b840191505092915050565b600061423082614cbd565b61423a8185614cf5565b935061424a818560208601615155565b80840191505092915050565b6000815461426381615188565b61426d8186614cf5565b945060018216600081146142885760018114614299576142cc565b60ff198316865281860193506142cc565b6142a285614c9d565b60005b838110156142c4578154818901526001820191506020810190506142a5565b838801955050505b50505092915050565b60006142e2600983614ce4565b91506142ed8261536d565b602082019050919050565b6000614305601d83614ce4565b915061431082615396565b602082019050919050565b6000614328603283614ce4565b9150614333826153bf565b604082019050919050565b600061434b602c83614ce4565b91506143568261540e565b604082019050919050565b600061436e602683614ce4565b91506143798261545d565b604082019050919050565b6000614391601c83614ce4565b915061439c826154ac565b602082019050919050565b60006143b4601d83614ce4565b91506143bf826154d5565b602082019050919050565b60006143d7602483614ce4565b91506143e2826154fe565b604082019050919050565b60006143fa601983614ce4565b91506144058261554d565b602082019050919050565b600061441d603a83614ce4565b915061442882615576565b604082019050919050565b6000614440601d83614ce4565b915061444b826155c5565b602082019050919050565b6000614463602c83614ce4565b915061446e826155ee565b604082019050919050565b6000614486601083614ce4565b91506144918261563d565b602082019050919050565b60006144a9600683614ce4565b91506144b482615666565b602082019050919050565b60006144cc603883614ce4565b91506144d78261568f565b604082019050919050565b60006144ef601383614ce4565b91506144fa826156de565b602082019050919050565b6000614512602a83614ce4565b915061451d82615707565b604082019050919050565b6000614535602983614ce4565b915061454082615756565b604082019050919050565b6000614558602e83614ce4565b9150614563826157a5565b604082019050919050565b600061457b602083614ce4565b9150614586826157f4565b602082019050919050565b600061459e601283614ce4565b91506145a98261581d565b602082019050919050565b60006145c1601883614ce4565b91506145cc82615846565b602082019050919050565b60006145e4602c83614ce4565b91506145ef8261586f565b604082019050919050565b6000614607602083614ce4565b9150614612826158be565b602082019050919050565b600061462a602983614ce4565b9150614635826158e7565b604082019050919050565b600061464d602183614ce4565b915061465882615936565b604082019050919050565b6000614670600083614cd9565b915061467b82615985565b600082019050919050565b6000614693603183614ce4565b915061469e82615988565b604082019050919050565b60006146b6600783614ce4565b91506146c1826159d7565b602082019050919050565b60006146d9601d83614ce4565b91506146e482615a00565b602082019050919050565b6146f88161513c565b82525050565b61470f61470a8261513c565b615258565b82525050565b60006147218285614256565b915061472d8284614225565b91508190509392505050565b600061474482614663565b9150819050919050565b600061475a82876146fe565b60208201915061476a82866146fe565b60208201915061477a82856146fe565b60208201915061478a828461417e565b60148201915081905095945050505050565b60006020820190506147b1600083018461416f565b92915050565b60006080820190506147cc600083018761416f565b6147d9602083018661416f565b6147e660408301856146ef565b81810360608301526147f881846141b3565b905095945050505050565b60006020820190506148186000830184614195565b92915050565b600060208201905061483360008301846141a4565b92915050565b6000602082019050818103600083015261485381846141ec565b905092915050565b60006020820190508181036000830152614874816142d5565b9050919050565b60006020820190508181036000830152614894816142f8565b9050919050565b600060208201905081810360008301526148b48161431b565b9050919050565b600060208201905081810360008301526148d48161433e565b9050919050565b600060208201905081810360008301526148f481614361565b9050919050565b6000602082019050818103600083015261491481614384565b9050919050565b60006020820190508181036000830152614934816143a7565b9050919050565b60006020820190508181036000830152614954816143ca565b9050919050565b60006020820190508181036000830152614974816143ed565b9050919050565b6000602082019050818103600083015261499481614410565b9050919050565b600060208201905081810360008301526149b481614433565b9050919050565b600060208201905081810360008301526149d481614456565b9050919050565b600060208201905081810360008301526149f481614479565b9050919050565b60006020820190508181036000830152614a148161449c565b9050919050565b60006020820190508181036000830152614a34816144bf565b9050919050565b60006020820190508181036000830152614a54816144e2565b9050919050565b60006020820190508181036000830152614a7481614505565b9050919050565b60006020820190508181036000830152614a9481614528565b9050919050565b60006020820190508181036000830152614ab48161454b565b9050919050565b60006020820190508181036000830152614ad48161456e565b9050919050565b60006020820190508181036000830152614af481614591565b9050919050565b60006020820190508181036000830152614b14816145b4565b9050919050565b60006020820190508181036000830152614b34816145d7565b9050919050565b60006020820190508181036000830152614b54816145fa565b9050919050565b60006020820190508181036000830152614b748161461d565b9050919050565b60006020820190508181036000830152614b9481614640565b9050919050565b60006020820190508181036000830152614bb481614686565b9050919050565b60006020820190508181036000830152614bd4816146a9565b9050919050565b60006020820190508181036000830152614bf4816146cc565b9050919050565b6000602082019050614c1060008301846146ef565b92915050565b6000614c20614c31565b9050614c2c82826151ba565b919050565b6000604051905090565b600067ffffffffffffffff821115614c5657614c55615320565b5b614c5f8261534f565b9050602081019050919050565b600067ffffffffffffffff821115614c8757614c86615320565b5b614c908261534f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d0b82615112565b9150614d1683615112565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614d5157614d50615293565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614d8957614d88615293565b5b828201905092915050565b6000614d9f8261513c565b9150614daa8361513c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ddf57614dde615293565b5b828201905092915050565b6000614df582615112565b9150614e0083615112565b925082614e1057614e0f6152c2565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615614e4957614e48615293565b5b828205905092915050565b6000614e5f8261513c565b9150614e6a8361513c565b925082614e7a57614e796152c2565b5b828204905092915050565b6000614e9082615112565b9150614e9b83615112565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482116000841360008413161615614eda57614ed9615293565b5b817f80000000000000000000000000000000000000000000000000000000000000000583126000841260008413161615614f1757614f16615293565b5b827f80000000000000000000000000000000000000000000000000000000000000000582126000841360008412161615614f5457614f53615293565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0582126000841260008412161615614f9157614f90615293565b5b828202905092915050565b6000614fa78261513c565b9150614fb28361513c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614feb57614fea615293565b5b828202905092915050565b600061500182615112565b915061500c83615112565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561504757615046615293565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561507f5761507e615293565b5b828203905092915050565b60006150958261513c565b91506150a08361513c565b9250828210156150b3576150b2615293565b5b828203905092915050565b60006150c98261511c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615173578082015181840152602081019050615158565b83811115615182576000848401525b50505050565b600060028204905060018216806151a057607f821691505b602082108114156151b4576151b36152f1565b5b50919050565b6151c38261534f565b810181811067ffffffffffffffff821117156151e2576151e1615320565b5b80604052505050565b60006151f68261513c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561522957615228615293565b5b600182019050919050565b600061523f82615246565b9050919050565b600061525182615360565b9050919050565b6000819050919050565b600061526d8261513c565b91506152788361513c565b925082615288576152876152c2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d6178537570706c790000000000000000000000000000000000000000000000600082015250565b7f5075626c69632073616c652068617320616c726561647920626567756e000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6f6e6c7920617274697374206f72206f776e65722063616e2063616c6c000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f21746f6b656e0000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f6861736820616c72656164792065786973747300000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6e6f626f647920746f2077697468647261770000000000000000000000000000600082015250565b7f616c6c206172746973742063686f696365206d696e7465640000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6c6f772065746800000000000000000000000000000000000000000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b615a32816150be565b8114615a3d57600080fd5b50565b615a49816150d0565b8114615a5457600080fd5b50565b615a60816150dc565b8114615a6b57600080fd5b50565b615a77816150e6565b8114615a8257600080fd5b50565b615a8e8161513c565b8114615a9957600080fd5b5056fea2646970667358221220ca1338102b0a94406ba2bf2aea11892d3bd5ccf157b05c648de2563f73b9352b64736f6c63430008020033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80636352211e11610144578063b155d57e116100b6578063d15776561161007a578063d1577656146108e2578063d4c97533146108fe578063e0b212bb14610927578063e985e9c514610964578063f2fde38b146109a1578063f908108e146109ca5761025c565b8063b155d57e146107eb578063b88d4fde14610814578063c32816181461083d578063c748747d14610868578063c87b56dd146108a55761025c565b80638da5cb5b116101085780638da5cb5b146106ed57806393dd64461461071857806395d61c741461074357806395d89b411461076c578063a22cb46514610797578063a7f93ebd146107c05761025c565b80636352211e1461060a57806370a0823114610647578063715018a614610684578063831321491461069b57806388c6d35c146106c45761025c565b806333bc1c5c116101dd5780634cd88b76116101a15780634cd88b76146104fe57806355f804b314610527578063567ac4f61461055057806357cb08fb1461057b5780636003083e146105a4578063621a1f74146105cd5761025c565b806333bc1c5c1461042b5780633b37fca8146104565780633c0c0660146104815780633e8a47b9146104ac57806342842e0e146104d55761025c565b80630a2fa8c8116102245780630a2fa8c81461036c5780630c41f4971461039757806318160ddd146103ae57806323b872dd146103d95780632e1a7d4d146104025761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c957806308ff7f6114610306578063095ea7b314610343575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613f68565b6109f3565b6040516102959190614803565b60405180910390f35b3480156102aa57600080fd5b506102b3610ad5565b6040516102c09190614839565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190614067565b610b67565b6040516102fd919061479c565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190614067565b610bec565b60405161033a9190614839565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190613f2c565b610c98565b005b34801561037857600080fd5b50610381610db0565b60405161038e9190614bfb565b60405180910390f35b3480156103a357600080fd5b506103ac610db6565b005b3480156103ba57600080fd5b506103c3610e57565b6040516103d09190614bfb565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613dea565b610e5d565b005b34801561040e57600080fd5b5061042960048036038101906104249190614067565b610ebd565b005b34801561043757600080fd5b506104406110d6565b60405161044d9190614803565b60405180910390f35b34801561046257600080fd5b5061046b6110e9565b6040516104789190614839565b60405180910390f35b34801561048d57600080fd5b50610496611177565b6040516104a39190614bfb565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce9190613f2c565b61117d565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190613dea565b6113a8565b005b34801561050a57600080fd5b5061052560048036038101906105209190613ffb565b6113c8565b005b34801561053357600080fd5b5061054e60048036038101906105499190613fba565b611540565b005b34801561055c57600080fd5b506105656115d6565b6040516105729190614bfb565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190614090565b611627565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190613ef0565b6116bf565b005b3480156105d957600080fd5b506105f460048036038101906105ef9190614067565b6117bd565b604051610601919061481e565b60405180910390f35b34801561061657600080fd5b50610631600480360381019061062c9190614067565b6117d5565b60405161063e919061479c565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190613d85565b611887565b60405161067b9190614bfb565b60405180910390f35b34801561069057600080fd5b5061069961193f565b005b3480156106a757600080fd5b506106c260048036038101906106bd9190614120565b6119c7565b005b3480156106d057600080fd5b506106eb60048036038101906106e69190613ef0565b611acf565b005b3480156106f957600080fd5b50610702611cf8565b60405161070f919061479c565b60405180910390f35b34801561072457600080fd5b5061072d611d22565b60405161073a919061479c565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190613fba565b611d48565b005b34801561077857600080fd5b50610781611dde565b60405161078e9190614839565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190613eb4565b611e70565b005b3480156107cc57600080fd5b506107d5611ff1565b6040516107e29190614bfb565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d91906140cc565b61208a565b005b34801561082057600080fd5b5061083b60048036038101906108369190613e39565b612163565b005b34801561084957600080fd5b506108526121c5565b60405161085f9190614bfb565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190614067565b6121cb565b60405161089c9190614839565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190614067565b6122a1565b6040516108d99190614839565b60405180910390f35b6108fc60048036038101906108f79190613d85565b61231d565b005b34801561090a57600080fd5b5061092560048036038101906109209190613d85565b61241d565b005b34801561093357600080fd5b5061094e60048036038101906109499190614067565b61254d565b60405161095b9190614803565b60405180910390f35b34801561097057600080fd5b5061098b60048036038101906109869190613dae565b61256d565b6040516109989190614803565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c39190613d85565b612601565b005b3480156109d657600080fd5b506109f160048036038101906109ec9190613fba565b6126f9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610abe57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ace5750610acd826127b4565b5b9050919050565b606060658054610ae490615188565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1090615188565b8015610b5d5780601f10610b3257610100808354040283529160200191610b5d565b820191906000526020600020905b815481529060010190602001808311610b4057829003601f168201915b5050505050905090565b6000610b728261281e565b610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890614b1b565b60405180910390fd5b6069600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60d98181548110610bfc57600080fd5b906000526020600020016000915090508054610c1790615188565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4390615188565b8015610c905780601f10610c6557610100808354040283529160200191610c90565b820191906000526020600020905b815481529060010190602001808311610c7357829003601f168201915b505050505081565b6000610ca3826117d5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b90614b7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d3361288a565b73ffffffffffffffffffffffffffffffffffffffff161480610d625750610d6181610d5c61288a565b61256d565b5b610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890614a1b565b60405180910390fd5b610dab8383612892565b505050565b60ca5481565b610dbe61288a565b73ffffffffffffffffffffffffffffffffffffffff16610ddc611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2990614b3b565b60405180910390fd5b600060cf81905550600060d060006101000a81548160ff021916908315150217905550565b60cc5481565b610e6e610e6861288a565b8261294b565b610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea490614b9b565b60405180910390fd5b610eb8838383612a29565b505050565b610ec561288a565b73ffffffffffffffffffffffffffffffffffffffff16610ee3611cf8565b73ffffffffffffffffffffffffffffffffffffffff161480610f595750610f0861288a565b73ffffffffffffffffffffffffffffffffffffffff1660d560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f9061491b565b60405180910390fd5b600060d6541415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590614adb565b60405180910390fd5b60005b60d7805490508110156110d257600060d7828154811061102a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060d65460d860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856110a79190614f9c565b6110b19190614e54565b90506110bd8282612c85565b505080806110ca906151eb565b915050610fe1565b5050565b60d060009054906101000a900460ff1681565b60da80546110f690615188565b80601f016020809104026020016040519081016040528092919081815260200182805461112290615188565b801561116f5780601f106111445761010080835404028352916020019161116f565b820191906000526020600020905b81548152906001019060200180831161115257829003601f168201915b505050505081565b60cb5481565b61118561288a565b73ffffffffffffffffffffffffffffffffffffffff166111a3611cf8565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090614b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611260906148bb565b60405180910390fd5b600081116112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390614bdb565b60405180910390fd5b600060d860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156113585760d7829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8060d860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a4612d79565b5050565b6113c383838360405180602001604052806000815250612163565b505050565b600060019054906101000a900460ff16806113ee575060008054906101000a900460ff16155b61142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490614a9b565b60405180910390fd5b60008060019054906101000a900460ff16159050801561147d576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6114878383612e5e565b61148f612f53565b600060cc81905550600060cd819055506114a7611cf8565b60d560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060d060006101000a81548160ff021916908315150217905550600060ca81905550600060cb81905550600060d681905550801561153b5760008060016101000a81548160ff0219169083151502179055505b505050565b61154861288a565b73ffffffffffffffffffffffffffffffffffffffff16611566611cf8565b73ffffffffffffffffffffffffffffffffffffffff16146115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390614b3b565b60405180910390fd5b8060d190805190602001906115d2929190613b94565b5050565b60008060cf5414156115ed5762093a809050611624565b60ce546115f861303c565b106116065760009050611624565b4260ce5460cf546116179190614d94565b611621919061508a565b90505b90565b61162f61288a565b73ffffffffffffffffffffffffffffffffffffffff1661164d611cf8565b73ffffffffffffffffffffffffffffffffffffffff16146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90614b3b565b60405180910390fd5b8060d26000848152602001908152602001600020819055505050565b6116c761288a565b73ffffffffffffffffffffffffffffffffffffffff166116e5611cf8565b73ffffffffffffffffffffffffffffffffffffffff161461173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290614b3b565b60405180910390fd5b6103e8600160cc5461174d9190614d94565b111561178e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117859061485b565b60405180910390fd5b60006040602060ff1614156117a357816117ac565b6117ab613062565b5b90506117b88382613098565b505050565b60d26020528060005260406000206000915090505481565b6000806067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187590614a7b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90614a5b565b60405180910390fd5b606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61194761288a565b73ffffffffffffffffffffffffffffffffffffffff16611965611cf8565b73ffffffffffffffffffffffffffffffffffffffff16146119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290614b3b565b60405180910390fd5b6119c56000613107565b565b6119cf61288a565b73ffffffffffffffffffffffffffffffffffffffff166119ed611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90614b3b565b60405180910390fd5b60d060009054906101000a900460ff1615611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a9061487b565b60405180910390fd5b8260ce819055508160ca819055508060cb819055504260cf81905550600160d060006101000a81548160ff021916908315150217905550505050565b611ad761288a565b73ffffffffffffffffffffffffffffffffffffffff16611af5611cf8565b73ffffffffffffffffffffffffffffffffffffffff161480611b6b5750611b1a61288a565b73ffffffffffffffffffffffffffffffffffffffff1660d560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba19061491b565b60405180910390fd5b6103e8600160cc54611bbc9190614d94565b1115611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf49061485b565b60405180910390fd5b600060d460008381526020019081526020016000205414611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90614a3b565b60405180910390fd5b600a60cd5410611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90614afb565b60405180910390fd5b60cd6000815480929190611cab906151eb565b9190505550600160d36000600160cc54611cc59190614d94565b815260200190815260200160002060006101000a81548160ff021916908315150217905550611cf48282613098565b5050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60d560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d5061288a565b73ffffffffffffffffffffffffffffffffffffffff16611d6e611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb90614b3b565b60405180910390fd5b8060da9080519060200190611dda929190613b94565b5050565b606060668054611ded90615188565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1990615188565b8015611e665780601f10611e3b57610100808354040283529160200191611e66565b820191906000526020600020905b815481529060010190602001808311611e4957829003601f168201915b5050505050905090565b611e7861288a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd9061495b565b60405180910390fd5b80606a6000611ef361288a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fa061288a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fe59190614803565b60405180910390a35050565b600060d060009054906101000a900460ff166120105760009050612087565b600061201a61303c565b905060ce5481106120305760cb54915050612087565b60008160ce5460ca5460cb546120469190614ff6565b6120509190614dea565b61205a9190614e85565b60ca546120679190614d00565b9050600081905060cb54811161207f5760cb54612081565b805b93505050505b90565b61209261288a565b73ffffffffffffffffffffffffffffffffffffffff166120b0611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd90614b3b565b60405180910390fd5b8060d98381548110612141577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001908051906020019061215e929190613b94565b505050565b61217461216e61288a565b8361294b565b6121b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121aa90614b9b565b60405180910390fd5b6121bf848484846131cd565b50505050565b60cd5481565b606060d98281548110612207577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805461221c90615188565b80601f016020809104026020016040519081016040528092919081815260200182805461224890615188565b80156122955780601f1061226a57610100808354040283529160200191612295565b820191906000526020600020905b81548152906001019060200180831161227857829003601f168201915b50505050509050919050565b60606122ac8261281e565b6122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e2906149fb565b60405180910390fd5b60d16122f683613229565b604051602001612307929190614715565b6040516020818303038152906040529050919050565b60d060009054906101000a900460ff1661236c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612363906149db565b60405180910390fd5b6103e8600160cc5461237e9190614d94565b11156123bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b69061485b565b60405180910390fd5b6123c7611ff1565b341015612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240090614bbb565b60405180910390fd5b61241a81612415613062565b613098565b50565b61242561288a565b73ffffffffffffffffffffffffffffffffffffffff16612443611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614612499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249090614b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612500906148bb565b60405180910390fd5b8060d560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60d36020528060005260406000206000915054906101000a900460ff1681565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61260961288a565b73ffffffffffffffffffffffffffffffffffffffff16612627611cf8565b73ffffffffffffffffffffffffffffffffffffffff161461267d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267490614b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e4906148db565b60405180910390fd5b6126f681613107565b50565b61270161288a565b73ffffffffffffffffffffffffffffffffffffffff1661271f611cf8565b73ffffffffffffffffffffffffffffffffffffffff1614612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614b3b565b60405180910390fd5b60d9819080600181540180825580915050600190039060005260206000200160009091909190915090805190602001906127b0929190613b94565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816069600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612905836117d5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129568261281e565b612995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298c906149bb565b60405180910390fd5b60006129a0836117d5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a0f57508373ffffffffffffffffffffffffffffffffffffffff166129f784610b67565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a205750612a1f818561256d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a49826117d5565b73ffffffffffffffffffffffffffffffffffffffff1614612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9690614b5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b069061493b565b60405180910390fd5b612b1a8383836133d6565b612b25600082612892565b6001606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b75919061508a565b925050819055506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bcc9190614d94565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbf9061499b565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612cee90614739565b60006040518083038185875af1925050503d8060008114612d2b576040519150601f19603f3d011682016040523d82523d6000602084013e612d30565b606091505b5050905080612d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6b9061497b565b60405180910390fd5b505050565b600060d68190555060005b60d780549050811015612e5b5760d8600060d78381548110612dcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460d654612e429190614d94565b60d6819055508080612e53906151eb565b915050612d84565b50565b600060019054906101000a900460ff1680612e84575060008054906101000a900460ff16155b612ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eba90614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612f13576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612f1b6133db565b612f236134b4565b612f2d838361358d565b8015612f4e5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612f79575060008054906101000a900460ff16155b612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf90614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613008576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6130106133db565b613018613696565b80156130395760008060016101000a81548160ff0219169083151502179055505b50565b60008060cf541161304e57600061305d565b60cf544261305c919061508a565b5b905090565b600060cc5443423360405160200161307d949392919061474e565b60405160208183030381529060405280519060200120905090565b6130a260c961377f565b60006130ae60c9613795565b90506130ba83826137a3565b60cc60008154809291906130cd906151eb565b91905055508160d26000838152602001908152602001600020819055508060d4600084815260200190815260200160002081905550505050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131d8848484612a29565b6131e4848484846137c1565b613223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321a9061489b565b60405180910390fd5b50505050565b60606000821415613271576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133d1565b600082905060005b600082146132a357808061328c906151eb565b915050600a8261329c9190614e54565b9150613279565b60008167ffffffffffffffff8111156132e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133175781602001600182028036833780820191505090505b5090505b600085146133ca57600182613330919061508a565b9150600a8561333f9190615262565b603061334b9190614d94565b60f81b818381518110613387577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133c39190614e54565b945061331b565b8093505050505b919050565b505050565b600060019054906101000a900460ff1680613401575060008054906101000a900460ff16155b613440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343790614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613490576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156134b15760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806134da575060008054906101000a900460ff16155b613519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351090614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613569576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561358a5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806135b3575060008054906101000a900460ff16155b6135f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e990614a9b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613642576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8260659080519060200190613658929190613b94565b50816066908051906020019061366f929190613b94565b5080156136915760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806136bc575060008054906101000a900460ff16155b6136fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f290614a9b565b60405180910390fd5b60008060019054906101000a900460ff16159050801561374b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61375b61375661288a565b613107565b801561377c5760008060016101000a81548160ff0219169083151502179055505b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b6137bd828260405180602001604052806000815250613958565b5050565b60006137e28473ffffffffffffffffffffffffffffffffffffffff166139b3565b1561394b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261380b61288a565b8786866040518563ffffffff1660e01b815260040161382d94939291906147b7565b602060405180830381600087803b15801561384757600080fd5b505af192505050801561387857506040513d601f19601f820116820180604052508101906138759190613f91565b60015b6138fb573d80600081146138a8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ad565b606091505b506000815114156138f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ea9061489b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613950565b600190505b949350505050565b61396283836139c6565b61396f60008484846137c1565b6139ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a59061489b565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2d90614abb565b60405180910390fd5b613a3f8161281e565b15613a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a76906148fb565b60405180910390fd5b613a8b600083836133d6565b6001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613adb9190614d94565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613ba090615188565b90600052602060002090601f016020900481019282613bc25760008555613c09565b82601f10613bdb57805160ff1916838001178555613c09565b82800160010185558215613c09579182015b82811115613c08578251825591602001919060010190613bed565b5b509050613c169190613c1a565b5090565b5b80821115613c33576000816000905550600101613c1b565b5090565b6000613c4a613c4584614c3b565b614c16565b905082815260208101848484011115613c6257600080fd5b613c6d848285615146565b509392505050565b6000613c88613c8384614c6c565b614c16565b905082815260208101848484011115613ca057600080fd5b613cab848285615146565b509392505050565b600081359050613cc281615a29565b92915050565b600081359050613cd781615a40565b92915050565b600081359050613cec81615a57565b92915050565b600081359050613d0181615a6e565b92915050565b600081519050613d1681615a6e565b92915050565b600082601f830112613d2d57600080fd5b8135613d3d848260208601613c37565b91505092915050565b600082601f830112613d5757600080fd5b8135613d67848260208601613c75565b91505092915050565b600081359050613d7f81615a85565b92915050565b600060208284031215613d9757600080fd5b6000613da584828501613cb3565b91505092915050565b60008060408385031215613dc157600080fd5b6000613dcf85828601613cb3565b9250506020613de085828601613cb3565b9150509250929050565b600080600060608486031215613dff57600080fd5b6000613e0d86828701613cb3565b9350506020613e1e86828701613cb3565b9250506040613e2f86828701613d70565b9150509250925092565b60008060008060808587031215613e4f57600080fd5b6000613e5d87828801613cb3565b9450506020613e6e87828801613cb3565b9350506040613e7f87828801613d70565b925050606085013567ffffffffffffffff811115613e9c57600080fd5b613ea887828801613d1c565b91505092959194509250565b60008060408385031215613ec757600080fd5b6000613ed585828601613cb3565b9250506020613ee685828601613cc8565b9150509250929050565b60008060408385031215613f0357600080fd5b6000613f1185828601613cb3565b9250506020613f2285828601613cdd565b9150509250929050565b60008060408385031215613f3f57600080fd5b6000613f4d85828601613cb3565b9250506020613f5e85828601613d70565b9150509250929050565b600060208284031215613f7a57600080fd5b6000613f8884828501613cf2565b91505092915050565b600060208284031215613fa357600080fd5b6000613fb184828501613d07565b91505092915050565b600060208284031215613fcc57600080fd5b600082013567ffffffffffffffff811115613fe657600080fd5b613ff284828501613d46565b91505092915050565b6000806040838503121561400e57600080fd5b600083013567ffffffffffffffff81111561402857600080fd5b61403485828601613d46565b925050602083013567ffffffffffffffff81111561405157600080fd5b61405d85828601613d46565b9150509250929050565b60006020828403121561407957600080fd5b600061408784828501613d70565b91505092915050565b600080604083850312156140a357600080fd5b60006140b185828601613d70565b92505060206140c285828601613cdd565b9150509250929050565b600080604083850312156140df57600080fd5b60006140ed85828601613d70565b925050602083013567ffffffffffffffff81111561410a57600080fd5b61411685828601613d46565b9150509250929050565b60008060006060848603121561413557600080fd5b600061414386828701613d70565b935050602061415486828701613d70565b925050604061416586828701613d70565b9150509250925092565b614178816150be565b82525050565b61418f61418a826150be565b615234565b82525050565b61419e816150d0565b82525050565b6141ad816150dc565b82525050565b60006141be82614cb2565b6141c88185614cc8565b93506141d8818560208601615155565b6141e18161534f565b840191505092915050565b60006141f782614cbd565b6142018185614ce4565b9350614211818560208601615155565b61421a8161534f565b840191505092915050565b600061423082614cbd565b61423a8185614cf5565b935061424a818560208601615155565b80840191505092915050565b6000815461426381615188565b61426d8186614cf5565b945060018216600081146142885760018114614299576142cc565b60ff198316865281860193506142cc565b6142a285614c9d565b60005b838110156142c4578154818901526001820191506020810190506142a5565b838801955050505b50505092915050565b60006142e2600983614ce4565b91506142ed8261536d565b602082019050919050565b6000614305601d83614ce4565b915061431082615396565b602082019050919050565b6000614328603283614ce4565b9150614333826153bf565b604082019050919050565b600061434b602c83614ce4565b91506143568261540e565b604082019050919050565b600061436e602683614ce4565b91506143798261545d565b604082019050919050565b6000614391601c83614ce4565b915061439c826154ac565b602082019050919050565b60006143b4601d83614ce4565b91506143bf826154d5565b602082019050919050565b60006143d7602483614ce4565b91506143e2826154fe565b604082019050919050565b60006143fa601983614ce4565b91506144058261554d565b602082019050919050565b600061441d603a83614ce4565b915061442882615576565b604082019050919050565b6000614440601d83614ce4565b915061444b826155c5565b602082019050919050565b6000614463602c83614ce4565b915061446e826155ee565b604082019050919050565b6000614486601083614ce4565b91506144918261563d565b602082019050919050565b60006144a9600683614ce4565b91506144b482615666565b602082019050919050565b60006144cc603883614ce4565b91506144d78261568f565b604082019050919050565b60006144ef601383614ce4565b91506144fa826156de565b602082019050919050565b6000614512602a83614ce4565b915061451d82615707565b604082019050919050565b6000614535602983614ce4565b915061454082615756565b604082019050919050565b6000614558602e83614ce4565b9150614563826157a5565b604082019050919050565b600061457b602083614ce4565b9150614586826157f4565b602082019050919050565b600061459e601283614ce4565b91506145a98261581d565b602082019050919050565b60006145c1601883614ce4565b91506145cc82615846565b602082019050919050565b60006145e4602c83614ce4565b91506145ef8261586f565b604082019050919050565b6000614607602083614ce4565b9150614612826158be565b602082019050919050565b600061462a602983614ce4565b9150614635826158e7565b604082019050919050565b600061464d602183614ce4565b915061465882615936565b604082019050919050565b6000614670600083614cd9565b915061467b82615985565b600082019050919050565b6000614693603183614ce4565b915061469e82615988565b604082019050919050565b60006146b6600783614ce4565b91506146c1826159d7565b602082019050919050565b60006146d9601d83614ce4565b91506146e482615a00565b602082019050919050565b6146f88161513c565b82525050565b61470f61470a8261513c565b615258565b82525050565b60006147218285614256565b915061472d8284614225565b91508190509392505050565b600061474482614663565b9150819050919050565b600061475a82876146fe565b60208201915061476a82866146fe565b60208201915061477a82856146fe565b60208201915061478a828461417e565b60148201915081905095945050505050565b60006020820190506147b1600083018461416f565b92915050565b60006080820190506147cc600083018761416f565b6147d9602083018661416f565b6147e660408301856146ef565b81810360608301526147f881846141b3565b905095945050505050565b60006020820190506148186000830184614195565b92915050565b600060208201905061483360008301846141a4565b92915050565b6000602082019050818103600083015261485381846141ec565b905092915050565b60006020820190508181036000830152614874816142d5565b9050919050565b60006020820190508181036000830152614894816142f8565b9050919050565b600060208201905081810360008301526148b48161431b565b9050919050565b600060208201905081810360008301526148d48161433e565b9050919050565b600060208201905081810360008301526148f481614361565b9050919050565b6000602082019050818103600083015261491481614384565b9050919050565b60006020820190508181036000830152614934816143a7565b9050919050565b60006020820190508181036000830152614954816143ca565b9050919050565b60006020820190508181036000830152614974816143ed565b9050919050565b6000602082019050818103600083015261499481614410565b9050919050565b600060208201905081810360008301526149b481614433565b9050919050565b600060208201905081810360008301526149d481614456565b9050919050565b600060208201905081810360008301526149f481614479565b9050919050565b60006020820190508181036000830152614a148161449c565b9050919050565b60006020820190508181036000830152614a34816144bf565b9050919050565b60006020820190508181036000830152614a54816144e2565b9050919050565b60006020820190508181036000830152614a7481614505565b9050919050565b60006020820190508181036000830152614a9481614528565b9050919050565b60006020820190508181036000830152614ab48161454b565b9050919050565b60006020820190508181036000830152614ad48161456e565b9050919050565b60006020820190508181036000830152614af481614591565b9050919050565b60006020820190508181036000830152614b14816145b4565b9050919050565b60006020820190508181036000830152614b34816145d7565b9050919050565b60006020820190508181036000830152614b54816145fa565b9050919050565b60006020820190508181036000830152614b748161461d565b9050919050565b60006020820190508181036000830152614b9481614640565b9050919050565b60006020820190508181036000830152614bb481614686565b9050919050565b60006020820190508181036000830152614bd4816146a9565b9050919050565b60006020820190508181036000830152614bf4816146cc565b9050919050565b6000602082019050614c1060008301846146ef565b92915050565b6000614c20614c31565b9050614c2c82826151ba565b919050565b6000604051905090565b600067ffffffffffffffff821115614c5657614c55615320565b5b614c5f8261534f565b9050602081019050919050565b600067ffffffffffffffff821115614c8757614c86615320565b5b614c908261534f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d0b82615112565b9150614d1683615112565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614d5157614d50615293565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614d8957614d88615293565b5b828201905092915050565b6000614d9f8261513c565b9150614daa8361513c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ddf57614dde615293565b5b828201905092915050565b6000614df582615112565b9150614e0083615112565b925082614e1057614e0f6152c2565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615614e4957614e48615293565b5b828205905092915050565b6000614e5f8261513c565b9150614e6a8361513c565b925082614e7a57614e796152c2565b5b828204905092915050565b6000614e9082615112565b9150614e9b83615112565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482116000841360008413161615614eda57614ed9615293565b5b817f80000000000000000000000000000000000000000000000000000000000000000583126000841260008413161615614f1757614f16615293565b5b827f80000000000000000000000000000000000000000000000000000000000000000582126000841360008412161615614f5457614f53615293565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0582126000841260008412161615614f9157614f90615293565b5b828202905092915050565b6000614fa78261513c565b9150614fb28361513c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614feb57614fea615293565b5b828202905092915050565b600061500182615112565b915061500c83615112565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561504757615046615293565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561507f5761507e615293565b5b828203905092915050565b60006150958261513c565b91506150a08361513c565b9250828210156150b3576150b2615293565b5b828203905092915050565b60006150c98261511c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615173578082015181840152602081019050615158565b83811115615182576000848401525b50505050565b600060028204905060018216806151a057607f821691505b602082108114156151b4576151b36152f1565b5b50919050565b6151c38261534f565b810181811067ffffffffffffffff821117156151e2576151e1615320565b5b80604052505050565b60006151f68261513c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561522957615228615293565b5b600182019050919050565b600061523f82615246565b9050919050565b600061525182615360565b9050919050565b6000819050919050565b600061526d8261513c565b91506152788361513c565b925082615288576152876152c2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d6178537570706c790000000000000000000000000000000000000000000000600082015250565b7f5075626c69632073616c652068617320616c726561647920626567756e000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6f6e6c7920617274697374206f72206f776e65722063616e2063616c6c000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f21746f6b656e0000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f6861736820616c72656164792065786973747300000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6e6f626f647920746f2077697468647261770000000000000000000000000000600082015250565b7f616c6c206172746973742063686f696365206d696e7465640000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6c6f772065746800000000000000000000000000000000000000000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b615a32816150be565b8114615a3d57600080fd5b50565b615a49816150d0565b8114615a5457600080fd5b50565b615a60816150dc565b8114615a6b57600080fd5b50565b615a77816150e6565b8114615a8257600080fd5b50565b615a8e8161513c565b8114615a9957600080fd5b5056fea2646970667358221220ca1338102b0a94406ba2bf2aea11892d3bd5ccf157b05c648de2563f73b9352b64736f6c63430008020033

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.