BNB Price: $618.96 (+0.42%)
 

Overview

Max Total Supply

500Burn NFT

Holders

115

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 Burn NFT
0x4d283926bb5f8925e081019d3ec09b7f125c8fec
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
SuperNFT

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at BscScan.com on 2026-01-09
*/

/**
 *Submitted for verification at BscScan.com on 2025-10-26
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(
        uint256 tokenId
    ) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(
        address owner,
        address operator
    ) external view returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

abstract contract ERC165 is IERC165 {}

abstract contract ERC721 is ERC165, IERC721 {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0 && 23 != size;
    }

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(
        address owner
    ) public view virtual override returns (uint256) {
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(
        uint256 tokenId
    ) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        return owner;
    }

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

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

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

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "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
    ) external virtual override {
        _setApprovalForAll(msg.sender, 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
    ) external virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(msg.sender, 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
    ) external 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(msg.sender, tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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 (isContract(to)) {
            try
                IERC721Receiver(to).onERC721Received(
                    msg.sender,
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(
        address owner,
        uint256 index
    ) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override returns (bool) {
        return
            interfaceId == 0x01ffc9a7 ||
            interfaceId == 0x80ac58cd ||
            interfaceId == 0x5b5e139f;
    }

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

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        require(to != address(0), "burn dead");
        if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

abstract contract Ownable {
    address internal _owner;

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

    constructor() {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender, "not owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "0 owner");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IERC20 {
    function decimals() external view returns (uint8);
    function Dead01() external view returns (address);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

contract SuperNFT is ERC721Enumerable, Ownable {
    struct RewardInfo {
        uint256 totalReward;
        uint256 startTime;
        uint256 claimedReward;
    }

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

    string public _baseUri;
    string public _suffix;

    string public _sameUri;

    mapping(address => bool) public _minter;

    uint256 public _tokenId = 1;
    bool public _canTransfer = true;
    mapping(address => bool) public _whitelist;
    mapping(uint256 => bool) public _blacklist;
    uint256 public constant _maxTotal = 500;

    address public _rewardToken;
    uint256 public _rewardAmount;
    uint256 public _rewardDailyRate = 10;
    mapping(uint256 => RewardInfo) private _nftRewardInfo;
    uint256 public _openTime;

    function mint(address to, uint256 num) external {
        require(_minter[msg.sender], "!minter");
        uint256 tokenId = _tokenId;
        uint256 rewardAmount = _rewardAmount;
        uint256 startTime = getTime();
        for (uint256 i; i < num; ) {
            _mint(to, tokenId);
            _nftRewardInfo[tokenId].totalReward = rewardAmount;
            _nftRewardInfo[tokenId].startTime = startTime;
            unchecked {
                ++tokenId;
                ++i;
            }
        }
        _tokenId = tokenId;
        require(totalSupply() <= _maxTotal, "Max");
    }

    function batchMint(address[] calldata tos) external {
        require(_minter[msg.sender], "!minter");
        uint256 num = tos.length;
        uint256 tokenId = _tokenId;
        uint256 rewardAmount = _rewardAmount;
        uint256 startTime = getTime();
        for (uint256 i; i < num; ) {
            _mint(tos[i], tokenId);
            _nftRewardInfo[tokenId].totalReward = rewardAmount;
            _nftRewardInfo[tokenId].startTime = startTime;
            unchecked {
                ++tokenId;
                ++i;
            }
        }
        _tokenId = tokenId;
        require(totalSupply() <= _maxTotal, "Max");
    }

    function tokenURI(
        uint256 id
    ) external view virtual override returns (string memory) {
        string memory baseURI = _baseUri;
        return
            bytes(baseURI).length != 0
                ? string(abi.encodePacked(baseURI, toString(id), _suffix))
                : _sameUri;
    }

    function setBaseUri(
        string memory uri,
        string memory suffix
    ) external onlyOwner {
        _baseUri = uri;
        _suffix = suffix;
    }

    function setSameUri(string memory uri) external onlyOwner {
        _sameUri = uri;
    }

    function setMinter(address minter, bool enable) external onlyOwner {
        _minter[minter] = enable;
    }

    function setCanTransfer(bool enable) external onlyOwner {
        _canTransfer = enable;
    }

    function setWhiteList(address adr, bool enable) external onlyOwner {
        _whitelist[adr] = enable;
    }

    function setBlackList(uint256 id, bool enable) external onlyOwner {
        _blacklist[id] = enable;
    }

    function claimBalance(address to, uint256 amount) external onlyOwner {
        safeTransferETH(to, amount);
    }

    function claimToken(
        address token,
        address to,
        uint256 amount
    ) external onlyOwner {
        safeTransferToken(token, to, amount);
    }

    function safeTransferToken(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TF"
        );
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, "ETF");
    }

    function ownerNoBlack(uint256 tokenId) public view returns (address) {
        if (_blacklist[tokenId]) {
            return address(0xdead);
        }
        return ownerOf(tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        require(!_blacklist[tokenId], "black");
        require(_canTransfer || _whitelist[from] || _whitelist[to], "NT");
        super._transfer(from, to, tokenId);
    }

    function claimReward(address account) public {
        if (address(0) == account || address(0xdead) == account) {
            return;
        }
        uint256 reward;
        uint256 num = balanceOf(account);
        uint256 currentTime = getTime();
        uint256 nftId;
        uint256 pendingReward;
        for (uint256 i; i < num; ) {
            nftId = tokenOfOwnerByIndex(account, i);
            pendingReward = calPendingReward(nftId, currentTime);
            if (pendingReward > 0) {
                reward += pendingReward;
                _nftRewardInfo[nftId].claimedReward += pendingReward;
            }
            unchecked {
                ++i;
            }
        }
        if (reward > 0) {
            IERC20 token = IERC20(_rewardToken);
            token.transferFrom(token.Dead01(), account, reward);
        }
    }

    function calPendingReward(
        uint256 nftId,
        uint256 currentTime
    ) public view returns (uint256 reward) {
        uint256 openTime = _openTime;
        if (0 == openTime) {
            return 0;
        }
        if (_blacklist[nftId]) {
            return 0;
        }
        RewardInfo storage rewardInfo = _nftRewardInfo[nftId];
        uint256 totalReward = rewardInfo.totalReward;
        if (totalReward > 0) {
            uint256 startTime = rewardInfo.startTime;
            if (startTime < openTime) {
                startTime = openTime;
            }
            if (currentTime > startTime) {
                uint256 releaseAmount = ((currentTime - startTime) *
                    totalReward *
                    _rewardDailyRate) /
                    10000 /
                    1 days;
                if (releaseAmount > totalReward) {
                    releaseAmount = totalReward;
                }
                uint256 claimedReward = rewardInfo.claimedReward;
                if (releaseAmount > claimedReward) {
                    reward = releaseAmount - claimedReward;
                }
            }
        }
    }

    function getPendingReward(
        address account
    ) public view returns (uint256 reward) {
        reward = 0;
        uint256 num = balanceOf(account);
        uint256 currentTime = getTime();
        for (uint256 i; i < num; ) {
            reward += calPendingReward(
                tokenOfOwnerByIndex(account, i),
                currentTime
            );
            unchecked {
                ++i;
            }
        }
    }

    function getUserInfo(
        address account
    ) external view returns (uint256 nftNum, uint256 pendingToken) {
        nftNum = balanceOf(account);
        pendingToken = getPendingReward(account);
    }

    function getNFTRewardInfo(
        uint256 nftId
    )
        external
        view
        returns (
            uint256 totalReward,
            uint256 startTime,
            uint256 claimedReward,
            uint256 pendingReward
        )
    {
        RewardInfo storage rewardInfo = _nftRewardInfo[nftId];
        totalReward = rewardInfo.totalReward;
        startTime = rewardInfo.startTime;
        claimedReward = rewardInfo.claimedReward;
        pendingReward = calPendingReward(nftId, getTime());
    }

    function setRewardToken(address adr) external onlyOwner {
        _rewardToken = adr;
    }

    function setRewardAmount(uint256 a) external onlyOwner {
        _rewardAmount = a;
    }

    function setRewardDailyRate(uint256 r) external onlyOwner {
        _rewardDailyRate = r;
    }

    uint256 private _marginTimes = 0;

    function _testAddDays(uint256 ds) public onlyOwner {
        uint256 ts = ds * 1 days;
        _marginTimes += ts;
    }

    function getTime() public view returns (uint256) {
        return block.timestamp + _marginTimes;
    }

    function open() public {
        if (0 == _openTime && msg.sender == _rewardToken) {
            _openTime = getTime();
        }
    }

    constructor() ERC721("Burn NFT", "Burn NFT") {
        //
        _sameUri = "https://gateway.pinata.cloud/ipfs/bafkreigs3qrah7dcecyv7lbh2f3rs4huq3ugkvta377unzfdse67j3jhjq";
        //FT
        _rewardToken = address(0xCf53BbC94Fbd9A109aacc44AFC390faa056Db6B6
);
        _rewardAmount = 10000 * 10 ** IERC20(_rewardToken).decimals();
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_canTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_minter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_openTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rewardDailyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sameUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_suffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ds","type":"uint256"}],"name":"_testAddDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"currentTime","type":"uint256"}],"name":"calPendingReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"getNFTRewardInfo","outputs":[{"internalType":"uint256","name":"totalReward","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"claimedReward","type":"uint256"},{"internalType":"uint256","name":"pendingReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"nftNum","type":"uint256"},{"internalType":"uint256","name":"pendingToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerNoBlack","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"string","name":"suffix","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setRewardDailyRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setSameUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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"}]

60806040526001600f8190556010805460ff19169091179055600a6015555f60185534801561002c575f5ffd5b50604080518082018252600880825267109d5c9b8813919560c21b6020808401829052845180860190955291845290830152905f61006a8382610222565b5060016100778282610222565b5050600a80546001600160a01b0319163390811790915560405190915081905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040518060800160405280605d8152602001612f29605d9139600d906100e49082610222565b50601380546001600160a01b03191673cf53bbc94fbd9a109aacc44afc390faa056db6b69081179091556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015610147573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061016b91906102dc565b61017690600a6103fc565b6101829061271061040a565b601455610421565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806101b257607f821691505b6020821081036101d057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561021d57805f5260205f20601f840160051c810160208510156101fb5750805b601f840160051c820191505b8181101561021a575f8155600101610207565b50505b505050565b81516001600160401b0381111561023b5761023b61018a565b61024f81610249845461019e565b846101d6565b6020601f821160018114610281575f831561026a5750848201515b5f19600385901b1c1916600184901b17845561021a565b5f84815260208120601f198516915b828110156102b05787850151825560209485019460019092019101610290565b50848210156102cd57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156102ec575f5ffd5b815160ff811681146102fc575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156103525780850481111561033657610336610303565b600184161561034457908102905b60019390931c92800261031b565b935093915050565b5f82610368575060016103f6565b8161037457505f6103f6565b816001811461038a5760028114610394576103b0565b60019150506103f6565b60ff8411156103a5576103a5610303565b50506001821b6103f6565b5060208310610133831016604e8410600b84101617156103d3575081810a6103f6565b6103df5f198484610317565b805f19048211156103f2576103f2610303565b0290505b92915050565b5f6102fc60ff84168361035a565b80820281158282048414176103f6576103f6610303565b612afb8061042e5f395ff3fe608060405234801561000f575f5ffd5b5060043610610333575f3560e01c806370a08231116101af578063aa8b38d9116100fe578063d279c1911161009e578063ec25217f11610079578063ec25217f146106fe578063ef51f40614610731578063f2fde38b14610753578063fcfff16f14610766575f5ffd5b8063d279c191146106c5578063d67b06c1146106d8578063e985e9c5146106eb575f5ffd5b8063c87b56dd116100d9578063c87b56dd1461066a578063ccaf2f411461067d578063cf456ae714610690578063cfdb63ac146106a3575f5ffd5b8063aa8b38d914610631578063b59c6e0e14610644578063b88d4fde14610657575f5ffd5b806388b1e1f5116101695780638da5cb5b116101445780638da5cb5b146105f257806395d89b4114610603578063a22cb4651461060b578063a8a65a781461061e575f5ffd5b806388b1e1f5146105c35780638aee8127146105cc5780638d14e127146105df575f5ffd5b806370a082311461054257806370bba14b1461056a578063715018a61461057357806375ae267d1461057b57806380796bbf1461058e5780638093f3eb146105a1575f5ffd5b8063330a1f941161028557806349db98fa116102255780634fce1e60116102005780634fce1e60146104d7578063557ed1ba146104ea5780636352211e146104f25780636386c1c71461051a575f5ffd5b806349db98fa146104a85780634df9d6ba146104b15780634f6ccce7146104c4575f5ffd5b80633f7ff9cf116102605780633f7ff9cf1461046c57806340c10f19146104755780634132b8891461048857806342842e0e14610495575f5ffd5b8063330a1f941461043e5780633da96fa9146104515780633e63eb2a14610464575f5ffd5b806318160ddd116102f057806322b71bab116102cb57806322b71bab146103fc57806323b872dd1461040f57806324822514146104225780632f745c591461042b575f5ffd5b806318160ddd146103cf57806318af9a0a146103e15780632109ef7f146103e9575f5ffd5b806301ffc9a71461033757806306fdde031461035f578063081812fc14610374578063095ea7b31461039f578063125bfb66146103b4578063130e995b146103c7575b5f5ffd5b61034a6103453660046122d8565b61076e565b60405190151581526020015b60405180910390f35b6103676107bf565b6040516103569190612321565b610387610382366004612333565b61084e565b6040516001600160a01b039091168152602001610356565b6103b26103ad36600461235e565b6108e6565b005b6103b26103c2366004612388565b6109f8565b610367610a2d565b6008545b604051908152602001610356565b610367610ab9565b6103876103f7366004612333565b610ac6565b6103b261040a366004612333565b610b01565b6103b261041d366004612388565b610b55565b6103d3600f5481565b6103d361043936600461235e565b610b86565b6103b261044c3660046123d3565b610c28565b6103b261045f366004612333565b610c71565b610367610ca0565b6103d360155481565b6103b261048336600461235e565b610cad565b60105461034a9060ff1681565b6103b26104a3366004612388565b610d89565b6103d360145481565b6103d36104bf366004612401565b610da3565b6103d36104d2366004612333565b610dff565b6103d36104e536600461241c565b610e8f565b6103d3610f65565b610387610500366004612333565b5f908152600260205260409020546001600160a01b031690565b61052d610528366004612401565b610f79565b60408051928352602083019190915201610356565b6103d3610550366004612401565b6001600160a01b03165f9081526003602052604090205490565b6103d36101f481565b6103b2610fa2565b6103b261058936600461243c565b611015565b6103b261059c366004612500565b611052565b61034a6105af366004612401565b600e6020525f908152604090205460ff1681565b6103d360175481565b6103b26105da366004612401565b611095565b6103b26105ed366004612565565b6110e1565b600a546001600160a01b0316610387565b610367611135565b6103b2610619366004612565565b611144565b6103b261062c366004612333565b611153565b6103b261063f36600461235e565b611182565b601354610387906001600160a01b031681565b6103b2610665366004612591565b6111b6565b610367610678366004612333565b6111ee565b6103b261068b36600461260c565b611347565b6103b261069e366004612565565b61137d565b61034a6106b1366004612401565b60116020525f908152604090205460ff1681565b6103b26106d3366004612401565b6113d1565b6103b26106e636600461263e565b611580565b61034a6106f93660046126af565b61167e565b61071161070c366004612333565b6116ab565b604080519485526020850193909352918301526060820152608001610356565b61034a61073f366004612333565b60126020525f908152604090205460ff1681565b6103b2610761366004612401565b6116de565b6103b26117a3565b5f6301ffc9a760e01b6001600160e01b03198316148061079e57506380ac58cd60e01b6001600160e01b03198316145b806107b95750635b5e139f60e01b6001600160e01b03198316145b92915050565b60605f80546107cd906126db565b80601f01602080910402602001604051908101604052809291908181526020018280546107f9906126db565b80156108445780601f1061081b57610100808354040283529160200191610844565b820191905f5260205f20905b81548152906001019060200180831161082757829003601f168201915b5050505050905090565b5f818152600260205260408120546001600160a01b03166108cb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b505f908152600460205260409020546001600160a01b031690565b5f818152600260205260409020546001600160a01b0390811690831681900361095b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108c2565b336001600160a01b03821614806109775750610977813361167e565b6109e95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108c2565b6109f383836117d0565b505050565b600a546001600160a01b03163314610a225760405162461bcd60e51b81526004016108c290612713565b6109f3838383611836565b600c8054610a3a906126db565b80601f0160208091040260200160405190810160405280929190818152602001828054610a66906126db565b8015610ab15780601f10610a8857610100808354040283529160200191610ab1565b820191905f5260205f20905b815481529060010190602001808311610a9457829003601f168201915b505050505081565b600d8054610a3a906126db565b5f8181526012602052604081205460ff1615610ae5575061dead919050565b5f828152600260205260409020546001600160a01b03166107b9565b600a546001600160a01b03163314610b2b5760405162461bcd60e51b81526004016108c290612713565b5f610b39826201518061274a565b90508060185f828254610b4c9190612761565b90915550505050565b610b5f338261192a565b610b7b5760405162461bcd60e51b81526004016108c290612774565b6109f38383836119fc565b6001600160a01b0382165f908152600360205260408120548210610c005760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108c2565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610c525760405162461bcd60e51b81526004016108c290612713565b5f91825260126020526040909120805460ff1916911515919091179055565b600a546001600160a01b03163314610c9b5760405162461bcd60e51b81526004016108c290612713565b601555565b600b8054610a3a906126db565b335f908152600e602052604090205460ff16610cf55760405162461bcd60e51b815260206004820152600760248201526610b6b4b73a32b960c91b60448201526064016108c2565b600f546014545f610d04610f65565b90505f5b84811015610d3c57610d1a8685611ac8565b5f84815260166020526040902083815560019081018390559384019301610d08565b50600f8390556101f4610d4e60085490565b1115610d825760405162461bcd60e51b815260206004820152600360248201526209ac2f60eb1b60448201526064016108c2565b5050505050565b6109f383838360405180602001604052805f8152506111b6565b6001600160a01b0381165f908152600360205260408120545f610dc4610f65565b90505f5b82811015610df757610de3610ddd8683610b86565b83610e8f565b610ded9085612761565b9350600101610dc8565b505050919050565b5f610e0960085490565b8210610e6c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108c2565b60088281548110610e7f57610e7f6127c5565b905f5260205f2001549050919050565b6017545f90808203610ea4575f9150506107b9565b5f8481526012602052604090205460ff1615610ec3575f9150506107b9565b5f84815260166020526040902080548015610f5c57600182015483811015610ee85750825b80861115610f5a575f6201518061271060155485858b610f0891906127d9565b610f12919061274a565b610f1c919061274a565b610f269190612800565b610f309190612800565b905082811115610f3d5750815b600284015480821115610f5757610f5481836127d9565b96505b50505b505b50505092915050565b5f60185442610f749190612761565b905090565b6001600160a01b0381165f9081526003602052604081205490610f9b83610da3565b9050915091565b600a546001600160a01b03163314610fcc5760405162461bcd60e51b81526004016108c290612713565b600a546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600a546001600160a01b0316331461103f5760405162461bcd60e51b81526004016108c290612713565b6010805460ff1916911515919091179055565b600a546001600160a01b0316331461107c5760405162461bcd60e51b81526004016108c290612713565b600b6110888382612857565b50600c6109f38282612857565b600a546001600160a01b031633146110bf5760405162461bcd60e51b81526004016108c290612713565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b0316331461110b5760405162461bcd60e51b81526004016108c290612713565b6001600160a01b03919091165f908152601160205260409020805460ff1916911515919091179055565b6060600180546107cd906126db565b61114f338383611c12565b5050565b600a546001600160a01b0316331461117d5760405162461bcd60e51b81526004016108c290612713565b601455565b600a546001600160a01b031633146111ac5760405162461bcd60e51b81526004016108c290612713565b61114f8282611cdf565b6111c0338361192a565b6111dc5760405162461bcd60e51b81526004016108c290612774565b6111e884848484611d7e565b50505050565b60605f600b80546111fe906126db565b80601f016020809104026020016040519081016040528092919081815260200182805461122a906126db565b80156112755780601f1061124c57610100808354040283529160200191611275565b820191905f5260205f20905b81548152906001019060200180831161125857829003601f168201915b5050505050905080515f0361131257600d8054611291906126db565b80601f01602080910402602001604051908101604052809291908181526020018280546112bd906126db565b80156113085780601f106112df57610100808354040283529160200191611308565b820191905f5260205f20905b8154815290600101906020018083116112eb57829003601f168201915b5050505050611340565b8061131c84611db1565b600c60405160200161133093929190612929565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146113715760405162461bcd60e51b81526004016108c290612713565b600d61114f8282612857565b600a546001600160a01b031633146113a75760405162461bcd60e51b81526004016108c290612713565b6001600160a01b03919091165f908152600e60205260409020805460ff1916911515919091179055565b6001600160a01b03811615806113f1575061dead6001600160a01b038216145b156113f95750565b6001600160a01b0381165f908152600360205260408120545f61141a610f65565b90505f5f5f5b84811015611483576114328782610b86565b925061143e8385610e8f565b9150811561147b576114508287612761565b95508160165f8581526020019081526020015f206002015f8282546114759190612761565b90915550505b600101611420565b5084156115785760135460408051633aa9b4b560e21b815290516001600160a01b039092169182916323b872dd91839163eaa6d2d49160048083019260209291908290030181865afa1580156114db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ff91906129b0565b6040516001600160e01b031960e084901b1681526001600160a01b039182166004820152908a166024820152604481018990526064016020604051808303815f875af1158015611551573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157591906129cb565b50505b505050505050565b335f908152600e602052604090205460ff166115c85760405162461bcd60e51b815260206004820152600760248201526610b6b4b73a32b960c91b60448201526064016108c2565b600f546014548291905f6115da610f65565b90505f5b84811015611638576116168787838181106115fb576115fb6127c5565b90506020020160208101906116109190612401565b85611ac8565b5f848152601660205260409020838155600190810183905593840193016115de565b50600f8390556101f461164a60085490565b11156115785760405162461bcd60e51b815260206004820152600360248201526209ac2f60eb1b60448201526064016108c2565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f818152601660205260408120805460018201546002830154919390926116d4866104e5610f65565b9150509193509193565b600a546001600160a01b031633146117085760405162461bcd60e51b81526004016108c290612713565b6001600160a01b0381166117485760405162461bcd60e51b8152602060048201526007602482015266181037bbb732b960c91b60448201526064016108c2565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6017541580156117bd57506013546001600160a01b031633145b156117ce576117ca610f65565b6017555b565b5f81815260046020908152604080832080546001600160a01b0319166001600160a01b038781169182179092556002909352818420549151859492909116917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161189191906129e6565b5f604051808303815f865af19150503d805f81146118ca576040519150601f19603f3d011682016040523d82523d5f602084013e6118cf565b606091505b50915091508180156118f95750805115806118f95750808060200190518101906118f991906129cb565b610d825760405162461bcd60e51b81526020600482015260026024820152612a2360f11b60448201526064016108c2565b5f818152600260205260408120546001600160a01b03166119a25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108c2565b5f828152600260205260409020546001600160a01b039081169084168114806119e45750836001600160a01b03166119d98461084e565b6001600160a01b0316145b806119f457506119f4818561167e565b949350505050565b5f8181526012602052604090205460ff1615611a425760405162461bcd60e51b8152602060048201526005602482015264626c61636b60d81b60448201526064016108c2565b60105460ff1680611a6a57506001600160a01b0383165f9081526011602052604090205460ff165b80611a8c57506001600160a01b0382165f9081526011602052604090205460ff165b611abd5760405162461bcd60e51b8152602060048201526002602482015261139560f21b60448201526064016108c2565b6109f3838383611eae565b6001600160a01b038216611b1e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108c2565b5f818152600260205260409020546001600160a01b031615611b825760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108c2565b611b8d5f8383611ff2565b6001600160a01b0382165f908152600360205260408120805460019290611bb5908490612761565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031603611c735760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108c2565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b604080515f808252602082019092526001600160a01b038416908390604051611d0891906129e6565b5f6040518083038185875af1925050503d805f8114611d42576040519150601f19603f3d011682016040523d82523d5f602084013e611d47565b606091505b50509050806109f35760405162461bcd60e51b815260206004820152600360248201526222aa2360e91b60448201526064016108c2565b611d898484846119fc565b611d9584848484612107565b6111e85760405162461bcd60e51b81526004016108c2906129f1565b6060815f03611dd75750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611e005780611dea81612a43565b9150611df99050600a83612800565b9150611dda565b5f8167ffffffffffffffff811115611e1a57611e1a612457565b6040519080825280601f01601f191660200182016040528015611e44576020820181803683370190505b5090505b84156119f457611e596001836127d9565b9150611e66600a86612a5b565b611e71906030612761565b60f81b818381518110611e8657611e866127c5565b60200101906001600160f81b03191690815f1a905350611ea7600a86612800565b9450611e48565b5f818152600260205260409020546001600160a01b03848116911614611f285760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108c2565b611f33838383611ff2565b611f3d5f826117d0565b6001600160a01b0383165f908152600360205260408120805460019290611f659084906127d9565b90915550506001600160a01b0382165f908152600360205260408120805460019290611f92908490612761565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03831661204c5761204781600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61206f565b816001600160a01b0316836001600160a01b03161461206f5761206f8382612202565b6001600160a01b0382166120b15760405162461bcd60e51b8152602060048201526009602482015268189d5c9b881919585960ba1b60448201526064016108c2565b826001600160a01b0316826001600160a01b0316146109f3576001600160a01b03919091165f90815260036020908152604080832054600683528184208185528352818420859055938352600790915290205550565b5f612111846122a9565b156121f757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612148903390899088908890600401612a6e565b6020604051808303815f875af1925050508015612182575060408051601f3d908101601f1916820190925261217f91810190612aaa565b60015b6121dd573d8080156121af576040519150601f19603f3d011682016040523d82523d5f602084013e6121b4565b606091505b5080515f036121d55760405162461bcd60e51b81526004016108c2906129f1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119f4565b506001949350505050565b6001600160a01b0382165f90815260036020526040812054612226906001906127d9565b5f83815260076020526040902054909150808214612277576001600160a01b0384165f9081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b505f9182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b5f813b801580159061134057506017141592915050565b6001600160e01b0319811681146122d5575f5ffd5b50565b5f602082840312156122e8575f5ffd5b8135611340816122c0565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61134060208301846122f3565b5f60208284031215612343575f5ffd5b5035919050565b6001600160a01b03811681146122d5575f5ffd5b5f5f6040838503121561236f575f5ffd5b823561237a8161234a565b946020939093013593505050565b5f5f5f6060848603121561239a575f5ffd5b83356123a58161234a565b925060208401356123b58161234a565b929592945050506040919091013590565b80151581146122d5575f5ffd5b5f5f604083850312156123e4575f5ffd5b8235915060208301356123f6816123c6565b809150509250929050565b5f60208284031215612411575f5ffd5b81356113408161234a565b5f5f6040838503121561242d575f5ffd5b50508035926020909101359150565b5f6020828403121561244c575f5ffd5b8135611340816123c6565b634e487b7160e01b5f52604160045260245ffd5b5f5f67ffffffffffffffff84111561248557612485612457565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156124b4576124b4612457565b6040528381529050808284018510156124cb575f5ffd5b838360208301375f60208583010152509392505050565b5f82601f8301126124f1575f5ffd5b6113408383356020850161246b565b5f5f60408385031215612511575f5ffd5b823567ffffffffffffffff811115612527575f5ffd5b612533858286016124e2565b925050602083013567ffffffffffffffff81111561254f575f5ffd5b61255b858286016124e2565b9150509250929050565b5f5f60408385031215612576575f5ffd5b82356125818161234a565b915060208301356123f6816123c6565b5f5f5f5f608085870312156125a4575f5ffd5b84356125af8161234a565b935060208501356125bf8161234a565b925060408501359150606085013567ffffffffffffffff8111156125e1575f5ffd5b8501601f810187136125f1575f5ffd5b6126008782356020840161246b565b91505092959194509250565b5f6020828403121561261c575f5ffd5b813567ffffffffffffffff811115612632575f5ffd5b6119f4848285016124e2565b5f5f6020838503121561264f575f5ffd5b823567ffffffffffffffff811115612665575f5ffd5b8301601f81018513612675575f5ffd5b803567ffffffffffffffff81111561268b575f5ffd5b8560208260051b840101111561269f575f5ffd5b6020919091019590945092505050565b5f5f604083850312156126c0575f5ffd5b82356126cb8161234a565b915060208301356123f68161234a565b600181811c908216806126ef57607f821691505b60208210810361270d57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107b9576107b9612736565b808201808211156107b9576107b9612736565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b818103818111156107b9576107b9612736565b634e487b7160e01b5f52601260045260245ffd5b5f8261280e5761280e6127ec565b500490565b601f8211156109f357805f5260205f20601f840160051c810160208510156128385750805b601f840160051c820191505b81811015610d82575f8155600101612844565b815167ffffffffffffffff81111561287157612871612457565b6128858161287f84546126db565b84612813565b6020601f8211600181146128b7575f83156128a05750848201515b5f19600385901b1c1916600184901b178455610d82565b5f84815260208120601f198516915b828110156128e657878501518255602094850194600190920191016128c6565b508482101561290357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f81518060208401855e5f93019283525090919050565b5f61293d6129378387612912565b85612912565b5f8454612949816126db565b6001821680156129605760018114612975576129a2565b60ff19831685528115158202850193506129a2565b875f5260205f205f5b8381101561299a5781548782015260019091019060200161297e565b505081850193505b509198975050505050505050565b5f602082840312156129c0575f5ffd5b81516113408161234a565b5f602082840312156129db575f5ffd5b8151611340816123c6565b5f6113408284612912565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f60018201612a5457612a54612736565b5060010190565b5f82612a6957612a696127ec565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612aa0908301846122f3565b9695505050505050565b5f60208284031215612aba575f5ffd5b8151611340816122c056fea264697066735822122076286833f7fdc346de74413199d4be21ebfc7a8565deedc28b31d5e1dfb73fb064736f6c634300081e003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f6261666b7265696773337172616837646365637976376c62683266337273346875713375676b767461333737756e7a6664736536376a336a686a71

Deployed Bytecode

0x608060405234801561000f575f5ffd5b5060043610610333575f3560e01c806370a08231116101af578063aa8b38d9116100fe578063d279c1911161009e578063ec25217f11610079578063ec25217f146106fe578063ef51f40614610731578063f2fde38b14610753578063fcfff16f14610766575f5ffd5b8063d279c191146106c5578063d67b06c1146106d8578063e985e9c5146106eb575f5ffd5b8063c87b56dd116100d9578063c87b56dd1461066a578063ccaf2f411461067d578063cf456ae714610690578063cfdb63ac146106a3575f5ffd5b8063aa8b38d914610631578063b59c6e0e14610644578063b88d4fde14610657575f5ffd5b806388b1e1f5116101695780638da5cb5b116101445780638da5cb5b146105f257806395d89b4114610603578063a22cb4651461060b578063a8a65a781461061e575f5ffd5b806388b1e1f5146105c35780638aee8127146105cc5780638d14e127146105df575f5ffd5b806370a082311461054257806370bba14b1461056a578063715018a61461057357806375ae267d1461057b57806380796bbf1461058e5780638093f3eb146105a1575f5ffd5b8063330a1f941161028557806349db98fa116102255780634fce1e60116102005780634fce1e60146104d7578063557ed1ba146104ea5780636352211e146104f25780636386c1c71461051a575f5ffd5b806349db98fa146104a85780634df9d6ba146104b15780634f6ccce7146104c4575f5ffd5b80633f7ff9cf116102605780633f7ff9cf1461046c57806340c10f19146104755780634132b8891461048857806342842e0e14610495575f5ffd5b8063330a1f941461043e5780633da96fa9146104515780633e63eb2a14610464575f5ffd5b806318160ddd116102f057806322b71bab116102cb57806322b71bab146103fc57806323b872dd1461040f57806324822514146104225780632f745c591461042b575f5ffd5b806318160ddd146103cf57806318af9a0a146103e15780632109ef7f146103e9575f5ffd5b806301ffc9a71461033757806306fdde031461035f578063081812fc14610374578063095ea7b31461039f578063125bfb66146103b4578063130e995b146103c7575b5f5ffd5b61034a6103453660046122d8565b61076e565b60405190151581526020015b60405180910390f35b6103676107bf565b6040516103569190612321565b610387610382366004612333565b61084e565b6040516001600160a01b039091168152602001610356565b6103b26103ad36600461235e565b6108e6565b005b6103b26103c2366004612388565b6109f8565b610367610a2d565b6008545b604051908152602001610356565b610367610ab9565b6103876103f7366004612333565b610ac6565b6103b261040a366004612333565b610b01565b6103b261041d366004612388565b610b55565b6103d3600f5481565b6103d361043936600461235e565b610b86565b6103b261044c3660046123d3565b610c28565b6103b261045f366004612333565b610c71565b610367610ca0565b6103d360155481565b6103b261048336600461235e565b610cad565b60105461034a9060ff1681565b6103b26104a3366004612388565b610d89565b6103d360145481565b6103d36104bf366004612401565b610da3565b6103d36104d2366004612333565b610dff565b6103d36104e536600461241c565b610e8f565b6103d3610f65565b610387610500366004612333565b5f908152600260205260409020546001600160a01b031690565b61052d610528366004612401565b610f79565b60408051928352602083019190915201610356565b6103d3610550366004612401565b6001600160a01b03165f9081526003602052604090205490565b6103d36101f481565b6103b2610fa2565b6103b261058936600461243c565b611015565b6103b261059c366004612500565b611052565b61034a6105af366004612401565b600e6020525f908152604090205460ff1681565b6103d360175481565b6103b26105da366004612401565b611095565b6103b26105ed366004612565565b6110e1565b600a546001600160a01b0316610387565b610367611135565b6103b2610619366004612565565b611144565b6103b261062c366004612333565b611153565b6103b261063f36600461235e565b611182565b601354610387906001600160a01b031681565b6103b2610665366004612591565b6111b6565b610367610678366004612333565b6111ee565b6103b261068b36600461260c565b611347565b6103b261069e366004612565565b61137d565b61034a6106b1366004612401565b60116020525f908152604090205460ff1681565b6103b26106d3366004612401565b6113d1565b6103b26106e636600461263e565b611580565b61034a6106f93660046126af565b61167e565b61071161070c366004612333565b6116ab565b604080519485526020850193909352918301526060820152608001610356565b61034a61073f366004612333565b60126020525f908152604090205460ff1681565b6103b2610761366004612401565b6116de565b6103b26117a3565b5f6301ffc9a760e01b6001600160e01b03198316148061079e57506380ac58cd60e01b6001600160e01b03198316145b806107b95750635b5e139f60e01b6001600160e01b03198316145b92915050565b60605f80546107cd906126db565b80601f01602080910402602001604051908101604052809291908181526020018280546107f9906126db565b80156108445780601f1061081b57610100808354040283529160200191610844565b820191905f5260205f20905b81548152906001019060200180831161082757829003601f168201915b5050505050905090565b5f818152600260205260408120546001600160a01b03166108cb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b505f908152600460205260409020546001600160a01b031690565b5f818152600260205260409020546001600160a01b0390811690831681900361095b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108c2565b336001600160a01b03821614806109775750610977813361167e565b6109e95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108c2565b6109f383836117d0565b505050565b600a546001600160a01b03163314610a225760405162461bcd60e51b81526004016108c290612713565b6109f3838383611836565b600c8054610a3a906126db565b80601f0160208091040260200160405190810160405280929190818152602001828054610a66906126db565b8015610ab15780601f10610a8857610100808354040283529160200191610ab1565b820191905f5260205f20905b815481529060010190602001808311610a9457829003601f168201915b505050505081565b600d8054610a3a906126db565b5f8181526012602052604081205460ff1615610ae5575061dead919050565b5f828152600260205260409020546001600160a01b03166107b9565b600a546001600160a01b03163314610b2b5760405162461bcd60e51b81526004016108c290612713565b5f610b39826201518061274a565b90508060185f828254610b4c9190612761565b90915550505050565b610b5f338261192a565b610b7b5760405162461bcd60e51b81526004016108c290612774565b6109f38383836119fc565b6001600160a01b0382165f908152600360205260408120548210610c005760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108c2565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610c525760405162461bcd60e51b81526004016108c290612713565b5f91825260126020526040909120805460ff1916911515919091179055565b600a546001600160a01b03163314610c9b5760405162461bcd60e51b81526004016108c290612713565b601555565b600b8054610a3a906126db565b335f908152600e602052604090205460ff16610cf55760405162461bcd60e51b815260206004820152600760248201526610b6b4b73a32b960c91b60448201526064016108c2565b600f546014545f610d04610f65565b90505f5b84811015610d3c57610d1a8685611ac8565b5f84815260166020526040902083815560019081018390559384019301610d08565b50600f8390556101f4610d4e60085490565b1115610d825760405162461bcd60e51b815260206004820152600360248201526209ac2f60eb1b60448201526064016108c2565b5050505050565b6109f383838360405180602001604052805f8152506111b6565b6001600160a01b0381165f908152600360205260408120545f610dc4610f65565b90505f5b82811015610df757610de3610ddd8683610b86565b83610e8f565b610ded9085612761565b9350600101610dc8565b505050919050565b5f610e0960085490565b8210610e6c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108c2565b60088281548110610e7f57610e7f6127c5565b905f5260205f2001549050919050565b6017545f90808203610ea4575f9150506107b9565b5f8481526012602052604090205460ff1615610ec3575f9150506107b9565b5f84815260166020526040902080548015610f5c57600182015483811015610ee85750825b80861115610f5a575f6201518061271060155485858b610f0891906127d9565b610f12919061274a565b610f1c919061274a565b610f269190612800565b610f309190612800565b905082811115610f3d5750815b600284015480821115610f5757610f5481836127d9565b96505b50505b505b50505092915050565b5f60185442610f749190612761565b905090565b6001600160a01b0381165f9081526003602052604081205490610f9b83610da3565b9050915091565b600a546001600160a01b03163314610fcc5760405162461bcd60e51b81526004016108c290612713565b600a546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600a546001600160a01b0316331461103f5760405162461bcd60e51b81526004016108c290612713565b6010805460ff1916911515919091179055565b600a546001600160a01b0316331461107c5760405162461bcd60e51b81526004016108c290612713565b600b6110888382612857565b50600c6109f38282612857565b600a546001600160a01b031633146110bf5760405162461bcd60e51b81526004016108c290612713565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b0316331461110b5760405162461bcd60e51b81526004016108c290612713565b6001600160a01b03919091165f908152601160205260409020805460ff1916911515919091179055565b6060600180546107cd906126db565b61114f338383611c12565b5050565b600a546001600160a01b0316331461117d5760405162461bcd60e51b81526004016108c290612713565b601455565b600a546001600160a01b031633146111ac5760405162461bcd60e51b81526004016108c290612713565b61114f8282611cdf565b6111c0338361192a565b6111dc5760405162461bcd60e51b81526004016108c290612774565b6111e884848484611d7e565b50505050565b60605f600b80546111fe906126db565b80601f016020809104026020016040519081016040528092919081815260200182805461122a906126db565b80156112755780601f1061124c57610100808354040283529160200191611275565b820191905f5260205f20905b81548152906001019060200180831161125857829003601f168201915b5050505050905080515f0361131257600d8054611291906126db565b80601f01602080910402602001604051908101604052809291908181526020018280546112bd906126db565b80156113085780601f106112df57610100808354040283529160200191611308565b820191905f5260205f20905b8154815290600101906020018083116112eb57829003601f168201915b5050505050611340565b8061131c84611db1565b600c60405160200161133093929190612929565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146113715760405162461bcd60e51b81526004016108c290612713565b600d61114f8282612857565b600a546001600160a01b031633146113a75760405162461bcd60e51b81526004016108c290612713565b6001600160a01b03919091165f908152600e60205260409020805460ff1916911515919091179055565b6001600160a01b03811615806113f1575061dead6001600160a01b038216145b156113f95750565b6001600160a01b0381165f908152600360205260408120545f61141a610f65565b90505f5f5f5b84811015611483576114328782610b86565b925061143e8385610e8f565b9150811561147b576114508287612761565b95508160165f8581526020019081526020015f206002015f8282546114759190612761565b90915550505b600101611420565b5084156115785760135460408051633aa9b4b560e21b815290516001600160a01b039092169182916323b872dd91839163eaa6d2d49160048083019260209291908290030181865afa1580156114db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ff91906129b0565b6040516001600160e01b031960e084901b1681526001600160a01b039182166004820152908a166024820152604481018990526064016020604051808303815f875af1158015611551573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157591906129cb565b50505b505050505050565b335f908152600e602052604090205460ff166115c85760405162461bcd60e51b815260206004820152600760248201526610b6b4b73a32b960c91b60448201526064016108c2565b600f546014548291905f6115da610f65565b90505f5b84811015611638576116168787838181106115fb576115fb6127c5565b90506020020160208101906116109190612401565b85611ac8565b5f848152601660205260409020838155600190810183905593840193016115de565b50600f8390556101f461164a60085490565b11156115785760405162461bcd60e51b815260206004820152600360248201526209ac2f60eb1b60448201526064016108c2565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f818152601660205260408120805460018201546002830154919390926116d4866104e5610f65565b9150509193509193565b600a546001600160a01b031633146117085760405162461bcd60e51b81526004016108c290612713565b6001600160a01b0381166117485760405162461bcd60e51b8152602060048201526007602482015266181037bbb732b960c91b60448201526064016108c2565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6017541580156117bd57506013546001600160a01b031633145b156117ce576117ca610f65565b6017555b565b5f81815260046020908152604080832080546001600160a01b0319166001600160a01b038781169182179092556002909352818420549151859492909116917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161189191906129e6565b5f604051808303815f865af19150503d805f81146118ca576040519150601f19603f3d011682016040523d82523d5f602084013e6118cf565b606091505b50915091508180156118f95750805115806118f95750808060200190518101906118f991906129cb565b610d825760405162461bcd60e51b81526020600482015260026024820152612a2360f11b60448201526064016108c2565b5f818152600260205260408120546001600160a01b03166119a25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108c2565b5f828152600260205260409020546001600160a01b039081169084168114806119e45750836001600160a01b03166119d98461084e565b6001600160a01b0316145b806119f457506119f4818561167e565b949350505050565b5f8181526012602052604090205460ff1615611a425760405162461bcd60e51b8152602060048201526005602482015264626c61636b60d81b60448201526064016108c2565b60105460ff1680611a6a57506001600160a01b0383165f9081526011602052604090205460ff165b80611a8c57506001600160a01b0382165f9081526011602052604090205460ff165b611abd5760405162461bcd60e51b8152602060048201526002602482015261139560f21b60448201526064016108c2565b6109f3838383611eae565b6001600160a01b038216611b1e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108c2565b5f818152600260205260409020546001600160a01b031615611b825760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108c2565b611b8d5f8383611ff2565b6001600160a01b0382165f908152600360205260408120805460019290611bb5908490612761565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031603611c735760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108c2565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b604080515f808252602082019092526001600160a01b038416908390604051611d0891906129e6565b5f6040518083038185875af1925050503d805f8114611d42576040519150601f19603f3d011682016040523d82523d5f602084013e611d47565b606091505b50509050806109f35760405162461bcd60e51b815260206004820152600360248201526222aa2360e91b60448201526064016108c2565b611d898484846119fc565b611d9584848484612107565b6111e85760405162461bcd60e51b81526004016108c2906129f1565b6060815f03611dd75750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611e005780611dea81612a43565b9150611df99050600a83612800565b9150611dda565b5f8167ffffffffffffffff811115611e1a57611e1a612457565b6040519080825280601f01601f191660200182016040528015611e44576020820181803683370190505b5090505b84156119f457611e596001836127d9565b9150611e66600a86612a5b565b611e71906030612761565b60f81b818381518110611e8657611e866127c5565b60200101906001600160f81b03191690815f1a905350611ea7600a86612800565b9450611e48565b5f818152600260205260409020546001600160a01b03848116911614611f285760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108c2565b611f33838383611ff2565b611f3d5f826117d0565b6001600160a01b0383165f908152600360205260408120805460019290611f659084906127d9565b90915550506001600160a01b0382165f908152600360205260408120805460019290611f92908490612761565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03831661204c5761204781600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61206f565b816001600160a01b0316836001600160a01b03161461206f5761206f8382612202565b6001600160a01b0382166120b15760405162461bcd60e51b8152602060048201526009602482015268189d5c9b881919585960ba1b60448201526064016108c2565b826001600160a01b0316826001600160a01b0316146109f3576001600160a01b03919091165f90815260036020908152604080832054600683528184208185528352818420859055938352600790915290205550565b5f612111846122a9565b156121f757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612148903390899088908890600401612a6e565b6020604051808303815f875af1925050508015612182575060408051601f3d908101601f1916820190925261217f91810190612aaa565b60015b6121dd573d8080156121af576040519150601f19603f3d011682016040523d82523d5f602084013e6121b4565b606091505b5080515f036121d55760405162461bcd60e51b81526004016108c2906129f1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119f4565b506001949350505050565b6001600160a01b0382165f90815260036020526040812054612226906001906127d9565b5f83815260076020526040902054909150808214612277576001600160a01b0384165f9081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b505f9182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b5f813b801580159061134057506017141592915050565b6001600160e01b0319811681146122d5575f5ffd5b50565b5f602082840312156122e8575f5ffd5b8135611340816122c0565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61134060208301846122f3565b5f60208284031215612343575f5ffd5b5035919050565b6001600160a01b03811681146122d5575f5ffd5b5f5f6040838503121561236f575f5ffd5b823561237a8161234a565b946020939093013593505050565b5f5f5f6060848603121561239a575f5ffd5b83356123a58161234a565b925060208401356123b58161234a565b929592945050506040919091013590565b80151581146122d5575f5ffd5b5f5f604083850312156123e4575f5ffd5b8235915060208301356123f6816123c6565b809150509250929050565b5f60208284031215612411575f5ffd5b81356113408161234a565b5f5f6040838503121561242d575f5ffd5b50508035926020909101359150565b5f6020828403121561244c575f5ffd5b8135611340816123c6565b634e487b7160e01b5f52604160045260245ffd5b5f5f67ffffffffffffffff84111561248557612485612457565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156124b4576124b4612457565b6040528381529050808284018510156124cb575f5ffd5b838360208301375f60208583010152509392505050565b5f82601f8301126124f1575f5ffd5b6113408383356020850161246b565b5f5f60408385031215612511575f5ffd5b823567ffffffffffffffff811115612527575f5ffd5b612533858286016124e2565b925050602083013567ffffffffffffffff81111561254f575f5ffd5b61255b858286016124e2565b9150509250929050565b5f5f60408385031215612576575f5ffd5b82356125818161234a565b915060208301356123f6816123c6565b5f5f5f5f608085870312156125a4575f5ffd5b84356125af8161234a565b935060208501356125bf8161234a565b925060408501359150606085013567ffffffffffffffff8111156125e1575f5ffd5b8501601f810187136125f1575f5ffd5b6126008782356020840161246b565b91505092959194509250565b5f6020828403121561261c575f5ffd5b813567ffffffffffffffff811115612632575f5ffd5b6119f4848285016124e2565b5f5f6020838503121561264f575f5ffd5b823567ffffffffffffffff811115612665575f5ffd5b8301601f81018513612675575f5ffd5b803567ffffffffffffffff81111561268b575f5ffd5b8560208260051b840101111561269f575f5ffd5b6020919091019590945092505050565b5f5f604083850312156126c0575f5ffd5b82356126cb8161234a565b915060208301356123f68161234a565b600181811c908216806126ef57607f821691505b60208210810361270d57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107b9576107b9612736565b808201808211156107b9576107b9612736565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b818103818111156107b9576107b9612736565b634e487b7160e01b5f52601260045260245ffd5b5f8261280e5761280e6127ec565b500490565b601f8211156109f357805f5260205f20601f840160051c810160208510156128385750805b601f840160051c820191505b81811015610d82575f8155600101612844565b815167ffffffffffffffff81111561287157612871612457565b6128858161287f84546126db565b84612813565b6020601f8211600181146128b7575f83156128a05750848201515b5f19600385901b1c1916600184901b178455610d82565b5f84815260208120601f198516915b828110156128e657878501518255602094850194600190920191016128c6565b508482101561290357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f81518060208401855e5f93019283525090919050565b5f61293d6129378387612912565b85612912565b5f8454612949816126db565b6001821680156129605760018114612975576129a2565b60ff19831685528115158202850193506129a2565b875f5260205f205f5b8381101561299a5781548782015260019091019060200161297e565b505081850193505b509198975050505050505050565b5f602082840312156129c0575f5ffd5b81516113408161234a565b5f602082840312156129db575f5ffd5b8151611340816123c6565b5f6113408284612912565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f60018201612a5457612a54612736565b5060010190565b5f82612a6957612a696127ec565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612aa0908301846122f3565b9695505050505050565b5f60208284031215612aba575f5ffd5b8151611340816122c056fea264697066735822122076286833f7fdc346de74413199d4be21ebfc7a8565deedc28b31d5e1dfb73fb064736f6c634300081e0033

Deployed Bytecode Sourcemap

21759:9399:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14265:255;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;14265:255:0;;;;;;;;3532:102;;;:::i;:::-;;;;;;;:::i;4346:274::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1528:32:1;;;1510:51;;1498:2;1483:18;4346:274:0;1364:203:1;3871:409:0;;;;;;:::i;:::-;;:::i;:::-;;25487:171;;;;;;:::i;:::-;;:::i;22506:21::-;;;:::i;14998:113::-;15086:10;:17;14998:113;;;2739:25:1;;;2727:2;2712:18;14998:113:0;2593:177:1;22536:22:0;;;:::i;26245:195::-;;;;;;:::i;:::-;;:::i;30417:123::-;;;;;;:::i;:::-;;:::i;5199:376::-;;;;;;:::i;:::-;;:::i;22615:27::-;;;;;;14604:318;;;;;;:::i;:::-;;:::i;25248:108::-;;;;;;:::i;:::-;;:::i;30271:97::-;;;;;;:::i;:::-;;:::i;22477:22::-;;;:::i;22902:36::-;;;;;;23038:609;;;;;;:::i;:::-;;:::i;22649:31::-;;;;;;;;;5646:187;;;;;;:::i;:::-;;:::i;22867:28::-;;;;;;28843:457;;;;;;:::i;:::-;;:::i;15188:288::-;;;;;;:::i;:::-;;:::i;27635:1200::-;;;;;;:::i;:::-;;:::i;30548:105::-;;;:::i;3294:171::-;;;;;;:::i;:::-;3382:7;3418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;3418:16:0;;3294:171;29308:212;;;;;;:::i;:::-;;:::i;:::-;;;;4041:25:1;;;4097:2;4082:18;;4075:34;;;;4014:18;29308:212:0;3867:248:1;3093:139:0;;;;;;:::i;:::-;-1:-1:-1;;;;;3208:16:0;3181:7;3208:16;;;:9;:16;;;;;;;3093:139;22785:39;;22821:3;22785:39;;21109:148;;;:::i;25026:96::-;;;;;;:::i;:::-;;:::i;24636:165::-;;;;;;:::i;:::-;;:::i;22567:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23005:24;;;;;;30071:93;;;;;;:::i;:::-;;:::i;25130:110::-;;;;;;:::i;:::-;;:::i;20920:79::-;20985:6;;-1:-1:-1;;;;;20985:6:0;20920:79;;3703:106;;;:::i;4692:180::-;;;;;;:::i;:::-;;:::i;30172:91::-;;;;;;:::i;:::-;;:::i;25364:115::-;;;;;;:::i;:::-;;:::i;22833:27::-;;;;;-1:-1:-1;;;;;22833:27:0;;;5904:363;;;;;;:::i;:::-;;:::i;24315:313::-;;;;;;:::i;:::-;;:::i;24809:91::-;;;;;;:::i;:::-;;:::i;24908:110::-;;;;;;:::i;:::-;;:::i;22687:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26756:871;;;;;;:::i;:::-;;:::i;23655:652::-;;;;;;:::i;:::-;;:::i;4943:189::-;;;;;;:::i;:::-;;:::i;29528:535::-;;;;;;:::i;:::-;;:::i;:::-;;;;8794:25:1;;;8850:2;8835:18;;8828:34;;;;8878:18;;;8871:34;8936:2;8921:18;;8914:34;8781:3;8766:19;29528:535:0;8563:391:1;22736:42:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21265:213;;;;;;:::i;:::-;;:::i;30661:139::-;;;:::i;14265:255::-;14366:4;-1:-1:-1;;;;;;;;;14403:25:0;;;;:67;;-1:-1:-1;;;;;;;;;;14445:25:0;;;14403:67;:109;;;-1:-1:-1;;;;;;;;;;14487:25:0;;;14403:109;14383:129;14265:255;-1:-1:-1;;14265:255:0:o;3532:102::-;3588:13;3621:5;3614:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3532:102;:::o;4346:274::-;4438:7;7903:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7903:16:0;4458:110;;;;-1:-1:-1;;;4458:110:0;;9546:2:1;4458:110:0;;;9528:21:1;9585:2;9565:18;;;9558:30;9624:34;9604:18;;;9597:62;-1:-1:-1;;;9675:18:1;;;9668:42;9727:19;;4458:110:0;;;;;;;;;-1:-1:-1;4588:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;4588:24:0;;4346:274::o;3871:409::-;3954:13;3418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;3418:16:0;;;;4012:11;;;;;4004:57;;;;-1:-1:-1;;;4004:57:0;;9959:2:1;4004:57:0;;;9941:21:1;9998:2;9978:18;;;9971:30;10037:34;10017:18;;;10010:62;-1:-1:-1;;;10088:18:1;;;10081:31;10129:19;;4004:57:0;9757:397:1;4004:57:0;4096:10;-1:-1:-1;;;;;4096:19:0;;;;:58;;;4119:35;4136:5;4143:10;4119:16;:35::i;:::-;4074:164;;;;-1:-1:-1;;;4074:164:0;;10361:2:1;4074:164:0;;;10343:21:1;10400:2;10380:18;;;10373:30;10439:34;10419:18;;;10412:62;10510:26;10490:18;;;10483:54;10554:19;;4074:164:0;10159:420:1;4074:164:0;4251:21;4260:2;4264:7;4251:8;:21::i;:::-;3943:337;3871:409;;:::o;25487:171::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;25614:36:::1;25632:5;25639:2;25643:6;25614:17;:36::i;22506:21::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22536:22::-;;;;;;;:::i;26245:195::-;26305:7;26329:19;;;:10;:19;;;;;;;;26325:74;;;-1:-1:-1;26380:6:0;;26245:195;-1:-1:-1;26245:195:0:o;26325:74::-;3382:7;3418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;3418:16:0;26416;3294:171;30417:123;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;30479:10:::1;30492:11;:2:::0;30497:6:::1;30492:11;:::i;:::-;30479:24;;30530:2;30514:12;;:18;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;30417:123:0:o;5199:376::-;5410:39;5429:10;5441:7;5410:18;:39::i;:::-;5388:138;;;;-1:-1:-1;;;5388:138:0;;;;;;;:::i;:::-;5539:28;5549:4;5555:2;5559:7;5539:9;:28::i;14604:318::-;-1:-1:-1;;;;;3208:16:0;;14726:7;3208:16;;;:9;:16;;;;;;14768:5;:31;14746:124;;;;-1:-1:-1;;;14746:124:0;;11976:2:1;14746:124:0;;;11958:21:1;12015:2;11995:18;;;11988:30;12054:34;12034:18;;;12027:62;-1:-1:-1;;;12105:18:1;;;12098:41;12156:19;;14746:124:0;11774:407:1;14746:124:0;-1:-1:-1;;;;;;14888:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;14604:318::o;25248:108::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;25325:14:::1;::::0;;;:10:::1;:14;::::0;;;;;:23;;-1:-1:-1;;25325:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25248:108::o;30271:97::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;30340:16:::1;:20:::0;30271:97::o;22477:22::-;;;;;;;:::i;23038:609::-;23113:10;23105:19;;;;:7;:19;;;;;;;;23097:39;;;;-1:-1:-1;;;23097:39:0;;12388:2:1;23097:39:0;;;12370:21:1;12427:1;12407:18;;;12400:29;-1:-1:-1;;;12445:18:1;;;12438:37;12492:18;;23097:39:0;12186:330:1;23097:39:0;23165:8;;23207:13;;23147:15;23251:9;:7;:9::i;:::-;23231:29;;23276:9;23271:287;23291:3;23287:1;:7;23271:287;;;23313:18;23319:2;23323:7;23313:5;:18::i;:::-;23346:23;;;;:14;:23;;;;;:50;;;23411:33;;;;:45;;;23500:9;;;;23528:3;23271:287;;;-1:-1:-1;23568:8:0;:18;;;22821:3;23605:13;15086:10;:17;;14998:113;23605:13;:26;;23597:42;;;;-1:-1:-1;;;23597:42:0;;12723:2:1;23597:42:0;;;12705:21:1;12762:1;12742:18;;;12735:29;-1:-1:-1;;;12780:18:1;;;12773:33;12823:18;;23597:42:0;12521:326:1;23597:42:0;23086:561;;;23038:609;;:::o;5646:187::-;5786:39;5803:4;5809:2;5813:7;5786:39;;;;;;;;;;;;:16;:39::i;28843:457::-;-1:-1:-1;;;;;3208:16:0;;28923:14;3208:16;;;:9;:16;;;;;;29014:19;29036:9;:7;:9::i;:::-;29014:31;;29061:9;29056:237;29076:3;29072:1;:7;29056:237;;;29108:111;29143:31;29163:7;29172:1;29143:19;:31::i;:::-;29193:11;29108:16;:111::i;:::-;29098:121;;;;:::i;:::-;;-1:-1:-1;29263:3:0;;29056:237;;;;28939:361;;28843:457;;;:::o;15188:288::-;15281:7;15331:30;15086:10;:17;;14998:113;15331:30;15323:5;:38;15301:132;;;;-1:-1:-1;;;15301:132:0;;13054:2:1;15301:132:0;;;13036:21:1;13093:2;13073:18;;;13066:30;13132:34;13112:18;;;13105:62;-1:-1:-1;;;13183:18:1;;;13176:42;13235:19;;15301:132:0;12852:408:1;15301:132:0;15451:10;15462:5;15451:17;;;;;;;;:::i;:::-;;;;;;;;;15444:24;;15188:288;;;:::o;27635:1200::-;27789:9;;27743:14;;27813:13;;;27809:54;;27850:1;27843:8;;;;;27809:54;27877:17;;;;:10;:17;;;;;;;;27873:58;;;27918:1;27911:8;;;;;27873:58;27941:29;27973:21;;;:14;:21;;;;;28027:22;;28064:15;;28060:768;;28116:20;;;;28155;;;28151:81;;;-1:-1:-1;28208:8:0;28151:81;28264:9;28250:11;:23;28246:571;;;28294:21;28473:6;28444:5;28403:16;;28368:11;28334:9;28320:11;:23;;;;:::i;:::-;28319:60;;;;:::i;:::-;:100;;;;:::i;:::-;28318:131;;;;:::i;:::-;:161;;;;:::i;:::-;28294:185;;28518:11;28502:13;:27;28498:103;;;-1:-1:-1;28570:11:0;28498:103;28643:24;;;;28690:29;;;28686:116;;;28753:29;28769:13;28753;:29;:::i;:::-;28744:38;;28686:116;28275:542;;28246:571;28081:747;28060:768;27759:1076;;;27635:1200;;;;:::o;30548:105::-;30588:7;30633:12;;30615:15;:30;;;;:::i;:::-;30608:37;;30548:105;:::o;29308:212::-;-1:-1:-1;;;;;3208:16:0;;29385:14;3208:16;;;:9;:16;;;;;;;29487:25;3208:16;29487;:25::i;:::-;29472:40;;29308:212;;;:::o;21109:148::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;21200:6:::1;::::0;21179:40:::1;::::0;21216:1:::1;::::0;-1:-1:-1;;;;;21200:6:0::1;::::0;21179:40:::1;::::0;21216:1;;21179:40:::1;21230:6;:19:::0;;-1:-1:-1;;;;;;21230:19:0::1;::::0;;21109:148::o;25026:96::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;25093:12:::1;:21:::0;;-1:-1:-1;;25093:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25026:96::o;24636:165::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;24752:8:::1;:14;24763:3:::0;24752:8;:14:::1;:::i;:::-;-1:-1:-1::0;24777:7:0::1;:16;24787:6:::0;24777:7;:16:::1;:::i;30071:93::-:0;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;30138:12:::1;:18:::0;;-1:-1:-1;;;;;;30138:18:0::1;-1:-1:-1::0;;;;;30138:18:0;;;::::1;::::0;;;::::1;::::0;;30071:93::o;25130:110::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25208:15:0;;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:24;;-1:-1:-1;;25208:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25130:110::o;3703:106::-;3761:13;3794:7;3787:14;;;;;:::i;4692:180::-;4814:50;4833:10;4845:8;4855;4814:18;:50::i;:::-;4692:180;;:::o;30172:91::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;30238:13:::1;:17:::0;30172:91::o;25364:115::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;25444:27:::1;25460:2;25464:6;25444:15;:27::i;5904:363::-:0;6093:39;6112:10;6124:7;6093:18;:39::i;:::-;6071:138;;;;-1:-1:-1;;;6071:138:0;;;;;;;:::i;:::-;6220:39;6234:4;6240:2;6244:7;6253:5;6220:13;:39::i;:::-;5904:363;;;;:::o;24315:313::-;24401:13;24427:21;24451:8;24427:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24496:7;24490:21;24515:1;24490:26;:130;;24612:8;24490:130;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24560:7;24569:12;24578:2;24569:8;:12::i;:::-;24583:7;24543:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24490:130;24470:150;24315:313;-1:-1:-1;;;24315:313:0:o;24809:91::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;24878:8:::1;:14;24889:3:::0;24878:8;:14:::1;:::i;24908:110::-:0;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24986:15:0;;;::::1;;::::0;;;:7:::1;:15;::::0;;;;:24;;-1:-1:-1;;24986:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24908:110::o;26756:871::-;-1:-1:-1;;;;;26816:21:0;;;;:51;;-1:-1:-1;26849:6:0;-1:-1:-1;;;;;26841:26:0;;;26816:51;26812:90;;;26756:871;:::o;26812:90::-;-1:-1:-1;;;;;3208:16:0;;26912:14;3208:16;;;:9;:16;;;;;;26980:19;27002:9;:7;:9::i;:::-;26980:31;;27022:13;27046:21;27083:9;27078:388;27098:3;27094:1;:7;27078:388;;;27128:31;27148:7;27157:1;27128:19;:31::i;:::-;27120:39;;27190:36;27207:5;27214:11;27190:16;:36::i;:::-;27174:52;-1:-1:-1;27245:17:0;;27241:152;;27283:23;27293:13;27283:23;;:::i;:::-;;;27364:13;27325:14;:21;27340:5;27325:21;;;;;;;;;;;:35;;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;27241:152:0;27436:3;;27078:388;;;-1:-1:-1;27480:10:0;;27476:144;;27529:12;;27576:14;;;-1:-1:-1;;;27576:14:0;;;;-1:-1:-1;;;;;27529:12:0;;;;;;27557:18;;27529:12;;27576;;:14;;;;;;;;;;;;;;27529:12;27576:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27557:51;;-1:-1:-1;;;;;;27557:51:0;;;;;;;-1:-1:-1;;;;;17574:32:1;;;27557:51:0;;;17556::1;17643:32;;;17623:18;;;17616:60;17692:18;;;17685:34;;;17529:18;;27557:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27492:128;27476:144;26801:826;;;;;26756:871;:::o;23655:652::-;23734:10;23726:19;;;;:7;:19;;;;;;;;23718:39;;;;-1:-1:-1;;;23718:39:0;;12388:2:1;23718:39:0;;;12370:21:1;12427:1;12407:18;;;12400:29;-1:-1:-1;;;12445:18:1;;;12438:37;12492:18;;23718:39:0;12186:330:1;23718:39:0;23821:8;;23863:13;;23782:3;;23821:8;23768:11;23907:9;:7;:9::i;:::-;23887:29;;23932:9;23927:291;23947:3;23943:1;:7;23927:291;;;23969:22;23975:3;;23979:1;23975:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;23983:7;23969:5;:22::i;:::-;24006:23;;;;:14;:23;;;;;:50;;;24071:33;;;;:45;;;24160:9;;;;24188:3;23927:291;;;-1:-1:-1;24228:8:0;:18;;;22821:3;24265:13;15086:10;:17;;14998:113;24265:13;:26;;24257:42;;;;-1:-1:-1;;;24257:42:0;;12723:2:1;24257:42:0;;;12705:21:1;12762:1;12742:18;;;12735:29;-1:-1:-1;;;12780:18:1;;;12773:33;12823:18;;24257:42:0;12521:326:1;4943:189:0;-1:-1:-1;;;;;5089:25:0;;;5065:4;5089:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4943:189::o;29528:535::-;29649:19;29832:21;;;:14;:21;;;;;29878:22;;29923:20;;;;29970:24;;;;29878:22;;29923:20;;30021:34;29847:5;30045:9;:7;:9::i;30021:34::-;30005:50;;29789:274;29528:535;;;;;:::o;21265:213::-;21047:6;;-1:-1:-1;;;;;21047:6:0;21057:10;21047:20;21039:42;;;;-1:-1:-1;;;21039:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21354:22:0;::::1;21346:42;;;::::0;-1:-1:-1;;;21346:42:0;;18182:2:1;21346:42:0::1;::::0;::::1;18164:21:1::0;18221:1;18201:18;;;18194:29;-1:-1:-1;;;18239:18:1;;;18232:37;18286:18;;21346:42:0::1;17980:330:1::0;21346:42:0::1;21425:6;::::0;21404:38:::1;::::0;-1:-1:-1;;;;;21404:38:0;;::::1;::::0;21425:6:::1;::::0;21404:38:::1;::::0;21425:6:::1;::::0;21404:38:::1;21453:6;:17:::0;;-1:-1:-1;;;;;;21453:17:0::1;-1:-1:-1::0;;;;;21453:17:0;;;::::1;::::0;;;::::1;::::0;;21265:213::o;30661:139::-;30704:9;;30699:14;:44;;;;-1:-1:-1;30731:12:0;;-1:-1:-1;;;;;30731:12:0;30717:10;:26;30699:44;30695:98;;;30772:9;:7;:9::i;:::-;30760;:21;30695:98;30661:139::o;10256:174::-;10331:24;;;;:15;:24;;;;;;;;:29;;-1:-1:-1;;;;;;10331:29:0;-1:-1:-1;;;;;10331:29:0;;;;;;;;;3418:7;:16;;;;;;;10376:46;;10331:24;;3418:16;;;;;10376:46;;;10256:174;;:::o;25666:398::-;25880:45;;;-1:-1:-1;;;;;18507:32:1;;;25880:45:0;;;18489:51:1;18556:18;;;;18549:34;;;25880:45:0;;;;;;;;;;18462:18:1;;;;25880:45:0;;;;;;;-1:-1:-1;;;;;25880:45:0;-1:-1:-1;;;25880:45:0;;;25855:81;;-1:-1:-1;;;;25855:10:0;;;;:81;;25880:45;25855:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25819:117;;;;25969:7;:57;;;;-1:-1:-1;25981:11:0;;:16;;:44;;;26012:4;26001:24;;;;;;;;;;;;:::i;:::-;25947:109;;;;-1:-1:-1;;;25947:109:0;;18991:2:1;25947:109:0;;;18973:21:1;19030:1;19010:18;;;19003:29;-1:-1:-1;;;19048:18:1;;;19041:32;19090:18;;25947:109:0;18789:325:1;8108:436:0;8226:4;7903:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7903:16:0;8243:110;;;;-1:-1:-1;;;8243:110:0;;19321:2:1;8243:110:0;;;19303:21:1;19360:2;19340:18;;;19333:30;19399:34;19379:18;;;19372:62;-1:-1:-1;;;19450:18:1;;;19443:42;19502:19;;8243:110:0;19119:408:1;8243:110:0;8364:13;3418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;3418:16:0;;;;8422;;;;;:64;;;8479:7;-1:-1:-1;;;;;8455:31:0;:20;8467:7;8455:11;:20::i;:::-;-1:-1:-1;;;;;8455:31:0;;8422:64;:113;;;;8503:32;8520:5;8527:7;8503:16;:32::i;:::-;8414:122;8108:436;-1:-1:-1;;;;8108:436:0:o;26448:300::-;26590:19;;;;:10;:19;;;;;;;;26589:20;26581:38;;;;-1:-1:-1;;;26581:38:0;;19734:2:1;26581:38:0;;;19716:21:1;19773:1;19753:18;;;19746:29;-1:-1:-1;;;19791:18:1;;;19784:35;19836:18;;26581:38:0;19532:328:1;26581:38:0;26638:12;;;;;:32;;-1:-1:-1;;;;;;26654:16:0;;;;;;:10;:16;;;;;;;;26638:32;:50;;;-1:-1:-1;;;;;;26674:14:0;;;;;;:10;:14;;;;;;;;26638:50;26630:65;;;;-1:-1:-1;;;26630:65:0;;20067:2:1;26630:65:0;;;20049:21:1;20106:1;20086:18;;;20079:29;-1:-1:-1;;;20124:18:1;;;20117:32;20166:18;;26630:65:0;19865:325:1;26630:65:0;26706:34;26722:4;26728:2;26732:7;26706:15;:34::i;8880:382::-;-1:-1:-1;;;;;8960:16:0;;8952:61;;;;-1:-1:-1;;;8952:61:0;;20397:2:1;8952:61:0;;;20379:21:1;;;20416:18;;;20409:30;20475:34;20455:18;;;20448:62;20527:18;;8952:61:0;20195:356:1;8952:61:0;7879:4;7903:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7903:16:0;:30;9024:58;;;;-1:-1:-1;;;9024:58:0;;20758:2:1;9024:58:0;;;20740:21:1;20797:2;20777:18;;;20770:30;20836;20816:18;;;20809:58;20884:18;;9024:58:0;20556:352:1;9024:58:0;9095:45;9124:1;9128:2;9132:7;9095:20;:45::i;:::-;-1:-1:-1;;;;;9153:13:0;;;;;;:9;:13;;;;;:18;;9170:1;;9153:13;:18;;9170:1;;9153:18;:::i;:::-;;;;-1:-1:-1;;9182:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9182:21:0;-1:-1:-1;;;;;9182:21:0;;;;;;;;9221:33;;9182:16;;;9221:33;;9182:16;;9221:33;8880:382;;:::o;10572:315::-;10727:8;-1:-1:-1;;;;;10718:17:0;:5;-1:-1:-1;;;;;10718:17:0;;10710:55;;;;-1:-1:-1;;;10710:55:0;;21115:2:1;10710:55:0;;;21097:21:1;21154:2;21134:18;;;21127:30;21193:27;21173:18;;;21166:55;21238:18;;10710:55:0;20913:349:1;10710:55:0;-1:-1:-1;;;;;10776:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;10776:46:0;;;;;;;;;;10838:41;;540::1;;;10838::0;;513:18:1;10838:41:0;;;;;;;10572:315;;;:::o;26072:165::-;26182:12;;;26142;26182;;;;;;;;;-1:-1:-1;;;;;26160:7:0;;;26175:5;;26160:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26141:54;;;26214:7;26206:23;;;;-1:-1:-1;;;26206:23:0;;21469:2:1;26206:23:0;;;21451:21:1;21508:1;21488:18;;;21481:29;-1:-1:-1;;;21526:18:1;;;21519:33;21569:18;;26206:23:0;21267:326:1;7149:352:0;7306:28;7316:4;7322:2;7326:7;7306:9;:28::i;:::-;7367:48;7390:4;7396:2;7400:7;7409:5;7367:22;:48::i;:::-;7345:148;;;;-1:-1:-1;;;7345:148:0;;;;;;;:::i;21937:532::-;21993:13;22023:5;22032:1;22023:10;22019:53;;-1:-1:-1;;22050:10:0;;;;;;;;;;;;-1:-1:-1;;;22050:10:0;;;;;21937:532::o;22019:53::-;22097:5;22082:12;22138:78;22145:9;;22138:78;;22171:8;;;;:::i;:::-;;-1:-1:-1;22194:10:0;;-1:-1:-1;22202:2:0;22194:10;;:::i;:::-;;;22138:78;;;22226:19;22258:6;22248:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22248:17:0;;22226:39;;22276:154;22283:10;;22276:154;;22310:11;22320:1;22310:11;;:::i;:::-;;-1:-1:-1;22379:10:0;22387:2;22379:5;:10;:::i;:::-;22366:24;;:2;:24;:::i;:::-;22353:39;;22336:6;22343;22336:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;22336:56:0;;;;;;;;-1:-1:-1;22407:11:0;22416:2;22407:11;;:::i;:::-;;;22276:154;;9599:539;3382:7;3418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;9745:31:0;;;3418:16;;9745:31;9723:122;;;;-1:-1:-1;;;9723:122:0;;22476:2:1;9723:122:0;;;22458:21:1;22515:2;22495:18;;;22488:30;22554:34;22534:18;;;22527:62;-1:-1:-1;;;22605:18:1;;;22598:39;22654:19;;9723:122:0;22274:405:1;9723:122:0;9858:39;9879:4;9885:2;9889:7;9858:20;:39::i;:::-;9962:29;9979:1;9983:7;9962:8;:29::i;:::-;-1:-1:-1;;;;;10004:15:0;;;;;;:9;:15;;;;;:20;;10023:1;;10004:15;:20;;10023:1;;10004:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10035:13:0;;;;;;:9;:13;;;;;:18;;10052:1;;10035:13;:18;;10052:1;;10035:18;:::i;:::-;;;;-1:-1:-1;;10064:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10064:21:0;-1:-1:-1;;;;;10064:21:0;;;;;;;;;10103:27;;10064:16;;10103:27;;;;;;;9599:539;;;:::o;16089:538::-;-1:-1:-1;;;;;16295:18:0;;16291:187;;16330:40;16362:7;17454:10;:17;;17427:24;;;;:15;:24;;;;;:44;;;17482:24;;;;;;;;;;;;17350:164;16330:40;16291:187;;;16400:2;-1:-1:-1;;;;;16392:10:0;:4;-1:-1:-1;;;;;16392:10:0;;16388:90;;16419:47;16452:4;16458:7;16419:32;:47::i;:::-;-1:-1:-1;;;;;16496:16:0;;16488:38;;;;-1:-1:-1;;;16488:38:0;;22886:2:1;16488:38:0;;;22868:21:1;22925:1;22905:18;;;22898:29;-1:-1:-1;;;22943:18:1;;;22936:39;22992:18;;16488:38:0;22684:332:1;16488:38:0;16547:4;-1:-1:-1;;;;;16541:10:0;:2;-1:-1:-1;;;;;16541:10:0;;16537:83;;-1:-1:-1;;;;;3208:16:0;;;;17013:14;3208:16;;;:9;:16;;;;;;;;;17061:12;:16;;;;;:24;;;;;;;;:34;;;17106:26;;;:17;:26;;;;;:35;-1:-1:-1;3871:409:0:o;11452:977::-;11607:4;11628:14;11639:2;11628:10;:14::i;:::-;11624:798;;;11680:173;;-1:-1:-1;;;11680:173:0;;-1:-1:-1;;;;;11680:36:0;;;;;:173;;11739:10;;11772:4;;11799:7;;11829:5;;11680:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11680:173:0;;;;;;;;-1:-1:-1;;11680:173:0;;;;;;;;;;;;:::i;:::-;;;11659:708;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12036:6;:13;12053:1;12036:18;12032:320;;12079:108;;-1:-1:-1;;;12079:108:0;;;;;;;:::i;12032:320::-;12302:6;12296:13;12287:6;12283:2;12279:15;12272:38;11659:708;-1:-1:-1;;;;;;11917:51:0;-1:-1:-1;;;11917:51:0;;-1:-1:-1;11910:58:0;;11624:798;-1:-1:-1;12406:4:0;11452:977;;;;;;:::o;18141:1039::-;-1:-1:-1;;;;;3208:16:0;;18432:22;3208:16;;;:9;:16;;;;;;18457:26;;18482:1;;18457:26;:::i;:::-;18494:18;18515:26;;;:17;:26;;;;;;18432:51;;-1:-1:-1;18648:28:0;;;18644:354;;-1:-1:-1;;;;;18715:18:0;;18693:19;18715:18;;;:12;:18;;;;;;;;:34;;;;;;;;;18766:30;;;;;;:44;;;18896:30;;:17;:30;;;;;:43;;;18644:354;-1:-1:-1;19094:26:0;;;;:17;:26;;;;;;;;19087:33;;;-1:-1:-1;;;;;19138:18:0;;;;;:12;:18;;;;;:34;;;;;;;19131:41;18141:1039::o;2042:210::-;2102:4;2174:20;;2222:8;;;;;:22;;-1:-1:-1;2234:2:0;:10;;;2215:29;-1:-1:-1;;2042:210:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:300::-;645:3;683:5;677:12;710:6;705:3;698:19;766:6;759:4;752:5;748:16;741:4;736:3;732:14;726:47;818:1;811:4;802:6;797:3;793:16;789:27;782:38;881:4;874:2;870:7;865:2;857:6;853:15;849:29;844:3;840:39;836:50;829:57;;;592:300;;;;:::o;897:231::-;1046:2;1035:9;1028:21;1009:4;1066:56;1118:2;1107:9;1103:18;1095:6;1066:56;:::i;1133:226::-;1192:6;1245:2;1233:9;1224:7;1220:23;1216:32;1213:52;;;1261:1;1258;1251:12;1213:52;-1:-1:-1;1306:23:1;;1133:226;-1:-1:-1;1133:226:1:o;1572:131::-;-1:-1:-1;;;;;1647:31:1;;1637:42;;1627:70;;1693:1;1690;1683:12;1708:367;1776:6;1784;1837:2;1825:9;1816:7;1812:23;1808:32;1805:52;;;1853:1;1850;1843:12;1805:52;1892:9;1879:23;1911:31;1936:5;1911:31;:::i;:::-;1961:5;2039:2;2024:18;;;;2011:32;;-1:-1:-1;;;1708:367:1:o;2080:508::-;2157:6;2165;2173;2226:2;2214:9;2205:7;2201:23;2197:32;2194:52;;;2242:1;2239;2232:12;2194:52;2281:9;2268:23;2300:31;2325:5;2300:31;:::i;:::-;2350:5;-1:-1:-1;2407:2:1;2392:18;;2379:32;2420:33;2379:32;2420:33;:::i;:::-;2080:508;;2472:7;;-1:-1:-1;;;2552:2:1;2537:18;;;;2524:32;;2080:508::o;2775:118::-;2861:5;2854:13;2847:21;2840:5;2837:32;2827:60;;2883:1;2880;2873:12;2898:361;2963:6;2971;3024:2;3012:9;3003:7;2999:23;2995:32;2992:52;;;3040:1;3037;3030:12;2992:52;3085:23;;;-1:-1:-1;3184:2:1;3169:18;;3156:32;3197:30;3156:32;3197:30;:::i;:::-;3246:7;3236:17;;;2898:361;;;;;:::o;3264:247::-;3323:6;3376:2;3364:9;3355:7;3351:23;3347:32;3344:52;;;3392:1;3389;3382:12;3344:52;3431:9;3418:23;3450:31;3475:5;3450:31;:::i;3516:346::-;3584:6;3592;3645:2;3633:9;3624:7;3620:23;3616:32;3613:52;;;3661:1;3658;3651:12;3613:52;-1:-1:-1;;3706:23:1;;;3826:2;3811:18;;;3798:32;;-1:-1:-1;3516:346:1:o;4120:241::-;4176:6;4229:2;4217:9;4208:7;4204:23;4200:32;4197:52;;;4245:1;4242;4235:12;4197:52;4284:9;4271:23;4303:28;4325:5;4303:28;:::i;4366:127::-;4427:10;4422:3;4418:20;4415:1;4408:31;4458:4;4455:1;4448:15;4482:4;4479:1;4472:15;4498:716;4563:5;4595:1;4619:18;4611:6;4608:30;4605:56;;;4641:18;;:::i;:::-;-1:-1:-1;4796:2:1;4790:9;-1:-1:-1;;4709:2:1;4688:15;;4684:29;;4854:2;4842:15;4838:29;4826:42;;4919:22;;;4898:18;4883:34;;4880:62;4877:88;;;4945:18;;:::i;:::-;4981:2;4974:22;5029;;;5014:6;-1:-1:-1;5014:6:1;5066:16;;;5063:25;-1:-1:-1;5060:45:1;;;5101:1;5098;5091:12;5060:45;5151:6;5146:3;5139:4;5131:6;5127:17;5114:44;5206:1;5199:4;5190:6;5182;5178:19;5174:30;5167:41;;4498:716;;;;;:::o;5219:222::-;5262:5;5315:3;5308:4;5300:6;5296:17;5292:27;5282:55;;5333:1;5330;5323:12;5282:55;5355:80;5431:3;5422:6;5409:20;5402:4;5394:6;5390:17;5355:80;:::i;5446:538::-;5534:6;5542;5595:2;5583:9;5574:7;5570:23;5566:32;5563:52;;;5611:1;5608;5601:12;5563:52;5651:9;5638:23;5684:18;5676:6;5673:30;5670:50;;;5716:1;5713;5706:12;5670:50;5739;5781:7;5772:6;5761:9;5757:22;5739:50;:::i;:::-;5729:60;;;5842:2;5831:9;5827:18;5814:32;5871:18;5861:8;5858:32;5855:52;;;5903:1;5900;5893:12;5855:52;5926;5970:7;5959:8;5948:9;5944:24;5926:52;:::i;:::-;5916:62;;;5446:538;;;;;:::o;5989:382::-;6054:6;6062;6115:2;6103:9;6094:7;6090:23;6086:32;6083:52;;;6131:1;6128;6121:12;6083:52;6170:9;6157:23;6189:31;6214:5;6189:31;:::i;:::-;6239:5;-1:-1:-1;6296:2:1;6281:18;;6268:32;6309:30;6268:32;6309:30;:::i;6376:847::-;6471:6;6479;6487;6495;6548:3;6536:9;6527:7;6523:23;6519:33;6516:53;;;6565:1;6562;6555:12;6516:53;6604:9;6591:23;6623:31;6648:5;6623:31;:::i;:::-;6673:5;-1:-1:-1;6730:2:1;6715:18;;6702:32;6743:33;6702:32;6743:33;:::i;:::-;6795:7;-1:-1:-1;6875:2:1;6860:18;;6847:32;;-1:-1:-1;6956:2:1;6941:18;;6928:32;6983:18;6972:30;;6969:50;;;7015:1;7012;7005:12;6969:50;7038:22;;7091:4;7083:13;;7079:27;-1:-1:-1;7069:55:1;;7120:1;7117;7110:12;7069:55;7143:74;7209:7;7204:2;7191:16;7186:2;7182;7178:11;7143:74;:::i;:::-;7133:84;;;6376:847;;;;;;;:::o;7228:322::-;7297:6;7350:2;7338:9;7329:7;7325:23;7321:32;7318:52;;;7366:1;7363;7356:12;7318:52;7406:9;7393:23;7439:18;7431:6;7428:30;7425:50;;;7471:1;7468;7461:12;7425:50;7494;7536:7;7527:6;7516:9;7512:22;7494:50;:::i;7555:610::-;7641:6;7649;7702:2;7690:9;7681:7;7677:23;7673:32;7670:52;;;7718:1;7715;7708:12;7670:52;7758:9;7745:23;7791:18;7783:6;7780:30;7777:50;;;7823:1;7820;7813:12;7777:50;7846:22;;7899:4;7891:13;;7887:27;-1:-1:-1;7877:55:1;;7928:1;7925;7918:12;7877:55;7968:2;7955:16;7994:18;7986:6;7983:30;7980:50;;;8026:1;8023;8016:12;7980:50;8079:7;8074:2;8064:6;8061:1;8057:14;8053:2;8049:23;8045:32;8042:45;8039:65;;;8100:1;8097;8090:12;8039:65;8131:2;8123:11;;;;;8153:6;;-1:-1:-1;7555:610:1;-1:-1:-1;;;7555:610:1:o;8170:388::-;8238:6;8246;8299:2;8287:9;8278:7;8274:23;8270:32;8267:52;;;8315:1;8312;8305:12;8267:52;8354:9;8341:23;8373:31;8398:5;8373:31;:::i;:::-;8423:5;-1:-1:-1;8480:2:1;8465:18;;8452:32;8493:33;8452:32;8493:33;:::i;8959:380::-;9038:1;9034:12;;;;9081;;;9102:61;;9156:4;9148:6;9144:17;9134:27;;9102:61;9209:2;9201:6;9198:14;9178:18;9175:38;9172:161;;9255:10;9250:3;9246:20;9243:1;9236:31;9290:4;9287:1;9280:15;9318:4;9315:1;9308:15;9172:161;;8959:380;;;:::o;10584:332::-;10786:2;10768:21;;;10825:1;10805:18;;;10798:29;-1:-1:-1;;;10858:2:1;10843:18;;10836:39;10907:2;10892:18;;10584:332::o;10921:127::-;10982:10;10977:3;10973:20;10970:1;10963:31;11013:4;11010:1;11003:15;11037:4;11034:1;11027:15;11053:168;11126:9;;;11157;;11174:15;;;11168:22;;11154:37;11144:71;;11195:18;;:::i;11226:125::-;11291:9;;;11312:10;;;11309:36;;;11325:18;;:::i;11356:413::-;11558:2;11540:21;;;11597:2;11577:18;;;11570:30;11636:34;11631:2;11616:18;;11609:62;-1:-1:-1;;;11702:2:1;11687:18;;11680:47;11759:3;11744:19;;11356:413::o;13265:127::-;13326:10;13321:3;13317:20;13314:1;13307:31;13357:4;13354:1;13347:15;13381:4;13378:1;13371:15;13397:128;13464:9;;;13485:11;;;13482:37;;;13499:18;;:::i;13530:127::-;13591:10;13586:3;13582:20;13579:1;13572:31;13622:4;13619:1;13612:15;13646:4;13643:1;13636:15;13662:120;13702:1;13728;13718:35;;13733:18;;:::i;:::-;-1:-1:-1;13767:9:1;;13662:120::o;13913:518::-;14015:2;14010:3;14007:11;14004:421;;;14051:5;14048:1;14041:16;14095:4;14092:1;14082:18;14165:2;14153:10;14149:19;14146:1;14142:27;14136:4;14132:38;14201:4;14189:10;14186:20;14183:47;;;-1:-1:-1;14224:4:1;14183:47;14279:2;14274:3;14270:12;14267:1;14263:20;14257:4;14253:31;14243:41;;14334:81;14352:2;14345:5;14342:13;14334:81;;;14411:1;14397:16;;14378:1;14367:13;14334:81;;14607:1299;14733:3;14727:10;14760:18;14752:6;14749:30;14746:56;;;14782:18;;:::i;:::-;14811:97;14901:6;14861:38;14893:4;14887:11;14861:38;:::i;:::-;14855:4;14811:97;:::i;:::-;14957:4;14988:2;14977:14;;15005:1;15000:649;;;;15693:1;15710:6;15707:89;;;-1:-1:-1;15762:19:1;;;15756:26;15707:89;-1:-1:-1;;14564:1:1;14560:11;;;14556:24;14552:29;14542:40;14588:1;14584:11;;;14539:57;15809:81;;14970:930;;15000:649;13860:1;13853:14;;;13897:4;13884:18;;-1:-1:-1;;15036:20:1;;;15154:222;15168:7;15165:1;15162:14;15154:222;;;15250:19;;;15244:26;15229:42;;15357:4;15342:20;;;;15310:1;15298:14;;;;15184:12;15154:222;;;15158:3;15404:6;15395:7;15392:19;15389:201;;;15465:19;;;15459:26;-1:-1:-1;;15548:1:1;15544:14;;;15560:3;15540:24;15536:37;15532:42;15517:58;15502:74;;15389:201;-1:-1:-1;;;;15636:1:1;15620:14;;;15616:22;15603:36;;-1:-1:-1;14607:1299:1:o;15911:212::-;15953:3;15991:5;15985:12;16035:6;16028:4;16021:5;16017:16;16012:3;16006:36;16097:1;16061:16;;16086:13;;;-1:-1:-1;16061:16:1;;15911:212;-1:-1:-1;15911:212:1:o;16128:965::-;16352:3;16380:57;16406:30;16432:3;16424:6;16406:30;:::i;:::-;16398:6;16380:57;:::i;:::-;16457:1;16490:6;16484:13;16520:36;16546:9;16520:36;:::i;:::-;16587:1;16572:17;;16598:131;;;;16743:1;16738:330;;;;16565:503;;16598:131;-1:-1:-1;;16630:24:1;;16619:36;;16702:14;;16695:22;16683:35;;16675:44;;;-1:-1:-1;16598:131:1;;16738:330;16769:6;16766:1;16759:17;16817:4;16814:1;16804:18;16844:1;16858:165;16872:6;16869:1;16866:13;16858:165;;;16951:14;;16939:10;;;16932:34;17007:1;16994:15;;;;16894:4;16887:12;16858:165;;;16862:3;;17051:6;17047:2;17043:15;17036:22;;16565:503;-1:-1:-1;17084:3:1;;16128:965;-1:-1:-1;;;;;;;;16128:965:1:o;17098:251::-;17168:6;17221:2;17209:9;17200:7;17196:23;17192:32;17189:52;;;17237:1;17234;17227:12;17189:52;17269:9;17263:16;17288:31;17313:5;17288:31;:::i;17730:245::-;17797:6;17850:2;17838:9;17829:7;17825:23;17821:32;17818:52;;;17866:1;17863;17856:12;17818:52;17898:9;17892:16;17917:28;17939:5;17917:28;:::i;18594:190::-;18723:3;18748:30;18774:3;18766:6;18748:30;:::i;21598:414::-;21800:2;21782:21;;;21839:2;21819:18;;;21812:30;21878:34;21873:2;21858:18;;21851:62;-1:-1:-1;;;21944:2:1;21929:18;;21922:48;22002:3;21987:19;;21598:414::o;22017:135::-;22056:3;22077:17;;;22074:43;;22097:18;;:::i;:::-;-1:-1:-1;22144:1:1;22133:13;;22017:135::o;22157:112::-;22189:1;22215;22205:35;;22220:18;;:::i;:::-;-1:-1:-1;22254:9:1;;22157:112::o;23021:496::-;-1:-1:-1;;;;;23252:32:1;;;23234:51;;23321:32;;23316:2;23301:18;;23294:60;23385:2;23370:18;;23363:34;;;23433:3;23428:2;23413:18;;23406:31;;;-1:-1:-1;;23454:57:1;;23491:19;;23483:6;23454:57;:::i;:::-;23446:65;23021:496;-1:-1:-1;;;;;;23021:496:1:o;23522:249::-;23591:6;23644:2;23632:9;23623:7;23619:23;23615:32;23612:52;;;23660:1;23657;23650:12;23612:52;23692:9;23686:16;23711:30;23735:5;23711:30;:::i

Swarm Source

ipfs://76286833f7fdc346de74413199d4be21ebfc7a8565deedc28b31d5e1dfb73fb0
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.