ETH Price: $3,346.49 (-0.92%)

Token

Sisyphus NFT (SN)
 

Overview

Max Total Supply

666 SN

Holders

398

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 SN
0x71ae825f7e74b7fbb5c5314eb3acc5ae27093dfe
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SisyphusNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-27
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0; 

abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
 
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
 
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
library Address { 
    function isContract(address account) internal view returns (bool) { 
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    } 
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    } 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    } 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else { 
            if (returndata.length > 0) { 

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
interface IERC721Receiver { 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 { 
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
abstract contract ERC165 is IERC165 { 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
} 
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;
} 
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);
}  
interface IERC721Metadata is IERC721 { 
    function name() external view returns (string memory); 
    function symbol() external view returns (string memory); 
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract SisyphusNFT is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;


  uint256 public MAX_PER_Transaction = 1; // maximam amount that user can mint
  uint256 public MAX_PER_Wallet = 2; // maximam amount that user can mint

  mapping(address => uint256) public publicClaimedBy;

  uint256 public  PRICE = 0 ether; 

  uint256 private constant TotalCollectionSize_ = 666; // total number of nfts
  uint256 private constant MaxMintPerBatch_ = 10; //max mint per traction


  bool public _revelNFT = false;
  string private _baseTokenURI;
  string private _uriBeforeRevel;
  uint public reserve = 0;


  uint public status = 0; //0-pause 1-Public

  constructor() ERC721A("Sisyphus NFT","SN") {
    _uriBeforeRevel = "https://gateway.pinata.cloud/ipfs/QmUzNYYchBty73CbJT6YmMFsL5YHr83d28wHP59sJ4yEiX/reveal.json";
    _baseTokenURI = "https://gateway.pinata.cloud/ipfs/QmPWq86aJkUxhLo1JLTnWE93SHe92zXNwxdSahw2WmPN2A";
  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
 
  function mint(uint256 quantity) external payable callerIsUser {
    require(status == 1 , "Sale is not Active");
    require(totalSupply() + quantity <= TotalCollectionSize_-reserve, "reached max supply");
    require(quantity <= MAX_PER_Transaction,"can not mint this many");
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");


    publicClaimedBy[msg.sender] += quantity;
    require(publicClaimedBy[msg.sender] <= MAX_PER_Wallet, "Purchase exceeds max allowed");
    _safeMint(msg.sender, quantity);
  }


   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    if(_revelNFT){
    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")) : "";
        } else {
            return _uriBeforeRevel;
        }
  }

  function setURIbeforeRevel(string memory URI) external onlyOwner {
    _uriBeforeRevel = URI;
  }

  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }
  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return _ownershipOf(tokenId);
  }

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  function changeRevelStatus() external onlyOwner {
    _revelNFT = !_revelNFT;
  }

  function changeMintPrice(uint256 _newPrice) external onlyOwner
  {
      PRICE = _newPrice;
  }
  function changeMAX_PER_Transaction(uint256 q) external onlyOwner
  {
      MAX_PER_Transaction = q;
  }

  function setStatus(uint256 s)external onlyOwner{
      status = s;
  }

   function getStatus()public view returns(uint){
      return status;
  }

 function setReserveTokens(uint256 _quantity) public onlyOwner {
        reserve=_quantity;
    }
    
  function getPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PRICE;
    }

 function mintReserveTokens(uint quantity) public onlyOwner {
        require(quantity <= reserve, "The quantity exceeds the reserve.");
        reserve -= quantity;
        _safeMint(msg.sender, quantity);

    }

  function airdrop(address a, uint q)public onlyOwner{
    require(totalSupply() + q <= TotalCollectionSize_, "reached max supply");
    _safeMint(a, q);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_Wallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_revelNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"},{"internalType":"uint256","name":"q","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeRevelStatus","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":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","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":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"setReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setURIbeforeRevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600a556002600b556000600d556000600e60006101000a81548160ff021916908315150217905550600060115560006012553480156200004557600080fd5b506040518060400160405280600c81526020017f5369737970687573204e465400000000000000000000000000000000000000008152506040518060400160405280600281526020017f534e000000000000000000000000000000000000000000000000000000000000815250620000d2620000c66200018e60201b60201c565b6200019660201b60201c565b8160039080519060200190620000ea92919062000263565b5080600490805190602001906200010392919062000263565b50620001146200025a60201b60201c565b600181905550505060016009819055506040518060800160405280605c815260200162004579605c9139601090805190602001906200015592919062000263565b506040518060800160405280605081526020016200452960509139600f90805190602001906200018792919062000263565b5062000378565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620002719062000313565b90600052602060002090601f016020900481019282620002955760008555620002e1565b82601f10620002b057805160ff1916838001178555620002e1565b82800160010185558215620002e1579182015b82811115620002e0578251825591602001919060010190620002c3565b5b509050620002f09190620002f4565b5090565b5b808211156200030f576000816000905550600101620002f5565b5090565b600060028204905060018216806200032c57607f821691505b6020821081141562000343576200034262000349565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6141a180620003886000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e578063a40ece7a116100ab578063cd3293de1161006f578063cd3293de14610804578063dc33e6811461082f578063e75722301461086c578063e985e9c5146108a9578063f2fde38b146108e657610230565b8063a40ece7a14610747578063ac44600214610770578063b88d4fde14610787578063bd0a8439146107b0578063c87b56dd146107c757610230565b80638da5cb5b116100f25780638da5cb5b1461066f5780639231ab2a1461069a57806395d89b41146106d7578063a0712d6814610702578063a22cb4651461071e57610230565b806370a082311461058a578063715018a6146105c757806375236143146105de5780638ba4cc3c1461061b5780638d859f3e1461064457610230565b80633fd17366116101bc5780635c37809d116101805780635c37809d146104a757806362c6f7b9146104d05780636352211e146104fb57806369ba1a75146105385780636a44e1731461056157610230565b80633fd17366146103d657806342842e0e146103ff5780634e69d5601461042857806351d7ff931461045357806355f804b31461047e57610230565b806317e04a711161020357806317e04a711461030357806318160ddd1461032e578063200d2ed21461035957806323b872dd14610384578063288bd8fd146103ad57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906132f6565b61090f565b60405161026991906137c8565b60405180910390f35b34801561027e57600080fd5b506102876109f1565b60405161029491906137e3565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613399565b610a83565b6040516102d19190613761565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906132b6565b610aff565b005b34801561030f57600080fd5b50610318610c0a565b60405161032591906139a0565b60405180910390f35b34801561033a57600080fd5b50610343610c10565b60405161035091906139a0565b60405180910390f35b34801561036557600080fd5b5061036e610c27565b60405161037b91906139a0565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a691906131a0565b610c2d565b005b3480156103b957600080fd5b506103d460048036038101906103cf9190613399565b610c3d565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190613399565b610d24565b005b34801561040b57600080fd5b50610426600480360381019061042191906131a0565b610daa565b005b34801561043457600080fd5b5061043d610dca565b60405161044a91906139a0565b60405180910390f35b34801561045f57600080fd5b50610468610dd4565b60405161047591906139a0565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190613350565b610dda565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613350565b610e70565b005b3480156104dc57600080fd5b506104e5610f06565b6040516104f291906137c8565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d9190613399565b610f19565b60405161052f9190613761565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190613399565b610f2f565b005b34801561056d57600080fd5b5061058860048036038101906105839190613399565b610fb5565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613133565b61103b565b6040516105be91906139a0565b60405180910390f35b3480156105d357600080fd5b506105dc61110b565b005b3480156105ea57600080fd5b5061060560048036038101906106009190613133565b611193565b60405161061291906139a0565b60405180910390f35b34801561062757600080fd5b50610642600480360381019061063d91906132b6565b6111ab565b005b34801561065057600080fd5b5061065961128c565b60405161066691906139a0565b60405180910390f35b34801561067b57600080fd5b50610684611292565b6040516106919190613761565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613399565b6112bb565b6040516106ce9190613985565b60405180910390f35b3480156106e357600080fd5b506106ec6112d3565b6040516106f991906137e3565b60405180910390f35b61071c60048036038101906107179190613399565b611365565b005b34801561072a57600080fd5b5061074560048036038101906107409190613276565b6115f8565b005b34801561075357600080fd5b5061076e60048036038101906107699190613399565b611770565b005b34801561077c57600080fd5b506107856117f6565b005b34801561079357600080fd5b506107ae60048036038101906107a991906131f3565b611977565b005b3480156107bc57600080fd5b506107c56119f3565b005b3480156107d357600080fd5b506107ee60048036038101906107e99190613399565b611a9b565b6040516107fb91906137e3565b60405180910390f35b34801561081057600080fd5b50610819611bea565b60405161082691906139a0565b60405180910390f35b34801561083b57600080fd5b5061085660048036038101906108519190613133565b611bf0565b60405161086391906139a0565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e9190613399565b611c02565b6040516108a091906139a0565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb9190613160565b611c19565b6040516108dd91906137c8565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613133565b611cad565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109ea57506109e982611da5565b5b9050919050565b606060038054610a0090613c6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2c90613c6f565b8015610a795780601f10610a4e57610100808354040283529160200191610a79565b820191906000526020600020905b815481529060010190602001808311610a5c57829003601f168201915b5050505050905090565b6000610a8e82611e0f565b610ac4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0a82610f19565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b72576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b91611e5d565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bc35750610bc181610bbc611e5d565b611c19565b155b15610bfa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c05838383611e65565b505050565b600b5481565b6000610c1a611f17565b6002546001540303905090565b60125481565b610c38838383611f20565b505050565b610c45611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610c63611292565b73ffffffffffffffffffffffffffffffffffffffff1614610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb0906138a5565b60405180910390fd5b601154811115610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590613825565b60405180910390fd5b8060116000828254610d109190613b71565b92505081905550610d2133826123d6565b50565b610d2c611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610d4a611292565b73ffffffffffffffffffffffffffffffffffffffff1614610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d97906138a5565b60405180910390fd5b80600d8190555050565b610dc583838360405180602001604052806000815250611977565b505050565b6000601254905090565b600a5481565b610de2611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610e00611292565b73ffffffffffffffffffffffffffffffffffffffff1614610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d906138a5565b60405180910390fd5b80600f9080519060200190610e6c929190612f04565b5050565b610e78611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610e96611292565b73ffffffffffffffffffffffffffffffffffffffff1614610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906138a5565b60405180910390fd5b8060109080519060200190610f02929190612f04565b5050565b600e60009054906101000a900460ff1681565b6000610f24826123f4565b600001519050919050565b610f37611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610f55611292565b73ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906138a5565b60405180910390fd5b8060128190555050565b610fbd611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610fdb611292565b73ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611028906138a5565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611113611e5d565b73ffffffffffffffffffffffffffffffffffffffff16611131611292565b73ffffffffffffffffffffffffffffffffffffffff1614611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e906138a5565b60405180910390fd5b6111916000612683565b565b600c6020528060005260406000206000915090505481565b6111b3611e5d565b73ffffffffffffffffffffffffffffffffffffffff166111d1611292565b73ffffffffffffffffffffffffffffffffffffffff1614611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e906138a5565b60405180910390fd5b61029a81611233610c10565b61123d9190613a90565b111561127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590613885565b60405180910390fd5b61128882826123d6565b5050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112c3612f8a565b6112cc826123f4565b9050919050565b6060600480546112e290613c6f565b80601f016020809104026020016040519081016040528092919081815260200182805461130e90613c6f565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613865565b60405180910390fd5b600160125414611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90613845565b60405180910390fd5b60115461029a6114289190613b71565b81611431610c10565b61143b9190613a90565b111561147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147390613885565b60405180910390fd5b600a548111156114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613925565b60405180910390fd5b80600d546114cf9190613b17565b341015611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890613905565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115609190613a90565b92505081905550600b54600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156115eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e290613945565b60405180910390fd5b6115f533826123d6565b50565b611600611e5d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611665576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611672611e5d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661171f611e5d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161176491906137c8565b60405180910390a35050565b611778611e5d565b73ffffffffffffffffffffffffffffffffffffffff16611796611292565b73ffffffffffffffffffffffffffffffffffffffff16146117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e3906138a5565b60405180910390fd5b80600a8190555050565b6117fe611e5d565b73ffffffffffffffffffffffffffffffffffffffff1661181c611292565b73ffffffffffffffffffffffffffffffffffffffff1614611872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611869906138a5565b60405180910390fd5b600260095414156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af90613965565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516118e69061374c565b60006040518083038185875af1925050503d8060008114611923576040519150601f19603f3d011682016040523d82523d6000602084013e611928565b606091505b505090508061196c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611963906138e5565b60405180910390fd5b506001600981905550565b611982848484611f20565b6119a18373ffffffffffffffffffffffffffffffffffffffff16612747565b80156119b657506119b48484848461275a565b155b156119ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6119fb611e5d565b73ffffffffffffffffffffffffffffffffffffffff16611a19611292565b73ffffffffffffffffffffffffffffffffffffffff1614611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a66906138a5565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6060611aa682611e0f565b611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc906138c5565b60405180910390fd5b600e60009054906101000a900460ff1615611b57576000611b046128ba565b90506000815111611b245760405180602001604052806000815250611b4f565b80611b2e8461294c565b604051602001611b3f929190613712565b6040516020818303038152906040525b915050611be5565b60108054611b6490613c6f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9090613c6f565b8015611bdd5780601f10611bb257610100808354040283529160200191611bdd565b820191906000526020600020905b815481529060010190602001808311611bc057829003601f168201915b505050505090505b919050565b60115481565b6000611bfb82612aad565b9050919050565b6000600d5482611c129190613b17565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cb5611e5d565b73ffffffffffffffffffffffffffffffffffffffff16611cd3611292565b73ffffffffffffffffffffffffffffffffffffffff1614611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d20906138a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9090613805565b60405180910390fd5b611da281612683565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611e1a611f17565b11158015611e29575060015482105b8015611e56575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611f2b826123f4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f96576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611fb7611e5d565b73ffffffffffffffffffffffffffffffffffffffff161480611fe65750611fe585611fe0611e5d565b611c19565b5b8061202b5750611ff4611e5d565b73ffffffffffffffffffffffffffffffffffffffff1661201384610a83565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612064576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120cb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d88585856001612b17565b6120e460008487611e65565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561236457600154821461236357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123cf8585856001612b1d565b5050505050565b6123f0828260405180602001604052806000815250612b23565b5050565b6123fc612f8a565b60008290508061240a611f17565b11158015612419575060015481105b1561264c576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161264a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461252e57809250505061267e565b5b60011561264957818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461264457809250505061267e565b61252f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612780611e5d565b8786866040518563ffffffff1660e01b81526004016127a2949392919061377c565b602060405180830381600087803b1580156127bc57600080fd5b505af19250505080156127ed57506040513d601f19601f820116820180604052508101906127ea9190613323565b60015b612867573d806000811461281d576040519150601f19603f3d011682016040523d82523d6000602084013e612822565b606091505b5060008151141561285f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546128c990613c6f565b80601f01602080910402602001604051908101604052809291908181526020018280546128f590613c6f565b80156129425780601f1061291757610100808354040283529160200191612942565b820191906000526020600020905b81548152906001019060200180831161292557829003601f168201915b5050505050905090565b60606000821415612994576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612aa8565b600082905060005b600082146129c65780806129af90613cd2565b915050600a826129bf9190613ae6565b915061299c565b60008167ffffffffffffffff8111156129e2576129e1613e08565b5b6040519080825280601f01601f191660200182016040528015612a145781602001600182028036833780820191505090505b5090505b60008514612aa157600182612a2d9190613b71565b9150600a85612a3c9190613d1b565b6030612a489190613a90565b60f81b818381518110612a5e57612a5d613dd9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a9a9190613ae6565b9450612a18565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b612b308383836001612b35565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612ba3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612bde576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612beb6000868387612b17565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612db55750612db48773ffffffffffffffffffffffffffffffffffffffff16612747565b5b15612e7b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e2a600088848060010195508861275a565b612e60576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612dbb578260015414612e7657600080fd5b612ee7565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612e7c575b816001819055505050612efd6000868387612b1d565b5050505050565b828054612f1090613c6f565b90600052602060002090601f016020900481019282612f325760008555612f79565b82601f10612f4b57805160ff1916838001178555612f79565b82800160010185558215612f79579182015b82811115612f78578251825591602001919060010190612f5d565b5b509050612f869190612fcd565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612fe6576000816000905550600101612fce565b5090565b6000612ffd612ff8846139e0565b6139bb565b90508281526020810184848401111561301957613018613e3c565b5b613024848285613c2d565b509392505050565b600061303f61303a84613a11565b6139bb565b90508281526020810184848401111561305b5761305a613e3c565b5b613066848285613c2d565b509392505050565b60008135905061307d8161410f565b92915050565b60008135905061309281614126565b92915050565b6000813590506130a78161413d565b92915050565b6000815190506130bc8161413d565b92915050565b600082601f8301126130d7576130d6613e37565b5b81356130e7848260208601612fea565b91505092915050565b600082601f83011261310557613104613e37565b5b813561311584826020860161302c565b91505092915050565b60008135905061312d81614154565b92915050565b60006020828403121561314957613148613e46565b5b60006131578482850161306e565b91505092915050565b6000806040838503121561317757613176613e46565b5b60006131858582860161306e565b92505060206131968582860161306e565b9150509250929050565b6000806000606084860312156131b9576131b8613e46565b5b60006131c78682870161306e565b93505060206131d88682870161306e565b92505060406131e98682870161311e565b9150509250925092565b6000806000806080858703121561320d5761320c613e46565b5b600061321b8782880161306e565b945050602061322c8782880161306e565b935050604061323d8782880161311e565b925050606085013567ffffffffffffffff81111561325e5761325d613e41565b5b61326a878288016130c2565b91505092959194509250565b6000806040838503121561328d5761328c613e46565b5b600061329b8582860161306e565b92505060206132ac85828601613083565b9150509250929050565b600080604083850312156132cd576132cc613e46565b5b60006132db8582860161306e565b92505060206132ec8582860161311e565b9150509250929050565b60006020828403121561330c5761330b613e46565b5b600061331a84828501613098565b91505092915050565b60006020828403121561333957613338613e46565b5b6000613347848285016130ad565b91505092915050565b60006020828403121561336657613365613e46565b5b600082013567ffffffffffffffff81111561338457613383613e41565b5b613390848285016130f0565b91505092915050565b6000602082840312156133af576133ae613e46565b5b60006133bd8482850161311e565b91505092915050565b6133cf81613ba5565b82525050565b6133de81613ba5565b82525050565b6133ed81613bb7565b82525050565b6133fc81613bb7565b82525050565b600061340d82613a42565b6134178185613a58565b9350613427818560208601613c3c565b61343081613e4b565b840191505092915050565b600061344682613a4d565b6134508185613a74565b9350613460818560208601613c3c565b61346981613e4b565b840191505092915050565b600061347f82613a4d565b6134898185613a85565b9350613499818560208601613c3c565b80840191505092915050565b60006134b2602683613a74565b91506134bd82613e5c565b604082019050919050565b60006134d5602183613a74565b91506134e082613eab565b604082019050919050565b60006134f8601283613a74565b915061350382613efa565b602082019050919050565b600061351b601e83613a74565b915061352682613f23565b602082019050919050565b600061353e601283613a74565b915061354982613f4c565b602082019050919050565b6000613561600583613a85565b915061356c82613f75565b600582019050919050565b6000613584602083613a74565b915061358f82613f9e565b602082019050919050565b60006135a7602f83613a74565b91506135b282613fc7565b604082019050919050565b60006135ca600083613a69565b91506135d582614016565b600082019050919050565b60006135ed601083613a74565b91506135f882614019565b602082019050919050565b6000613610601683613a74565b915061361b82614042565b602082019050919050565b6000613633601683613a74565b915061363e8261406b565b602082019050919050565b6000613656601c83613a74565b915061366182614094565b602082019050919050565b6000613679601f83613a74565b9150613684826140bd565b602082019050919050565b600061369c600183613a85565b91506136a7826140e6565b600182019050919050565b6060820160008201516136c860008501826133c6565b5060208201516136db6020850182613703565b5060408201516136ee60408501826133e4565b50505050565b6136fd81613c0f565b82525050565b61370c81613c19565b82525050565b600061371e8285613474565b91506137298261368f565b91506137358284613474565b915061374082613554565b91508190509392505050565b6000613757826135bd565b9150819050919050565b600060208201905061377660008301846133d5565b92915050565b600060808201905061379160008301876133d5565b61379e60208301866133d5565b6137ab60408301856136f4565b81810360608301526137bd8184613402565b905095945050505050565b60006020820190506137dd60008301846133f3565b92915050565b600060208201905081810360008301526137fd818461343b565b905092915050565b6000602082019050818103600083015261381e816134a5565b9050919050565b6000602082019050818103600083015261383e816134c8565b9050919050565b6000602082019050818103600083015261385e816134eb565b9050919050565b6000602082019050818103600083015261387e8161350e565b9050919050565b6000602082019050818103600083015261389e81613531565b9050919050565b600060208201905081810360008301526138be81613577565b9050919050565b600060208201905081810360008301526138de8161359a565b9050919050565b600060208201905081810360008301526138fe816135e0565b9050919050565b6000602082019050818103600083015261391e81613603565b9050919050565b6000602082019050818103600083015261393e81613626565b9050919050565b6000602082019050818103600083015261395e81613649565b9050919050565b6000602082019050818103600083015261397e8161366c565b9050919050565b600060608201905061399a60008301846136b2565b92915050565b60006020820190506139b560008301846136f4565b92915050565b60006139c56139d6565b90506139d18282613ca1565b919050565b6000604051905090565b600067ffffffffffffffff8211156139fb576139fa613e08565b5b613a0482613e4b565b9050602081019050919050565b600067ffffffffffffffff821115613a2c57613a2b613e08565b5b613a3582613e4b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9b82613c0f565b9150613aa683613c0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613adb57613ada613d4c565b5b828201905092915050565b6000613af182613c0f565b9150613afc83613c0f565b925082613b0c57613b0b613d7b565b5b828204905092915050565b6000613b2282613c0f565b9150613b2d83613c0f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b6657613b65613d4c565b5b828202905092915050565b6000613b7c82613c0f565b9150613b8783613c0f565b925082821015613b9a57613b99613d4c565b5b828203905092915050565b6000613bb082613bef565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613c5a578082015181840152602081019050613c3f565b83811115613c69576000848401525b50505050565b60006002820490506001821680613c8757607f821691505b60208210811415613c9b57613c9a613daa565b5b50919050565b613caa82613e4b565b810181811067ffffffffffffffff82111715613cc957613cc8613e08565b5b80604052505050565b6000613cdd82613c0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d1057613d0f613d4c565b5b600182019050919050565b6000613d2682613c0f565b9150613d3183613c0f565b925082613d4157613d40613d7b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61411881613ba5565b811461412357600080fd5b50565b61412f81613bb7565b811461413a57600080fd5b50565b61414681613bc3565b811461415157600080fd5b50565b61415d81613c0f565b811461416857600080fd5b5056fea2646970667358221220da60fd74ec081177777598b90c1af6246bc2a3cc741a214d782ace8f8103633964736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5057713836614a6b5578684c6f314a4c546e5745393353486539327a584e7778645361687732576d504e324168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d557a4e59596368427479373343624a5436596d4d46734c3559487238336432387748503539734a34794569582f72657665616c2e6a736f6e

Deployed Bytecode

0x6080604052600436106102305760003560e01c806370a082311161012e578063a40ece7a116100ab578063cd3293de1161006f578063cd3293de14610804578063dc33e6811461082f578063e75722301461086c578063e985e9c5146108a9578063f2fde38b146108e657610230565b8063a40ece7a14610747578063ac44600214610770578063b88d4fde14610787578063bd0a8439146107b0578063c87b56dd146107c757610230565b80638da5cb5b116100f25780638da5cb5b1461066f5780639231ab2a1461069a57806395d89b41146106d7578063a0712d6814610702578063a22cb4651461071e57610230565b806370a082311461058a578063715018a6146105c757806375236143146105de5780638ba4cc3c1461061b5780638d859f3e1461064457610230565b80633fd17366116101bc5780635c37809d116101805780635c37809d146104a757806362c6f7b9146104d05780636352211e146104fb57806369ba1a75146105385780636a44e1731461056157610230565b80633fd17366146103d657806342842e0e146103ff5780634e69d5601461042857806351d7ff931461045357806355f804b31461047e57610230565b806317e04a711161020357806317e04a711461030357806318160ddd1461032e578063200d2ed21461035957806323b872dd14610384578063288bd8fd146103ad57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906132f6565b61090f565b60405161026991906137c8565b60405180910390f35b34801561027e57600080fd5b506102876109f1565b60405161029491906137e3565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613399565b610a83565b6040516102d19190613761565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906132b6565b610aff565b005b34801561030f57600080fd5b50610318610c0a565b60405161032591906139a0565b60405180910390f35b34801561033a57600080fd5b50610343610c10565b60405161035091906139a0565b60405180910390f35b34801561036557600080fd5b5061036e610c27565b60405161037b91906139a0565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a691906131a0565b610c2d565b005b3480156103b957600080fd5b506103d460048036038101906103cf9190613399565b610c3d565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190613399565b610d24565b005b34801561040b57600080fd5b50610426600480360381019061042191906131a0565b610daa565b005b34801561043457600080fd5b5061043d610dca565b60405161044a91906139a0565b60405180910390f35b34801561045f57600080fd5b50610468610dd4565b60405161047591906139a0565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190613350565b610dda565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613350565b610e70565b005b3480156104dc57600080fd5b506104e5610f06565b6040516104f291906137c8565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d9190613399565b610f19565b60405161052f9190613761565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190613399565b610f2f565b005b34801561056d57600080fd5b5061058860048036038101906105839190613399565b610fb5565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613133565b61103b565b6040516105be91906139a0565b60405180910390f35b3480156105d357600080fd5b506105dc61110b565b005b3480156105ea57600080fd5b5061060560048036038101906106009190613133565b611193565b60405161061291906139a0565b60405180910390f35b34801561062757600080fd5b50610642600480360381019061063d91906132b6565b6111ab565b005b34801561065057600080fd5b5061065961128c565b60405161066691906139a0565b60405180910390f35b34801561067b57600080fd5b50610684611292565b6040516106919190613761565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613399565b6112bb565b6040516106ce9190613985565b60405180910390f35b3480156106e357600080fd5b506106ec6112d3565b6040516106f991906137e3565b60405180910390f35b61071c60048036038101906107179190613399565b611365565b005b34801561072a57600080fd5b5061074560048036038101906107409190613276565b6115f8565b005b34801561075357600080fd5b5061076e60048036038101906107699190613399565b611770565b005b34801561077c57600080fd5b506107856117f6565b005b34801561079357600080fd5b506107ae60048036038101906107a991906131f3565b611977565b005b3480156107bc57600080fd5b506107c56119f3565b005b3480156107d357600080fd5b506107ee60048036038101906107e99190613399565b611a9b565b6040516107fb91906137e3565b60405180910390f35b34801561081057600080fd5b50610819611bea565b60405161082691906139a0565b60405180910390f35b34801561083b57600080fd5b5061085660048036038101906108519190613133565b611bf0565b60405161086391906139a0565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e9190613399565b611c02565b6040516108a091906139a0565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb9190613160565b611c19565b6040516108dd91906137c8565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613133565b611cad565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109ea57506109e982611da5565b5b9050919050565b606060038054610a0090613c6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2c90613c6f565b8015610a795780601f10610a4e57610100808354040283529160200191610a79565b820191906000526020600020905b815481529060010190602001808311610a5c57829003601f168201915b5050505050905090565b6000610a8e82611e0f565b610ac4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0a82610f19565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b72576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b91611e5d565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bc35750610bc181610bbc611e5d565b611c19565b155b15610bfa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c05838383611e65565b505050565b600b5481565b6000610c1a611f17565b6002546001540303905090565b60125481565b610c38838383611f20565b505050565b610c45611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610c63611292565b73ffffffffffffffffffffffffffffffffffffffff1614610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb0906138a5565b60405180910390fd5b601154811115610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590613825565b60405180910390fd5b8060116000828254610d109190613b71565b92505081905550610d2133826123d6565b50565b610d2c611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610d4a611292565b73ffffffffffffffffffffffffffffffffffffffff1614610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d97906138a5565b60405180910390fd5b80600d8190555050565b610dc583838360405180602001604052806000815250611977565b505050565b6000601254905090565b600a5481565b610de2611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610e00611292565b73ffffffffffffffffffffffffffffffffffffffff1614610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d906138a5565b60405180910390fd5b80600f9080519060200190610e6c929190612f04565b5050565b610e78611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610e96611292565b73ffffffffffffffffffffffffffffffffffffffff1614610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906138a5565b60405180910390fd5b8060109080519060200190610f02929190612f04565b5050565b600e60009054906101000a900460ff1681565b6000610f24826123f4565b600001519050919050565b610f37611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610f55611292565b73ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906138a5565b60405180910390fd5b8060128190555050565b610fbd611e5d565b73ffffffffffffffffffffffffffffffffffffffff16610fdb611292565b73ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611028906138a5565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611113611e5d565b73ffffffffffffffffffffffffffffffffffffffff16611131611292565b73ffffffffffffffffffffffffffffffffffffffff1614611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e906138a5565b60405180910390fd5b6111916000612683565b565b600c6020528060005260406000206000915090505481565b6111b3611e5d565b73ffffffffffffffffffffffffffffffffffffffff166111d1611292565b73ffffffffffffffffffffffffffffffffffffffff1614611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e906138a5565b60405180910390fd5b61029a81611233610c10565b61123d9190613a90565b111561127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590613885565b60405180910390fd5b61128882826123d6565b5050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112c3612f8a565b6112cc826123f4565b9050919050565b6060600480546112e290613c6f565b80601f016020809104026020016040519081016040528092919081815260200182805461130e90613c6f565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613865565b60405180910390fd5b600160125414611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90613845565b60405180910390fd5b60115461029a6114289190613b71565b81611431610c10565b61143b9190613a90565b111561147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147390613885565b60405180910390fd5b600a548111156114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613925565b60405180910390fd5b80600d546114cf9190613b17565b341015611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890613905565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115609190613a90565b92505081905550600b54600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156115eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e290613945565b60405180910390fd5b6115f533826123d6565b50565b611600611e5d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611665576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611672611e5d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661171f611e5d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161176491906137c8565b60405180910390a35050565b611778611e5d565b73ffffffffffffffffffffffffffffffffffffffff16611796611292565b73ffffffffffffffffffffffffffffffffffffffff16146117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e3906138a5565b60405180910390fd5b80600a8190555050565b6117fe611e5d565b73ffffffffffffffffffffffffffffffffffffffff1661181c611292565b73ffffffffffffffffffffffffffffffffffffffff1614611872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611869906138a5565b60405180910390fd5b600260095414156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af90613965565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516118e69061374c565b60006040518083038185875af1925050503d8060008114611923576040519150601f19603f3d011682016040523d82523d6000602084013e611928565b606091505b505090508061196c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611963906138e5565b60405180910390fd5b506001600981905550565b611982848484611f20565b6119a18373ffffffffffffffffffffffffffffffffffffffff16612747565b80156119b657506119b48484848461275a565b155b156119ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6119fb611e5d565b73ffffffffffffffffffffffffffffffffffffffff16611a19611292565b73ffffffffffffffffffffffffffffffffffffffff1614611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a66906138a5565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6060611aa682611e0f565b611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc906138c5565b60405180910390fd5b600e60009054906101000a900460ff1615611b57576000611b046128ba565b90506000815111611b245760405180602001604052806000815250611b4f565b80611b2e8461294c565b604051602001611b3f929190613712565b6040516020818303038152906040525b915050611be5565b60108054611b6490613c6f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9090613c6f565b8015611bdd5780601f10611bb257610100808354040283529160200191611bdd565b820191906000526020600020905b815481529060010190602001808311611bc057829003601f168201915b505050505090505b919050565b60115481565b6000611bfb82612aad565b9050919050565b6000600d5482611c129190613b17565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cb5611e5d565b73ffffffffffffffffffffffffffffffffffffffff16611cd3611292565b73ffffffffffffffffffffffffffffffffffffffff1614611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d20906138a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9090613805565b60405180910390fd5b611da281612683565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611e1a611f17565b11158015611e29575060015482105b8015611e56575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611f2b826123f4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f96576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611fb7611e5d565b73ffffffffffffffffffffffffffffffffffffffff161480611fe65750611fe585611fe0611e5d565b611c19565b5b8061202b5750611ff4611e5d565b73ffffffffffffffffffffffffffffffffffffffff1661201384610a83565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612064576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120cb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d88585856001612b17565b6120e460008487611e65565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561236457600154821461236357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123cf8585856001612b1d565b5050505050565b6123f0828260405180602001604052806000815250612b23565b5050565b6123fc612f8a565b60008290508061240a611f17565b11158015612419575060015481105b1561264c576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161264a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461252e57809250505061267e565b5b60011561264957818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461264457809250505061267e565b61252f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612780611e5d565b8786866040518563ffffffff1660e01b81526004016127a2949392919061377c565b602060405180830381600087803b1580156127bc57600080fd5b505af19250505080156127ed57506040513d601f19601f820116820180604052508101906127ea9190613323565b60015b612867573d806000811461281d576040519150601f19603f3d011682016040523d82523d6000602084013e612822565b606091505b5060008151141561285f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546128c990613c6f565b80601f01602080910402602001604051908101604052809291908181526020018280546128f590613c6f565b80156129425780601f1061291757610100808354040283529160200191612942565b820191906000526020600020905b81548152906001019060200180831161292557829003601f168201915b5050505050905090565b60606000821415612994576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612aa8565b600082905060005b600082146129c65780806129af90613cd2565b915050600a826129bf9190613ae6565b915061299c565b60008167ffffffffffffffff8111156129e2576129e1613e08565b5b6040519080825280601f01601f191660200182016040528015612a145781602001600182028036833780820191505090505b5090505b60008514612aa157600182612a2d9190613b71565b9150600a85612a3c9190613d1b565b6030612a489190613a90565b60f81b818381518110612a5e57612a5d613dd9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a9a9190613ae6565b9450612a18565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b612b308383836001612b35565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612ba3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612bde576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612beb6000868387612b17565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612db55750612db48773ffffffffffffffffffffffffffffffffffffffff16612747565b5b15612e7b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e2a600088848060010195508861275a565b612e60576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612dbb578260015414612e7657600080fd5b612ee7565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612e7c575b816001819055505050612efd6000868387612b1d565b5050505050565b828054612f1090613c6f565b90600052602060002090601f016020900481019282612f325760008555612f79565b82601f10612f4b57805160ff1916838001178555612f79565b82800160010185558215612f79579182015b82811115612f78578251825591602001919060010190612f5d565b5b509050612f869190612fcd565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612fe6576000816000905550600101612fce565b5090565b6000612ffd612ff8846139e0565b6139bb565b90508281526020810184848401111561301957613018613e3c565b5b613024848285613c2d565b509392505050565b600061303f61303a84613a11565b6139bb565b90508281526020810184848401111561305b5761305a613e3c565b5b613066848285613c2d565b509392505050565b60008135905061307d8161410f565b92915050565b60008135905061309281614126565b92915050565b6000813590506130a78161413d565b92915050565b6000815190506130bc8161413d565b92915050565b600082601f8301126130d7576130d6613e37565b5b81356130e7848260208601612fea565b91505092915050565b600082601f83011261310557613104613e37565b5b813561311584826020860161302c565b91505092915050565b60008135905061312d81614154565b92915050565b60006020828403121561314957613148613e46565b5b60006131578482850161306e565b91505092915050565b6000806040838503121561317757613176613e46565b5b60006131858582860161306e565b92505060206131968582860161306e565b9150509250929050565b6000806000606084860312156131b9576131b8613e46565b5b60006131c78682870161306e565b93505060206131d88682870161306e565b92505060406131e98682870161311e565b9150509250925092565b6000806000806080858703121561320d5761320c613e46565b5b600061321b8782880161306e565b945050602061322c8782880161306e565b935050604061323d8782880161311e565b925050606085013567ffffffffffffffff81111561325e5761325d613e41565b5b61326a878288016130c2565b91505092959194509250565b6000806040838503121561328d5761328c613e46565b5b600061329b8582860161306e565b92505060206132ac85828601613083565b9150509250929050565b600080604083850312156132cd576132cc613e46565b5b60006132db8582860161306e565b92505060206132ec8582860161311e565b9150509250929050565b60006020828403121561330c5761330b613e46565b5b600061331a84828501613098565b91505092915050565b60006020828403121561333957613338613e46565b5b6000613347848285016130ad565b91505092915050565b60006020828403121561336657613365613e46565b5b600082013567ffffffffffffffff81111561338457613383613e41565b5b613390848285016130f0565b91505092915050565b6000602082840312156133af576133ae613e46565b5b60006133bd8482850161311e565b91505092915050565b6133cf81613ba5565b82525050565b6133de81613ba5565b82525050565b6133ed81613bb7565b82525050565b6133fc81613bb7565b82525050565b600061340d82613a42565b6134178185613a58565b9350613427818560208601613c3c565b61343081613e4b565b840191505092915050565b600061344682613a4d565b6134508185613a74565b9350613460818560208601613c3c565b61346981613e4b565b840191505092915050565b600061347f82613a4d565b6134898185613a85565b9350613499818560208601613c3c565b80840191505092915050565b60006134b2602683613a74565b91506134bd82613e5c565b604082019050919050565b60006134d5602183613a74565b91506134e082613eab565b604082019050919050565b60006134f8601283613a74565b915061350382613efa565b602082019050919050565b600061351b601e83613a74565b915061352682613f23565b602082019050919050565b600061353e601283613a74565b915061354982613f4c565b602082019050919050565b6000613561600583613a85565b915061356c82613f75565b600582019050919050565b6000613584602083613a74565b915061358f82613f9e565b602082019050919050565b60006135a7602f83613a74565b91506135b282613fc7565b604082019050919050565b60006135ca600083613a69565b91506135d582614016565b600082019050919050565b60006135ed601083613a74565b91506135f882614019565b602082019050919050565b6000613610601683613a74565b915061361b82614042565b602082019050919050565b6000613633601683613a74565b915061363e8261406b565b602082019050919050565b6000613656601c83613a74565b915061366182614094565b602082019050919050565b6000613679601f83613a74565b9150613684826140bd565b602082019050919050565b600061369c600183613a85565b91506136a7826140e6565b600182019050919050565b6060820160008201516136c860008501826133c6565b5060208201516136db6020850182613703565b5060408201516136ee60408501826133e4565b50505050565b6136fd81613c0f565b82525050565b61370c81613c19565b82525050565b600061371e8285613474565b91506137298261368f565b91506137358284613474565b915061374082613554565b91508190509392505050565b6000613757826135bd565b9150819050919050565b600060208201905061377660008301846133d5565b92915050565b600060808201905061379160008301876133d5565b61379e60208301866133d5565b6137ab60408301856136f4565b81810360608301526137bd8184613402565b905095945050505050565b60006020820190506137dd60008301846133f3565b92915050565b600060208201905081810360008301526137fd818461343b565b905092915050565b6000602082019050818103600083015261381e816134a5565b9050919050565b6000602082019050818103600083015261383e816134c8565b9050919050565b6000602082019050818103600083015261385e816134eb565b9050919050565b6000602082019050818103600083015261387e8161350e565b9050919050565b6000602082019050818103600083015261389e81613531565b9050919050565b600060208201905081810360008301526138be81613577565b9050919050565b600060208201905081810360008301526138de8161359a565b9050919050565b600060208201905081810360008301526138fe816135e0565b9050919050565b6000602082019050818103600083015261391e81613603565b9050919050565b6000602082019050818103600083015261393e81613626565b9050919050565b6000602082019050818103600083015261395e81613649565b9050919050565b6000602082019050818103600083015261397e8161366c565b9050919050565b600060608201905061399a60008301846136b2565b92915050565b60006020820190506139b560008301846136f4565b92915050565b60006139c56139d6565b90506139d18282613ca1565b919050565b6000604051905090565b600067ffffffffffffffff8211156139fb576139fa613e08565b5b613a0482613e4b565b9050602081019050919050565b600067ffffffffffffffff821115613a2c57613a2b613e08565b5b613a3582613e4b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9b82613c0f565b9150613aa683613c0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613adb57613ada613d4c565b5b828201905092915050565b6000613af182613c0f565b9150613afc83613c0f565b925082613b0c57613b0b613d7b565b5b828204905092915050565b6000613b2282613c0f565b9150613b2d83613c0f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b6657613b65613d4c565b5b828202905092915050565b6000613b7c82613c0f565b9150613b8783613c0f565b925082821015613b9a57613b99613d4c565b5b828203905092915050565b6000613bb082613bef565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613c5a578082015181840152602081019050613c3f565b83811115613c69576000848401525b50505050565b60006002820490506001821680613c8757607f821691505b60208210811415613c9b57613c9a613daa565b5b50919050565b613caa82613e4b565b810181811067ffffffffffffffff82111715613cc957613cc8613e08565b5b80604052505050565b6000613cdd82613c0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d1057613d0f613d4c565b5b600182019050919050565b6000613d2682613c0f565b9150613d3183613c0f565b925082613d4157613d40613d7b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61411881613ba5565b811461412357600080fd5b50565b61412f81613bb7565b811461413a57600080fd5b50565b61414681613bc3565b811461415157600080fd5b50565b61415d81613c0f565b811461416857600080fd5b5056fea2646970667358221220da60fd74ec081177777598b90c1af6246bc2a3cc741a214d782ace8f8103633964736f6c63430008070033

Deployed Bytecode Sourcemap

30415:3919:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12670:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15783:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17286:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16849:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30594:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11919:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31060:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18151:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33950:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33349:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18392:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33642:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30514:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32594:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32489:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30926:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15591:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33563:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33720:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13039:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2701:103;;;;;;;;;;;;;:::i;:::-;;30671:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34173:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30728:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2478:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32919:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15952:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31505:536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17562:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33451:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33073:181;;;;;;;;;;;;;:::i;:::-;;18648:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33260:83;;;;;;;;;;;;;:::i;:::-;;32050:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31028:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32808:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33828:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17920:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2813:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12670:305;12772:4;12824:25;12809:40;;;:11;:40;;;;:105;;;;12881:33;12866:48;;;:11;:48;;;;12809:105;:158;;;;12931:36;12955:11;12931:23;:36::i;:::-;12809:158;12789:178;;12670:305;;;:::o;15783:100::-;15837:13;15870:5;15863:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15783:100;:::o;17286:204::-;17354:7;17379:16;17387:7;17379;:16::i;:::-;17374:64;;17404:34;;;;;;;;;;;;;;17374:64;17458:15;:24;17474:7;17458:24;;;;;;;;;;;;;;;;;;;;;17451:31;;17286:204;;;:::o;16849:371::-;16922:13;16938:24;16954:7;16938:15;:24::i;:::-;16922:40;;16983:5;16977:11;;:2;:11;;;16973:48;;;16997:24;;;;;;;;;;;;;;16973:48;17054:5;17038:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;17064:37;17081:5;17088:12;:10;:12::i;:::-;17064:16;:37::i;:::-;17063:38;17038:63;17034:138;;;17125:35;;;;;;;;;;;;;;17034:138;17184:28;17193:2;17197:7;17206:5;17184:8;:28::i;:::-;16911:309;16849:371;;:::o;30594:33::-;;;;:::o;11919:303::-;11963:7;12188:15;:13;:15::i;:::-;12173:12;;12157:13;;:28;:46;12150:53;;11919:303;:::o;31060:22::-;;;;:::o;18151:170::-;18285:28;18295:4;18301:2;18305:7;18285:9;:28::i;:::-;18151:170;;;:::o;33950:217::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34040:7:::1;;34028:8;:19;;34020:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34107:8;34096:7;;:19;;;;;;;:::i;:::-;;;;;;;;34126:31;34136:10;34148:8;34126:9;:31::i;:::-;33950:217:::0;:::o;33349:98::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33432:9:::1;33424:5;:17;;;;33349:98:::0;:::o;18392:185::-;18530:39;18547:4;18553:2;18557:7;18530:39;;;;;;;;;;;;:16;:39::i;:::-;18392:185;;;:::o;33642:73::-;33682:4;33703:6;;33696:13;;33642:73;:::o;30514:38::-;;;;:::o;32594:98::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32679:7:::1;32663:13;:23;;;;;;;;;;;;:::i;:::-;;32594:98:::0;:::o;32489:99::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32579:3:::1;32561:15;:21;;;;;;;;;;;;:::i;:::-;;32489:99:::0;:::o;30926:29::-;;;;;;;;;;;;;:::o;15591:125::-;15655:7;15682:21;15695:7;15682:12;:21::i;:::-;:26;;;15675:33;;15591:125;;;:::o;33563:72::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33628:1:::1;33619:6;:10;;;;33563:72:::0;:::o;33720:98::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33801:9:::1;33793:7;:17;;;;33720:98:::0;:::o;13039:206::-;13103:7;13144:1;13127:19;;:5;:19;;;13123:60;;;13155:28;;;;;;;;;;;;;;13123:60;13209:12;:19;13222:5;13209:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;13201:36;;13194:43;;13039:206;;;:::o;2701:103::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2766:30:::1;2793:1;2766:18;:30::i;:::-;2701:103::o:0;30671:50::-;;;;;;;;;;;;;;;;;:::o;34173:158::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30815:3:::1;34255:1;34239:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:41;;34231:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;34310:15;34320:1;34323;34310:9;:15::i;:::-;34173:158:::0;;:::o;30728:31::-;;;;:::o;2478:87::-;2524:7;2551:6;;;;;;;;;;;2544:13;;2478:87;:::o;32919:148::-;33000:21;;:::i;:::-;33040;33053:7;33040:12;:21::i;:::-;33033:28;;32919:148;;;:::o;15952:104::-;16008:13;16041:7;16034:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15952:104;:::o;31505:536::-;31439:10;31426:23;;:9;:23;;;31418:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31592:1:::1;31582:6;;:11;31574:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;31681:7;;30815:3;31660:28;;;;:::i;:::-;31648:8;31632:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:56;;31624:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;31738:19;;31726:8;:31;;31718:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31819:8;31811:5;;:16;;;;:::i;:::-;31798:9;:29;;31790:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31896:8;31865:15;:27;31881:10;31865:27;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;31950:14;;31919:15;:27;31935:10;31919:27;;;;;;;;;;;;;;;;:45;;31911:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;32004:31;32014:10;32026:8;32004:9;:31::i;:::-;31505:536:::0;:::o;17562:287::-;17673:12;:10;:12::i;:::-;17661:24;;:8;:24;;;17657:54;;;17694:17;;;;;;;;;;;;;;17657:54;17769:8;17724:18;:32;17743:12;:10;:12::i;:::-;17724:32;;;;;;;;;;;;;;;:42;17757:8;17724:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;17822:8;17793:48;;17808:12;:10;:12::i;:::-;17793:48;;;17832:8;17793:48;;;;;;:::i;:::-;;;;;;;;17562:287;;:::o;33451:106::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33550:1:::1;33528:19;:23;;;;33451:106:::0;:::o;33073:181::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;260:1:::1;406:7;;:19;;398:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;260:1;467:7;:18;;;;33138:12:::2;33156:10;:15;;33179:21;33156:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33137:68;;;33220:7;33212:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;33130:124;216:1:::1;510:7;:22;;;;33073:181::o:0;18648:369::-;18815:28;18825:4;18831:2;18835:7;18815:9;:28::i;:::-;18858:15;:2;:13;;;:15::i;:::-;:76;;;;;18878:56;18909:4;18915:2;18919:7;18928:5;18878:30;:56::i;:::-;18877:57;18858:76;18854:156;;;18958:40;;;;;;;;;;;;;;18854:156;18648:369;;;;:::o;33260:83::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33328:9:::1;;;;;;;;;;;33327:10;33315:9;;:22;;;;;;;;;;;;;;;;;;33260:83::o:0;32050:433::-;32123:13;32153:16;32161:7;32153;:16::i;:::-;32145:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;32230:9;;;;;;;;;;;32227:251;;;32247:21;32271:10;:8;:10::i;:::-;32247:34;;32326:1;32308:7;32302:21;:25;:109;;;;;;;;;;;;;;;;;32363:7;32377:18;:7;:16;:18::i;:::-;32346:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32302:109;32288:123;;;;;32227:251;32451:15;32444:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32050:433;;;;:::o;31028:23::-;;;;:::o;32808:107::-;32866:7;32889:20;32903:5;32889:13;:20::i;:::-;32882:27;;32808:107;;;:::o;33828:117::-;33886:7;33932:5;;33922:9;:15;;;;:::i;:::-;33915:22;;33828:117;;;:::o;17920:164::-;18017:4;18041:18;:25;18060:5;18041:25;;;;;;;;;;;;;;;:35;18067:8;18041:35;;;;;;;;;;;;;;;;;;;;;;;;;18034:42;;17920:164;;;;:::o;2813:201::-;2623:12;:10;:12::i;:::-;2612:23;;:7;:5;:7::i;:::-;:23;;;2604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2922:1:::1;2902:22;;:8;:22;;;;2894:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2978:28;2997:8;2978:18;:28::i;:::-;2813:201:::0;:::o;7131:157::-;7216:4;7255:25;7240:40;;;:11;:40;;;;7233:47;;7131:157;;;:::o;19272:174::-;19329:4;19372:7;19353:15;:13;:15::i;:::-;:26;;:53;;;;;19393:13;;19383:7;:23;19353:53;:85;;;;;19411:11;:20;19423:7;19411:20;;;;;;;;;;;:27;;;;;;;;;;;;19410:28;19353:85;19346:92;;19272:174;;;:::o;2021:98::-;2074:7;2101:10;2094:17;;2021:98;:::o;27429:196::-;27571:2;27544:15;:24;27560:7;27544:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27609:7;27605:2;27589:28;;27598:5;27589:28;;;;;;;;;;;;27429:196;;;:::o;11693:92::-;11749:7;11776:1;11769:8;;11693:92;:::o;22372:2130::-;22487:35;22525:21;22538:7;22525:12;:21::i;:::-;22487:59;;22585:4;22563:26;;:13;:18;;;:26;;;22559:67;;22598:28;;;;;;;;;;;;;;22559:67;22639:22;22681:4;22665:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;22702:36;22719:4;22725:12;:10;:12::i;:::-;22702:16;:36::i;:::-;22665:73;:126;;;;22779:12;:10;:12::i;:::-;22755:36;;:20;22767:7;22755:11;:20::i;:::-;:36;;;22665:126;22639:153;;22810:17;22805:66;;22836:35;;;;;;;;;;;;;;22805:66;22900:1;22886:16;;:2;:16;;;22882:52;;;22911:23;;;;;;;;;;;;;;22882:52;22947:43;22969:4;22975:2;22979:7;22988:1;22947:21;:43::i;:::-;23055:35;23072:1;23076:7;23085:4;23055:8;:35::i;:::-;23416:1;23386:12;:18;23399:4;23386:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23460:1;23432:12;:16;23445:2;23432:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23478:31;23512:11;:20;23524:7;23512:20;;;;;;;;;;;23478:54;;23563:2;23547:8;:13;;;:18;;;;;;;;;;;;;;;;;;23613:15;23580:8;:23;;;:49;;;;;;;;;;;;;;;;;;23881:19;23913:1;23903:7;:11;23881:33;;23929:31;23963:11;:24;23975:11;23963:24;;;;;;;;;;;23929:58;;24031:1;24006:27;;:8;:13;;;;;;;;;;;;:27;;;24002:384;;;24216:13;;24201:11;:28;24197:174;;24270:4;24254:8;:13;;;:20;;;;;;;;;;;;;;;;;;24323:13;:28;;;24297:8;:23;;;:54;;;;;;;;;;;;;;;;;;24197:174;24002:384;23361:1036;;;24433:7;24429:2;24414:27;;24423:4;24414:27;;;;;;;;;;;;24452:42;24473:4;24479:2;24483:7;24492:1;24452:20;:42::i;:::-;22476:2026;;22372:2130;;;:::o;19454:104::-;19523:27;19533:2;19537:8;19523:27;;;;;;;;;;;;:9;:27::i;:::-;19454:104;;:::o;14420:1109::-;14482:21;;:::i;:::-;14516:12;14531:7;14516:22;;14599:4;14580:15;:13;:15::i;:::-;:23;;:47;;;;;14614:13;;14607:4;:20;14580:47;14576:886;;;14648:31;14682:11;:17;14694:4;14682:17;;;;;;;;;;;14648:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14723:9;:16;;;14718:729;;14794:1;14768:28;;:9;:14;;;:28;;;14764:101;;14832:9;14825:16;;;;;;14764:101;15167:261;15174:4;15167:261;;;15207:6;;;;;;;;15252:11;:17;15264:4;15252:17;;;;;;;;;;;15240:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15326:1;15300:28;;:9;:14;;;:28;;;15296:109;;15368:9;15361:16;;;;;;15296:109;15167:261;;;14718:729;14629:833;14576:886;15490:31;;;;;;;;;;;;;;14420:1109;;;;:::o;3023:191::-;3097:16;3116:6;;;;;;;;;;;3097:25;;3142:8;3133:6;;:17;;;;;;;;;;;;;;;;;;3197:8;3166:40;;3187:8;3166:40;;;;;;;;;;;;3086:128;3023:191;:::o;3246:197::-;3306:4;3324:12;3391:7;3379:20;3371:28;;3434:1;3427:4;:8;3420:15;;;3246:197;;;:::o;28117:667::-;28280:4;28317:2;28301:36;;;28338:12;:10;:12::i;:::-;28352:4;28358:7;28367:5;28301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28297:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28552:1;28535:6;:13;:18;28531:235;;;28581:40;;;;;;;;;;;;;;28531:235;28724:6;28718:13;28709:6;28705:2;28701:15;28694:38;28297:480;28430:45;;;28420:55;;;:6;:55;;;;28413:62;;;28117:667;;;;;;:::o;32696:108::-;32756:13;32785;32778:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32696:108;:::o;638:533::-;694:13;734:1;725:5;:10;721:53;;;752:10;;;;;;;;;;;;;;;;;;;;;721:53;784:12;799:5;784:20;;815:14;840:78;855:1;847:4;:9;840:78;;873:8;;;;;:::i;:::-;;;;904:2;896:10;;;;;:::i;:::-;;;840:78;;;928:19;960:6;950:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;928:39;;978:154;994:1;985:5;:10;978:154;;1022:1;1012:11;;;;;:::i;:::-;;;1089:2;1081:5;:10;;;;:::i;:::-;1068:2;:24;;;;:::i;:::-;1055:39;;1038:6;1045;1038:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1118:2;1109:11;;;;;:::i;:::-;;;978:154;;;1156:6;1142:21;;;;;638:533;;;;:::o;13327:137::-;13388:7;13423:12;:19;13436:5;13423:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;13415:41;;13408:48;;13327:137;;;:::o;29432:159::-;;;;;:::o;30250:158::-;;;;;:::o;19921:163::-;20044:32;20050:2;20054:8;20064:5;20071:4;20044:5;:32::i;:::-;19921:163;;;:::o;20343:1775::-;20482:20;20505:13;;20482:36;;20547:1;20533:16;;:2;:16;;;20529:48;;;20558:19;;;;;;;;;;;;;;20529:48;20604:1;20592:8;:13;20588:44;;;20614:18;;;;;;;;;;;;;;20588:44;20645:61;20675:1;20679:2;20683:12;20697:8;20645:21;:61::i;:::-;21018:8;20983:12;:16;20996:2;20983:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21082:8;21042:12;:16;21055:2;21042:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21141:2;21108:11;:25;21120:12;21108:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;21208:15;21158:11;:25;21170:12;21158:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;21241:20;21264:12;21241:35;;21291:11;21320:8;21305:12;:23;21291:37;;21349:4;:23;;;;;21357:15;:2;:13;;;:15::i;:::-;21349:23;21345:641;;;21393:314;21449:12;21445:2;21424:38;;21441:1;21424:38;;;;;;;;;;;;21490:69;21529:1;21533:2;21537:14;;;;;;21553:5;21490:30;:69::i;:::-;21485:174;;21595:40;;;;;;;;;;;;;;21485:174;21702:3;21686:12;:19;;21393:314;;21788:12;21771:13;;:29;21767:43;;21802:8;;;21767:43;21345:641;;;21851:120;21907:14;;;;;;21903:2;21882:40;;21899:1;21882:40;;;;;;;;;;;;21966:3;21950:12;:19;;21851:120;;21345:641;22016:12;22000:13;:28;;;;20958:1082;;22050:60;22079:1;22083:2;22087:12;22101:8;22050:20;:60::i;:::-;20471:1647;20343:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:108::-;7235:24;7253:5;7235:24;:::i;:::-;7230:3;7223:37;7158:108;;:::o;7272:118::-;7359:24;7377:5;7359:24;:::i;:::-;7354:3;7347:37;7272:118;;:::o;7396:99::-;7467:21;7482:5;7467:21;:::i;:::-;7462:3;7455:34;7396:99;;:::o;7501:109::-;7582:21;7597:5;7582:21;:::i;:::-;7577:3;7570:34;7501:109;;:::o;7616:360::-;7702:3;7730:38;7762:5;7730:38;:::i;:::-;7784:70;7847:6;7842:3;7784:70;:::i;:::-;7777:77;;7863:52;7908:6;7903:3;7896:4;7889:5;7885:16;7863:52;:::i;:::-;7940:29;7962:6;7940:29;:::i;:::-;7935:3;7931:39;7924:46;;7706:270;7616:360;;;;:::o;7982:364::-;8070:3;8098:39;8131:5;8098:39;:::i;:::-;8153:71;8217:6;8212:3;8153:71;:::i;:::-;8146:78;;8233:52;8278:6;8273:3;8266:4;8259:5;8255:16;8233:52;:::i;:::-;8310:29;8332:6;8310:29;:::i;:::-;8305:3;8301:39;8294:46;;8074:272;7982:364;;;;:::o;8352:377::-;8458:3;8486:39;8519:5;8486:39;:::i;:::-;8541:89;8623:6;8618:3;8541:89;:::i;:::-;8534:96;;8639:52;8684:6;8679:3;8672:4;8665:5;8661:16;8639:52;:::i;:::-;8716:6;8711:3;8707:16;8700:23;;8462:267;8352:377;;;;:::o;8735:366::-;8877:3;8898:67;8962:2;8957:3;8898:67;:::i;:::-;8891:74;;8974:93;9063:3;8974:93;:::i;:::-;9092:2;9087:3;9083:12;9076:19;;8735:366;;;:::o;9107:::-;9249:3;9270:67;9334:2;9329:3;9270:67;:::i;:::-;9263:74;;9346:93;9435:3;9346:93;:::i;:::-;9464:2;9459:3;9455:12;9448:19;;9107:366;;;:::o;9479:::-;9621:3;9642:67;9706:2;9701:3;9642:67;:::i;:::-;9635:74;;9718:93;9807:3;9718:93;:::i;:::-;9836:2;9831:3;9827:12;9820:19;;9479:366;;;:::o;9851:::-;9993:3;10014:67;10078:2;10073:3;10014:67;:::i;:::-;10007:74;;10090:93;10179:3;10090:93;:::i;:::-;10208:2;10203:3;10199:12;10192:19;;9851:366;;;:::o;10223:::-;10365:3;10386:67;10450:2;10445:3;10386:67;:::i;:::-;10379:74;;10462:93;10551:3;10462:93;:::i;:::-;10580:2;10575:3;10571:12;10564:19;;10223:366;;;:::o;10595:400::-;10755:3;10776:84;10858:1;10853:3;10776:84;:::i;:::-;10769:91;;10869:93;10958:3;10869:93;:::i;:::-;10987:1;10982:3;10978:11;10971:18;;10595:400;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11001:366;;;:::o;11373:::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11373:366;;;:::o;11745:398::-;11904:3;11925:83;12006:1;12001:3;11925:83;:::i;:::-;11918:90;;12017:93;12106:3;12017:93;:::i;:::-;12135:1;12130:3;12126:11;12119:18;;11745:398;;;:::o;12149:366::-;12291:3;12312:67;12376:2;12371:3;12312:67;:::i;:::-;12305:74;;12388:93;12477:3;12388:93;:::i;:::-;12506:2;12501:3;12497:12;12490:19;;12149:366;;;:::o;12521:::-;12663:3;12684:67;12748:2;12743:3;12684:67;:::i;:::-;12677:74;;12760:93;12849:3;12760:93;:::i;:::-;12878:2;12873:3;12869:12;12862:19;;12521:366;;;:::o;12893:::-;13035:3;13056:67;13120:2;13115:3;13056:67;:::i;:::-;13049:74;;13132:93;13221:3;13132:93;:::i;:::-;13250:2;13245:3;13241:12;13234:19;;12893:366;;;:::o;13265:::-;13407:3;13428:67;13492:2;13487:3;13428:67;:::i;:::-;13421:74;;13504:93;13593:3;13504:93;:::i;:::-;13622:2;13617:3;13613:12;13606:19;;13265:366;;;:::o;13637:::-;13779:3;13800:67;13864:2;13859:3;13800:67;:::i;:::-;13793:74;;13876:93;13965:3;13876:93;:::i;:::-;13994:2;13989:3;13985:12;13978:19;;13637:366;;;:::o;14009:400::-;14169:3;14190:84;14272:1;14267:3;14190:84;:::i;:::-;14183:91;;14283:93;14372:3;14283:93;:::i;:::-;14401:1;14396:3;14392:11;14385:18;;14009:400;;;:::o;14485:697::-;14644:4;14639:3;14635:14;14731:4;14724:5;14720:16;14714:23;14750:63;14807:4;14802:3;14798:14;14784:12;14750:63;:::i;:::-;14659:164;14915:4;14908:5;14904:16;14898:23;14934:61;14989:4;14984:3;14980:14;14966:12;14934:61;:::i;:::-;14833:172;15089:4;15082:5;15078:16;15072:23;15108:57;15159:4;15154:3;15150:14;15136:12;15108:57;:::i;:::-;15015:160;14613:569;14485:697;;:::o;15188:118::-;15275:24;15293:5;15275:24;:::i;:::-;15270:3;15263:37;15188:118;;:::o;15312:105::-;15387:23;15404:5;15387:23;:::i;:::-;15382:3;15375:36;15312:105;;:::o;15423:967::-;15805:3;15827:95;15918:3;15909:6;15827:95;:::i;:::-;15820:102;;15939:148;16083:3;15939:148;:::i;:::-;15932:155;;16104:95;16195:3;16186:6;16104:95;:::i;:::-;16097:102;;16216:148;16360:3;16216:148;:::i;:::-;16209:155;;16381:3;16374:10;;15423:967;;;;;:::o;16396:379::-;16580:3;16602:147;16745:3;16602:147;:::i;:::-;16595:154;;16766:3;16759:10;;16396:379;;;:::o;16781:222::-;16874:4;16912:2;16901:9;16897:18;16889:26;;16925:71;16993:1;16982:9;16978:17;16969:6;16925:71;:::i;:::-;16781:222;;;;:::o;17009:640::-;17204:4;17242:3;17231:9;17227:19;17219:27;;17256:71;17324:1;17313:9;17309:17;17300:6;17256:71;:::i;:::-;17337:72;17405:2;17394:9;17390:18;17381:6;17337:72;:::i;:::-;17419;17487:2;17476:9;17472:18;17463:6;17419:72;:::i;:::-;17538:9;17532:4;17528:20;17523:2;17512:9;17508:18;17501:48;17566:76;17637:4;17628:6;17566:76;:::i;:::-;17558:84;;17009:640;;;;;;;:::o;17655:210::-;17742:4;17780:2;17769:9;17765:18;17757:26;;17793:65;17855:1;17844:9;17840:17;17831:6;17793:65;:::i;:::-;17655:210;;;;:::o;17871:313::-;17984:4;18022:2;18011:9;18007:18;17999:26;;18071:9;18065:4;18061:20;18057:1;18046:9;18042:17;18035:47;18099:78;18172:4;18163:6;18099:78;:::i;:::-;18091:86;;17871:313;;;;:::o;18190:419::-;18356:4;18394:2;18383:9;18379:18;18371:26;;18443:9;18437:4;18433:20;18429:1;18418:9;18414:17;18407:47;18471:131;18597:4;18471:131;:::i;:::-;18463:139;;18190:419;;;:::o;18615:::-;18781:4;18819:2;18808:9;18804:18;18796:26;;18868:9;18862:4;18858:20;18854:1;18843:9;18839:17;18832:47;18896:131;19022:4;18896:131;:::i;:::-;18888:139;;18615:419;;;:::o;19040:::-;19206:4;19244:2;19233:9;19229:18;19221:26;;19293:9;19287:4;19283:20;19279:1;19268:9;19264:17;19257:47;19321:131;19447:4;19321:131;:::i;:::-;19313:139;;19040:419;;;:::o;19465:::-;19631:4;19669:2;19658:9;19654:18;19646:26;;19718:9;19712:4;19708:20;19704:1;19693:9;19689:17;19682:47;19746:131;19872:4;19746:131;:::i;:::-;19738:139;;19465:419;;;:::o;19890:::-;20056:4;20094:2;20083:9;20079:18;20071:26;;20143:9;20137:4;20133:20;20129:1;20118:9;20114:17;20107:47;20171:131;20297:4;20171:131;:::i;:::-;20163:139;;19890:419;;;:::o;20315:::-;20481:4;20519:2;20508:9;20504:18;20496:26;;20568:9;20562:4;20558:20;20554:1;20543:9;20539:17;20532:47;20596:131;20722:4;20596:131;:::i;:::-;20588:139;;20315:419;;;:::o;20740:::-;20906:4;20944:2;20933:9;20929:18;20921:26;;20993:9;20987:4;20983:20;20979:1;20968:9;20964:17;20957:47;21021:131;21147:4;21021:131;:::i;:::-;21013:139;;20740:419;;;:::o;21165:::-;21331:4;21369:2;21358:9;21354:18;21346:26;;21418:9;21412:4;21408:20;21404:1;21393:9;21389:17;21382:47;21446:131;21572:4;21446:131;:::i;:::-;21438:139;;21165:419;;;:::o;21590:::-;21756:4;21794:2;21783:9;21779:18;21771:26;;21843:9;21837:4;21833:20;21829:1;21818:9;21814:17;21807:47;21871:131;21997:4;21871:131;:::i;:::-;21863:139;;21590:419;;;:::o;22015:::-;22181:4;22219:2;22208:9;22204:18;22196:26;;22268:9;22262:4;22258:20;22254:1;22243:9;22239:17;22232:47;22296:131;22422:4;22296:131;:::i;:::-;22288:139;;22015:419;;;:::o;22440:::-;22606:4;22644:2;22633:9;22629:18;22621:26;;22693:9;22687:4;22683:20;22679:1;22668:9;22664:17;22657:47;22721:131;22847:4;22721:131;:::i;:::-;22713:139;;22440:419;;;:::o;22865:::-;23031:4;23069:2;23058:9;23054:18;23046:26;;23118:9;23112:4;23108:20;23104:1;23093:9;23089:17;23082:47;23146:131;23272:4;23146:131;:::i;:::-;23138:139;;22865:419;;;:::o;23290:346::-;23445:4;23483:2;23472:9;23468:18;23460:26;;23496:133;23626:1;23615:9;23611:17;23602:6;23496:133;:::i;:::-;23290:346;;;;:::o;23642:222::-;23735:4;23773:2;23762:9;23758:18;23750:26;;23786:71;23854:1;23843:9;23839:17;23830:6;23786:71;:::i;:::-;23642:222;;;;:::o;23870:129::-;23904:6;23931:20;;:::i;:::-;23921:30;;23960:33;23988:4;23980:6;23960:33;:::i;:::-;23870:129;;;:::o;24005:75::-;24038:6;24071:2;24065:9;24055:19;;24005:75;:::o;24086:307::-;24147:4;24237:18;24229:6;24226:30;24223:56;;;24259:18;;:::i;:::-;24223:56;24297:29;24319:6;24297:29;:::i;:::-;24289:37;;24381:4;24375;24371:15;24363:23;;24086:307;;;:::o;24399:308::-;24461:4;24551:18;24543:6;24540:30;24537:56;;;24573:18;;:::i;:::-;24537:56;24611:29;24633:6;24611:29;:::i;:::-;24603:37;;24695:4;24689;24685:15;24677:23;;24399:308;;;:::o;24713:98::-;24764:6;24798:5;24792:12;24782:22;;24713:98;;;:::o;24817:99::-;24869:6;24903:5;24897:12;24887:22;;24817:99;;;:::o;24922:168::-;25005:11;25039:6;25034:3;25027:19;25079:4;25074:3;25070:14;25055:29;;24922:168;;;;:::o;25096:147::-;25197:11;25234:3;25219:18;;25096:147;;;;:::o;25249:169::-;25333:11;25367:6;25362:3;25355:19;25407:4;25402:3;25398:14;25383:29;;25249:169;;;;:::o;25424:148::-;25526:11;25563:3;25548:18;;25424:148;;;;:::o;25578:305::-;25618:3;25637:20;25655:1;25637:20;:::i;:::-;25632:25;;25671:20;25689:1;25671:20;:::i;:::-;25666:25;;25825:1;25757:66;25753:74;25750:1;25747:81;25744:107;;;25831:18;;:::i;:::-;25744:107;25875:1;25872;25868:9;25861:16;;25578:305;;;;:::o;25889:185::-;25929:1;25946:20;25964:1;25946:20;:::i;:::-;25941:25;;25980:20;25998:1;25980:20;:::i;:::-;25975:25;;26019:1;26009:35;;26024:18;;:::i;:::-;26009:35;26066:1;26063;26059:9;26054:14;;25889:185;;;;:::o;26080:348::-;26120:7;26143:20;26161:1;26143:20;:::i;:::-;26138:25;;26177:20;26195:1;26177:20;:::i;:::-;26172:25;;26365:1;26297:66;26293:74;26290:1;26287:81;26282:1;26275:9;26268:17;26264:105;26261:131;;;26372:18;;:::i;:::-;26261:131;26420:1;26417;26413:9;26402:20;;26080:348;;;;:::o;26434:191::-;26474:4;26494:20;26512:1;26494:20;:::i;:::-;26489:25;;26528:20;26546:1;26528:20;:::i;:::-;26523:25;;26567:1;26564;26561:8;26558:34;;;26572:18;;:::i;:::-;26558:34;26617:1;26614;26610:9;26602:17;;26434:191;;;;:::o;26631:96::-;26668:7;26697:24;26715:5;26697:24;:::i;:::-;26686:35;;26631:96;;;:::o;26733:90::-;26767:7;26810:5;26803:13;26796:21;26785:32;;26733:90;;;:::o;26829:149::-;26865:7;26905:66;26898:5;26894:78;26883:89;;26829:149;;;:::o;26984:126::-;27021:7;27061:42;27054:5;27050:54;27039:65;;26984:126;;;:::o;27116:77::-;27153:7;27182:5;27171:16;;27116:77;;;:::o;27199:101::-;27235:7;27275:18;27268:5;27264:30;27253:41;;27199:101;;;:::o;27306:154::-;27390:6;27385:3;27380;27367:30;27452:1;27443:6;27438:3;27434:16;27427:27;27306:154;;;:::o;27466:307::-;27534:1;27544:113;27558:6;27555:1;27552:13;27544:113;;;27643:1;27638:3;27634:11;27628:18;27624:1;27619:3;27615:11;27608:39;27580:2;27577:1;27573:10;27568:15;;27544:113;;;27675:6;27672:1;27669:13;27666:101;;;27755:1;27746:6;27741:3;27737:16;27730:27;27666:101;27515:258;27466:307;;;:::o;27779:320::-;27823:6;27860:1;27854:4;27850:12;27840:22;;27907:1;27901:4;27897:12;27928:18;27918:81;;27984:4;27976:6;27972:17;27962:27;;27918:81;28046:2;28038:6;28035:14;28015:18;28012:38;28009:84;;;28065:18;;:::i;:::-;28009:84;27830:269;27779:320;;;:::o;28105:281::-;28188:27;28210:4;28188:27;:::i;:::-;28180:6;28176:40;28318:6;28306:10;28303:22;28282:18;28270:10;28267:34;28264:62;28261:88;;;28329:18;;:::i;:::-;28261:88;28369:10;28365:2;28358:22;28148:238;28105:281;;:::o;28392:233::-;28431:3;28454:24;28472:5;28454:24;:::i;:::-;28445:33;;28500:66;28493:5;28490:77;28487:103;;;28570:18;;:::i;:::-;28487:103;28617:1;28610:5;28606:13;28599:20;;28392:233;;;:::o;28631:176::-;28663:1;28680:20;28698:1;28680:20;:::i;:::-;28675:25;;28714:20;28732:1;28714:20;:::i;:::-;28709:25;;28753:1;28743:35;;28758:18;;:::i;:::-;28743:35;28799:1;28796;28792:9;28787:14;;28631:176;;;;:::o;28813:180::-;28861:77;28858:1;28851:88;28958:4;28955:1;28948:15;28982:4;28979:1;28972:15;28999:180;29047:77;29044:1;29037:88;29144:4;29141:1;29134:15;29168:4;29165:1;29158:15;29185:180;29233:77;29230:1;29223:88;29330:4;29327:1;29320:15;29354:4;29351:1;29344:15;29371:180;29419:77;29416:1;29409:88;29516:4;29513:1;29506:15;29540:4;29537:1;29530:15;29557:180;29605:77;29602:1;29595:88;29702:4;29699:1;29692:15;29726:4;29723:1;29716:15;29743:117;29852:1;29849;29842:12;29866:117;29975:1;29972;29965:12;29989:117;30098:1;30095;30088:12;30112:117;30221:1;30218;30211:12;30235:102;30276:6;30327:2;30323:7;30318:2;30311:5;30307:14;30303:28;30293:38;;30235:102;;;:::o;30343:225::-;30483:34;30479:1;30471:6;30467:14;30460:58;30552:8;30547:2;30539:6;30535:15;30528:33;30343:225;:::o;30574:220::-;30714:34;30710:1;30702:6;30698:14;30691:58;30783:3;30778:2;30770:6;30766:15;30759:28;30574:220;:::o;30800:168::-;30940:20;30936:1;30928:6;30924:14;30917:44;30800:168;:::o;30974:180::-;31114:32;31110:1;31102:6;31098:14;31091:56;30974:180;:::o;31160:168::-;31300:20;31296:1;31288:6;31284:14;31277:44;31160:168;:::o;31334:155::-;31474:7;31470:1;31462:6;31458:14;31451:31;31334:155;:::o;31495:182::-;31635:34;31631:1;31623:6;31619:14;31612:58;31495:182;:::o;31683:234::-;31823:34;31819:1;31811:6;31807:14;31800:58;31892:17;31887:2;31879:6;31875:15;31868:42;31683:234;:::o;31923:114::-;;:::o;32043:166::-;32183:18;32179:1;32171:6;32167:14;32160:42;32043:166;:::o;32215:172::-;32355:24;32351:1;32343:6;32339:14;32332:48;32215:172;:::o;32393:::-;32533:24;32529:1;32521:6;32517:14;32510:48;32393:172;:::o;32571:178::-;32711:30;32707:1;32699:6;32695:14;32688:54;32571:178;:::o;32755:181::-;32895:33;32891:1;32883:6;32879:14;32872:57;32755:181;:::o;32942:151::-;33082:3;33078:1;33070:6;33066:14;33059:27;32942:151;:::o;33099:122::-;33172:24;33190:5;33172:24;:::i;:::-;33165:5;33162:35;33152:63;;33211:1;33208;33201:12;33152:63;33099:122;:::o;33227:116::-;33297:21;33312:5;33297:21;:::i;:::-;33290:5;33287:32;33277:60;;33333:1;33330;33323:12;33277:60;33227:116;:::o;33349:120::-;33421:23;33438:5;33421:23;:::i;:::-;33414:5;33411:34;33401:62;;33459:1;33456;33449:12;33401:62;33349:120;:::o;33475:122::-;33548:24;33566:5;33548:24;:::i;:::-;33541:5;33538:35;33528:63;;33587:1;33584;33577:12;33528:63;33475:122;:::o

Swarm Source

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