ETH Price: $3,473.89 (+5.93%)
Gas: 8 Gwei

Token

Villains (Villains)
 

Overview

Max Total Supply

1,666 Villains

Holders

173

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 Villains
0x4cddf18ca5f3315677e8e199bec4124f94ae6788
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:
theVillainsNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-02
*/

pragma solidity ^0.8.0;
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
pragma solidity ^0.8.0;
interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
pragma solidity ^0.8.0;
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;
}
pragma solidity ^0.8.0;
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);
}
pragma solidity ^0.8.0;
interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256);
    function tokenByIndex(uint256 index) external view returns (uint256);
}
pragma solidity ^0.8.1;
library Address {
    function isContract(address account) internal view returns (bool) {

        return account.code.length > 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);
            }
        }
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    constructor() {
        _setOwner(_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 {
        _setOwner(address(0));
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    function toString(uint256 value) internal pure returns (string memory) {
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    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);
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}



pragma solidity ^0.8.0;
contract ERC721A is
    Context,
    ERC165,
    ERC2981,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;
    string private _name;
    string private _symbol;
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;
    mapping(address => AddressData) private _addressData;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC2981, ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }




    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721A: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);
        _approve(address(0), tokenId, prevOwnership.addr);

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    uint256 public nextOwnerToExplicitlySet = 0;
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


interface IERC20 {
    function transfer(address,uint) external;
    function balanceOf(address) external returns(uint);
}


contract theVillainsNFT is Ownable, ERC721A {

    bool public publicSale;
    bool public whitelistSale;

    mapping(address => uint) public freemints;
    mapping(address => uint) public whitelistmints;


    using Strings for uint256;

    uint256 public maxToken = 1668;
    uint256 public whitelist_price = 0.033333 ether;
    uint256 public public_price =    0.044444 ether;

    string private _baseTokenURI;
    
    bytes32 public root;


    constructor(string memory name, string memory uri, bytes32 _root)
        ERC721A(name, name, 50, maxToken)
    {
        _setDefaultRoyalty(msg.sender,1000);
        _baseTokenURI = uri;
        root = _root;

    }

    modifier callerIsEOA() {
        require(tx.origin == msg.sender, "???");
        _;
    }

    function numberMinted(address owner) internal view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );


        string memory _tokenURI = super.tokenURI(tokenId);
        return
            bytes(_tokenURI).length > 0
                ? string(abi.encodePacked(_tokenURI, ".json"))
                : "";
    }



    function verifyFreeMint(bytes32[] memory proof, uint256 permited) internal view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender,":freemint:",permited.toString()));
        return  MerkleProof.verify(proof, root, leaf) ;
    }

    function verifyWhitelistMint(bytes32[] memory proof, uint256 permited) internal view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender,":whitelist:",permited.toString()));
        return  MerkleProof.verify(proof, root, leaf) ;
    }



    function freeMint(uint256 quantity, uint256 permited, bytes32[] memory proof) external callerIsEOA {
        require(!whitelistSale && !publicSale, "FreeMint_OVER");
        require(quantity > 0, "INVALID_QUANTITY");
        freemints[msg.sender]+=quantity;
        require(verifyFreeMint(proof, permited ),"INVALID PROOF");
        require( freemints[msg.sender] <= permited, "CANNOT_MINT_THAT_MANY");
        require(totalSupply() + quantity < 368, "NOT_ENOUGH_FOR_FREE_MINT");

        _safeMint(msg.sender,quantity);

    }

    function whitelistMint(uint256 quantity, uint256 permited, bytes32[] memory proof) external payable callerIsEOA {
        require(whitelistSale, "SALE_HAS_NOT_STARTED_YET");
        require(!publicSale, "WHITELIST_OVER");
        require(quantity > 0, "INVALID_QUANTITY");

        whitelistmints[msg.sender]+=quantity;
        
            require( whitelist_price*quantity <= msg.value, "ETH" );
            require(verifyWhitelistMint(proof, permited ),"INVALID PROOF");
            require( whitelistmints[msg.sender] <= permited, "CANNOT_MINT_THAT_MANY");   

        require(totalSupply() + quantity < maxToken, "NOT_ENOUGH_SUPPLY");
        _safeMint(msg.sender, quantity);
    }


    function publicMint() external payable callerIsEOA {
        require( publicSale , "SALE_HAS_NOT_STARTED_YET");
        require( public_price <= msg.value, "ETH" );
        require(totalSupply() + 1 < maxToken, "NOT_ENOUGH_SUPPLY");
        _safeMint(msg.sender,1);

    }

    function ownerMint(address _address, uint256 quantity) external onlyOwner {
        require(totalSupply() + quantity < maxToken, "NOT_ENOUGH_SUPPLY");
        _safeMint(_address, quantity);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }


    function setRoot(bytes32 _root) external onlyOwner {
        root = _root;
    }

    function flipPublicSaleState() external onlyOwner {
        publicSale = !publicSale;
    }

    function flipWhitelistState() external onlyOwner {
        whitelistSale = !whitelistSale;
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function rescueToken(IERC20 token) external onlyOwner{
        token.transfer(msg.sender, token.balanceOf(address(this)));
    }
    
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner {
        _setDefaultRoyalty( receiver,  feeNumerator);
    }

    function deleteDefaultRoyalty() external onlyOwner {
        _deleteDefaultRoyalty();
    }

    function setTokenRoyalty(uint256 tokenId,address receiver,uint96 feeNumerator) external onlyOwner {
        _setTokenRoyalty(tokenId,receiver,feeNumerator);
    }

    function resetTokenRoyalty(uint256 tokenId) external onlyOwner {
        _resetTokenRoyalty(tokenId);
    }

    fallback() external payable{}
    receive() external payable{}
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"permited","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freemints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":[],"name":"maxToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"permited","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelist_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistmints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260006003556000600a55610684600e5566766c2fd84c5000600f55669de5952065c0006010553480156200003757600080fd5b506040516200428d3803806200428d8339810160408190526200005a9162000464565b82836032600e546200007b62000075620001b260201b60201c565b620001b6565b60008111620000e85760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200014a5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620000df565b83516200015f90600490602087019062000307565b5082516200017590600590602086019062000307565b5060a09190915260805250620001909050336103e862000206565b8151620001a590601190602085019062000307565b50601255506200052a9050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6127106001600160601b0382161115620002765760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620000df565b6001600160a01b038216620002ce5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620000df565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600155565b8280546200031590620004d7565b90600052602060002090601f01602090048101928262000339576000855562000384565b82601f106200035457805160ff191683800117855562000384565b8280016001018555821562000384579182015b828111156200038457825182559160200191906001019062000367565b506200039292915062000396565b5090565b5b8082111562000392576000815560010162000397565b600082601f830112620003bf57600080fd5b81516001600160401b0380821115620003dc57620003dc62000514565b604051601f8301601f19908116603f0116810190828211818310171562000407576200040762000514565b816040528381526020925086838588010111156200042457600080fd5b600091505b8382101562000448578582018301518183018401529082019062000429565b838211156200045a5760008385830101525b9695505050505050565b6000806000606084860312156200047a57600080fd5b83516001600160401b03808211156200049257600080fd5b620004a087838801620003ad565b94506020860151915080821115620004b757600080fd5b50620004c686828701620003ad565b925050604084015190509250925092565b600181811c90821680620004ec57607f821691505b602082108114156200050e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a051613d326200055b600039600081816128d1015281816128fb0152612e51015260005050613d326000f3fe6080604052600436106102bb5760003560e01c80638a616bc01161016c578063bfacda06116100ca578063dab5f34011610084578063ebf0c71711610061578063ebf0c71714610815578063f2fde38b1461082b578063f6fa26ab1461084b57005b8063dab5f34014610796578063ddd8a74d146107b6578063e985e9c5146107cc57005b8063c87b56dd116100b2578063c87b56dd1461074a578063ca69e3231461076a578063d7224ba01461078057005b8063bfacda061461070a578063c4be5b591461073757005b80639aa289ce11610126578063a69f675011610103578063a69f6750146106bf578063aa1b103f146106d5578063b88d4fde146106ea57005b80639aa289ce1461066a578063a10866ef1461068a578063a22cb4651461069f57005b80639231ab2a116101545780639231ab2a146105da57806395d89b4114610628578063964992831461063d57005b80638a616bc01461059c5780638da5cb5b146105bc57005b806333bc1c5c116102195780634f6ccce7116101d35780636352211e116101b05780636352211e1461054757806370a0823114610567578063715018a61461058757005b80634f6ccce7146104e757806355f804b3146105075780635944c7531461052757005b806342842e0e1161020157806342842e0e146104875780634460d3cf146104a7578063484b973c146104c757005b806333bc1c5c146104585780633ccfd60b1461047257005b806318160ddd116102755780632a55205a116102525780632a55205a146103da5780632f745c591461041957806331ffd6f11461043957005b806318160ddd1461039357806323b872dd146103b257806326092b83146103d257005b806306fdde03116102a357806306fdde0314610319578063081812fc1461033b578063095ea7b31461037357005b806301ffc9a7146102c457806304634d8d146102f957005b366102c257005b005b3480156102d057600080fd5b506102e46102df3660046135fe565b610860565b60405190151581526020015b60405180910390f35b34801561030557600080fd5b506102c26103143660046135b0565b6109a0565b34801561032557600080fd5b5061032e610a0d565b6040516102f091906139bd565b34801561034757600080fd5b5061035b6103563660046135e5565b610a9f565b6040516001600160a01b0390911681526020016102f0565b34801561037f57600080fd5b506102c261038e366004613584565b610b3a565b34801561039f57600080fd5b506003545b6040519081526020016102f0565b3480156103be57600080fd5b506102c26103cd36600461342e565b610c6d565b6102c2610c78565b3480156103e657600080fd5b506103fa6103f5366004613701565b610dd6565b604080516001600160a01b0390931683526020830191909152016102f0565b34801561042557600080fd5b506103a4610434366004613584565b610eb3565b34801561044557600080fd5b50600b546102e490610100900460ff1681565b34801561046457600080fd5b50600b546102e49060ff1681565b34801561047e57600080fd5b506102c2611067565b34801561049357600080fd5b506102c26104a236600461342e565b6110f0565b3480156104b357600080fd5b506102c26104c23660046133d8565b61110b565b3480156104d357600080fd5b506102c26104e2366004613584565b61127a565b3480156104f357600080fd5b506103a46105023660046135e5565b611342565b34801561051357600080fd5b506102c2610522366004613638565b6113c5565b34801561053357600080fd5b506102c26105423660046136c3565b61142b565b34801561055357600080fd5b5061035b6105623660046135e5565b611490565b34801561057357600080fd5b506103a46105823660046133d8565b6114a2565b34801561059357600080fd5b506102c261154e565b3480156105a857600080fd5b506102c26105b73660046135e5565b6115b2565b3480156105c857600080fd5b506000546001600160a01b031661035b565b3480156105e657600080fd5b506105fa6105f53660046135e5565b61161d565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102f0565b34801561063457600080fd5b5061032e61163a565b34801561064957600080fd5b506103a46106583660046133d8565b600d6020526000908152604090205481565b34801561067657600080fd5b506102c2610685366004613723565b611649565b34801561069657600080fd5b506102c2611897565b3480156106ab57600080fd5b506102c26106ba366004613551565b611923565b3480156106cb57600080fd5b506103a460105481565b3480156106e157600080fd5b506102c2611a06565b3480156106f657600080fd5b506102c261070536600461346f565b611a6a565b34801561071657600080fd5b506103a46107253660046133d8565b600c6020526000908152604090205481565b6102c2610745366004613723565b611af9565b34801561075657600080fd5b5061032e6107653660046135e5565b611ddd565b34801561077657600080fd5b506103a4600e5481565b34801561078c57600080fd5b506103a4600a5481565b3480156107a257600080fd5b506102c26107b13660046135e5565b611eaf565b3480156107c257600080fd5b506103a4600f5481565b3480156107d857600080fd5b506102e46107e73660046133f5565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b34801561082157600080fd5b506103a460125481565b34801561083757600080fd5b506102c26108463660046133d8565b611f0e565b34801561085757600080fd5b506102c2611fed565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806108f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061093f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061098b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061099a575061099a82612081565b92915050565b6000546001600160a01b031633146109ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610a098282612118565b5050565b606060048054610a1c90613b5c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4890613b5c565b8015610a955780601f10610a6a57610100808354040283529160200191610a95565b820191906000526020600020905b815481529060010190602001808311610a7857829003601f168201915b5050505050905090565b6000610aac826003541190565b610b1e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084016109f6565b506000908152600860205260409020546001600160a01b031690565b6000610b4582611490565b9050806001600160a01b0316836001600160a01b03161415610bcf5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b336001600160a01b0382161480610beb5750610beb81336107e7565b610c5d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109f6565b610c68838383612243565b505050565b610c688383836122b7565b323314610cc75760405162461bcd60e51b815260206004820152600360248201527f3f3f3f000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b600b5460ff16610d195760405162461bcd60e51b815260206004820152601860248201527f53414c455f4841535f4e4f545f535441525445445f594554000000000000000060448201526064016109f6565b346010541115610d6b5760405162461bcd60e51b815260206004820152600360248201527f455448000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b600e54600354610d7c906001613a4a565b10610dc95760405162461bcd60e51b815260206004820152601160248201527f4e4f545f454e4f5547485f535550504c5900000000000000000000000000000060448201526064016109f6565b610dd43360016126e6565b565b60008281526002602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16928201929092528291610e775750604080518082019091526001546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b602081015160009061271090610e9b906bffffffffffffffffffffffff1687613a76565b610ea59190613a62565b915196919550909350505050565b6000610ebe836114a2565b8210610f325760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f647300000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b6000610f3d60035490565b905060008060005b83811015610ff8576000818152600660209081526040918290208251808401909352546001600160a01b0381168084527401000000000000000000000000000000000000000090910467ffffffffffffffff169183019190915215610fa957805192505b876001600160a01b0316836001600160a01b03161415610fe55786841415610fd75750935061099a92505050565b83610fe181613bb0565b9450505b5080610ff081613bb0565b915050610f45565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e64657800000000000000000000000000000000000060648201526084016109f6565b6000546001600160a01b031633146110c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b60405133904780156108fc02916000818181858888f193505050501580156110ed573d6000803e3d6000fd5b50565b610c6883838360405180602001604052806000815250611a6a565b6000546001600160a01b031633146111655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120191906136aa565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561125f57600080fd5b505af1158015611273573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146112d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b600e54816112e160035490565b6112eb9190613a4a565b106113385760405162461bcd60e51b815260206004820152601160248201527f4e4f545f454e4f5547485f535550504c5900000000000000000000000000000060448201526064016109f6565b610a0982826126e6565b600061134d60035490565b82106113c15760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e6473000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b5090565b6000546001600160a01b0316331461141f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b610c6860118383613309565b6000546001600160a01b031633146114855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b610c68838383612700565b600061149b8261283c565b5192915050565b60006001600160a01b0382166115205760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084016109f6565b506001600160a01b03166000908152600760205260409020546fffffffffffffffffffffffffffffffff1690565b6000546001600160a01b031633146115a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b610dd46000612a18565b6000546001600160a01b0316331461160c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b600090815260026020526040812055565b604080518082019091526000808252602082015261099a8261283c565b606060058054610a1c90613b5c565b3233146116985760405162461bcd60e51b815260206004820152600360248201527f3f3f3f000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b600b54610100900460ff161580156116b35750600b5460ff16155b6116ff5760405162461bcd60e51b815260206004820152600d60248201527f467265654d696e745f4f5645520000000000000000000000000000000000000060448201526064016109f6565b6000831161174f5760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f5155414e544954590000000000000000000000000000000060448201526064016109f6565b336000908152600c60205260408120805485929061176e908490613a4a565b9091555061177e90508183612a80565b6117ca5760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49442050524f4f460000000000000000000000000000000000000060448201526064016109f6565b336000908152600c60205260409020548210156118295760405162461bcd60e51b815260206004820152601560248201527f43414e4e4f545f4d494e545f544841545f4d414e59000000000000000000000060448201526064016109f6565b6101708361183660035490565b6118409190613a4a565b1061188d5760405162461bcd60e51b815260206004820152601860248201527f4e4f545f454e4f5547485f464f525f465245455f4d494e54000000000000000060448201526064016109f6565b610c6833846126e6565b6000546001600160a01b031633146118f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6001600160a01b03821633141561197c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109f6565b3360008181526009602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611a605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b610dd46000600155565b611a758484846122b7565b611a8184848484612acb565b611af35760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016109f6565b50505050565b323314611b485760405162461bcd60e51b815260206004820152600360248201527f3f3f3f000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b600b54610100900460ff16611b9f5760405162461bcd60e51b815260206004820152601860248201527f53414c455f4841535f4e4f545f535441525445445f594554000000000000000060448201526064016109f6565b600b5460ff1615611bf25760405162461bcd60e51b815260206004820152600e60248201527f57484954454c4953545f4f56455200000000000000000000000000000000000060448201526064016109f6565b60008311611c425760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f5155414e544954590000000000000000000000000000000060448201526064016109f6565b336000908152600d602052604081208054859290611c61908490613a4a565b9091555050600f543490611c76908590613a76565b1115611cc45760405162461bcd60e51b815260206004820152600360248201527f455448000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b611cce8183612c96565b611d1a5760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49442050524f4f460000000000000000000000000000000000000060448201526064016109f6565b336000908152600d6020526040902054821015611d795760405162461bcd60e51b815260206004820152601560248201527f43414e4e4f545f4d494e545f544841545f4d414e59000000000000000000000060448201526064016109f6565b600e5483611d8660035490565b611d909190613a4a565b1061188d5760405162461bcd60e51b815260206004820152601160248201527f4e4f545f454e4f5547485f535550504c5900000000000000000000000000000060448201526064016109f6565b6060611dea826003541190565b611e5c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109f6565b6000611e6783612cb4565b90506000815111611e875760405180602001604052806000815250611ea8565b80604051602001611e989190613940565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611f095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b601255565b6000546001600160a01b03163314611f685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b6001600160a01b038116611fe45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109f6565b6110ed81612a18565b6000546001600160a01b031633146120475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061099a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461099a565b6127106bffffffffffffffffffffffff8216111561219e5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084016109f6565b6001600160a01b0382166121f45760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109f6565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600155565b60008281526008602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006122c28261283c565b80519091506000906001600160a01b0316336001600160a01b031614806122f95750336122ee84610a9f565b6001600160a01b0316145b8061230b5750815161230b90336107e7565b9050806123805760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016109f6565b846001600160a01b031682600001516001600160a01b03161461240b5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e6572000000000000000000000000000000000000000000000000000060648201526084016109f6565b6001600160a01b0384166124875760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109f6565b6124976000848460000151612243565b6001600160a01b03851660009081526007602052604081208054600192906124d29084906fffffffffffffffffffffffffffffffff16613ab3565b82546101009290920a6fffffffffffffffffffffffffffffffff8181021990931691831602179091556001600160a01b0386166000908152600760205260408120805460019450909261252791859116613a1f565b82546fffffffffffffffffffffffffffffffff9182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff42811660208085019182526000898152600690915294852093518454915190921674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090911691909216171790556125e1846001613a4a565b6000818152600660205260409020549091506001600160a01b031661269c5761260b816003541190565b1561269c5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff908116828501908152600087815260069093529490912092518354945190911674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610a09828260405180602001604052806000815250612d78565b6127106bffffffffffffffffffffffff821611156127865760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084016109f6565b6001600160a01b0382166127dc5760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d6574657273000000000060448201526064016109f6565b6040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff9283166020808301918252600096875260029052919094209351905190911674010000000000000000000000000000000000000000029116179055565b604080518082019091526000808252602082015261285b826003541190565b6128cd5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e0000000000000000000000000000000000000000000060648201526084016109f6565b60007f0000000000000000000000000000000000000000000000000000000000000000831061292e576129207f000000000000000000000000000000000000000000000000000000000000000084613ae4565b61292b906001613a4a565b90505b825b8181106129a9576000818152600660209081526040918290208251808401909352546001600160a01b0381168084527401000000000000000000000000000000000000000090910467ffffffffffffffff16918301919091521561299657949350505050565b50806129a181613b27565b915050612930565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e000000000000000000000000000000000060648201526084016109f6565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008033612a8d8461313e565b604051602001612a9e9291906138a0565b604051602081830303815290604052805190602001209050612ac38460125483613270565b949350505050565b60006001600160a01b0384163b15612c8b576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612b28903390899088908890600401613981565b602060405180830381600087803b158015612b4257600080fd5b505af1925050508015612b90575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612b8d9181019061361b565b60015b612c40573d808015612bbe576040519150601f19603f3d011682016040523d82523d6000602084013e612bc3565b606091505b508051612c385760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016109f6565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612ac3565b506001949350505050565b60008033612ca38461313e565b604051602001612a9e92919061382f565b6060612cc1826003541190565b612d335760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109f6565b6000612d3d613286565b90506000815111612d5d5760405180602001604052806000815250611ea8565b80612d678461313e565b604051602001611e98929190613911565b6003546001600160a01b038416612df75760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b612e02816003541190565b15612e4f5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109f6565b7f0000000000000000000000000000000000000000000000000000000000000000831115612ee55760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f676800000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b6001600160a01b0384166000908152600760209081526040918290208251808401845290546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810191909152815180830190925280519091908190612f57908790613a1f565b6fffffffffffffffffffffffffffffffff168152602001858360200151612f7e9190613a1f565b6fffffffffffffffffffffffffffffffff9081169091526001600160a01b03808816600081815260076020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff428116838601908152888352600690955294812091518254945190951674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090941694909216939093179190911790915582905b858110156131335760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46130a16000888488612acb565b6131135760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016109f6565b8161311d81613bb0565b925050808061312b90613bb0565b915050613054565b5060038190556126de565b60608161317e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156131a8578061319281613bb0565b91506131a19050600a83613a62565b9150613182565b60008167ffffffffffffffff8111156131c3576131c3613c8a565b6040519080825280601f01601f1916602001820160405280156131ed576020820181803683370190505b5090505b8415612ac357613202600183613ae4565b915061320f600a86613be9565b61321a906030613a4a565b60f81b81838151811061322f5761322f613c5b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613269600a86613a62565b94506131f1565b60008261327d8584613295565b14949350505050565b606060118054610a1c90613b5c565b600081815b84518110156133015760008582815181106132b7576132b7613c5b565b602002602001015190508083116132dd57600083815260208290526040902092506132ee565b600081815260208490526040902092505b50806132f981613bb0565b91505061329a565b509392505050565b82805461331590613b5c565b90600052602060002090601f016020900481019282613337576000855561339b565b82601f1061336e578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561339b565b8280016001018555821561339b579182015b8281111561339b578235825591602001919060010190613380565b506113c19291505b808211156113c157600081556001016133a3565b80356bffffffffffffffffffffffff811681146133d357600080fd5b919050565b6000602082840312156133ea57600080fd5b8135611ea881613cb9565b6000806040838503121561340857600080fd5b823561341381613cb9565b9150602083013561342381613cb9565b809150509250929050565b60008060006060848603121561344357600080fd5b833561344e81613cb9565b9250602084013561345e81613cb9565b929592945050506040919091013590565b6000806000806080858703121561348557600080fd5b843561349081613cb9565b93506020858101356134a181613cb9565b935060408601359250606086013567ffffffffffffffff808211156134c557600080fd5b818801915088601f8301126134d957600080fd5b8135818111156134eb576134eb613c8a565b61351b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016139d0565b9150808252898482850101111561353157600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561356457600080fd5b823561356f81613cb9565b91506020830135801515811461342357600080fd5b6000806040838503121561359757600080fd5b82356135a281613cb9565b946020939093013593505050565b600080604083850312156135c357600080fd5b82356135ce81613cb9565b91506135dc602084016133b7565b90509250929050565b6000602082840312156135f757600080fd5b5035919050565b60006020828403121561361057600080fd5b8135611ea881613cce565b60006020828403121561362d57600080fd5b8151611ea881613cce565b6000806020838503121561364b57600080fd5b823567ffffffffffffffff8082111561366357600080fd5b818501915085601f83011261367757600080fd5b81358181111561368657600080fd5b86602082850101111561369857600080fd5b60209290920196919550909350505050565b6000602082840312156136bc57600080fd5b5051919050565b6000806000606084860312156136d857600080fd5b8335925060208401356136ea81613cb9565b91506136f8604085016133b7565b90509250925092565b6000806040838503121561371457600080fd5b50508035926020909101359150565b60008060006060848603121561373857600080fd5b833592506020808501359250604085013567ffffffffffffffff8082111561375f57600080fd5b818701915087601f83011261377357600080fd5b81358181111561378557613785613c8a565b8060051b91506137968483016139d0565b8181528481019084860184860187018c10156137b157600080fd5b600095505b838610156137d45780358352600195909501949186019186016137b6565b508096505050505050509250925092565b600081518084526137fd816020860160208601613afb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1681527f3a77686974656c6973743a00000000000000000000000000000000000000000060148201526000825161389281601f850160208701613afb565b91909101601f019392505050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1681527f3a667265656d696e743a0000000000000000000000000000000000000000000060148201526000825161390381601e850160208701613afb565b91909101601e019392505050565b60008351613923818460208801613afb565b835190830190613937818360208801613afb565b01949350505050565b60008251613952818460208701613afb565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250600501919050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526139b360808301846137e5565b9695505050505050565b602081526000611ea860208301846137e5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a1757613a17613c8a565b604052919050565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561393757613937613bfd565b60008219821115613a5d57613a5d613bfd565b500190565b600082613a7157613a71613c2c565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613aae57613aae613bfd565b500290565b60006fffffffffffffffffffffffffffffffff83811690831681811015613adc57613adc613bfd565b039392505050565b600082821015613af657613af6613bfd565b500390565b60005b83811015613b16578181015183820152602001613afe565b83811115611af35750506000910152565b600081613b3657613b36613bfd565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613b7057607f821691505b60208210811415613baa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613be257613be2613bfd565b5060010190565b600082613bf857613bf8613c2c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b03811681146110ed57600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146110ed57600080fdfea2646970667358221220e8e3775ab3f2a85f318e92af36dfe0c9811e73901d565e6873ae316169d707c464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a04625cebd875ba3a68e450d0041eddcc0470a27e400eeffa8ee52958f9ed1233a000000000000000000000000000000000000000000000000000000000000000856696c6c61696e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f76696c6c61696e732e616e74686961676f2e636f6d2f6d657461646174612f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102bb5760003560e01c80638a616bc01161016c578063bfacda06116100ca578063dab5f34011610084578063ebf0c71711610061578063ebf0c71714610815578063f2fde38b1461082b578063f6fa26ab1461084b57005b8063dab5f34014610796578063ddd8a74d146107b6578063e985e9c5146107cc57005b8063c87b56dd116100b2578063c87b56dd1461074a578063ca69e3231461076a578063d7224ba01461078057005b8063bfacda061461070a578063c4be5b591461073757005b80639aa289ce11610126578063a69f675011610103578063a69f6750146106bf578063aa1b103f146106d5578063b88d4fde146106ea57005b80639aa289ce1461066a578063a10866ef1461068a578063a22cb4651461069f57005b80639231ab2a116101545780639231ab2a146105da57806395d89b4114610628578063964992831461063d57005b80638a616bc01461059c5780638da5cb5b146105bc57005b806333bc1c5c116102195780634f6ccce7116101d35780636352211e116101b05780636352211e1461054757806370a0823114610567578063715018a61461058757005b80634f6ccce7146104e757806355f804b3146105075780635944c7531461052757005b806342842e0e1161020157806342842e0e146104875780634460d3cf146104a7578063484b973c146104c757005b806333bc1c5c146104585780633ccfd60b1461047257005b806318160ddd116102755780632a55205a116102525780632a55205a146103da5780632f745c591461041957806331ffd6f11461043957005b806318160ddd1461039357806323b872dd146103b257806326092b83146103d257005b806306fdde03116102a357806306fdde0314610319578063081812fc1461033b578063095ea7b31461037357005b806301ffc9a7146102c457806304634d8d146102f957005b366102c257005b005b3480156102d057600080fd5b506102e46102df3660046135fe565b610860565b60405190151581526020015b60405180910390f35b34801561030557600080fd5b506102c26103143660046135b0565b6109a0565b34801561032557600080fd5b5061032e610a0d565b6040516102f091906139bd565b34801561034757600080fd5b5061035b6103563660046135e5565b610a9f565b6040516001600160a01b0390911681526020016102f0565b34801561037f57600080fd5b506102c261038e366004613584565b610b3a565b34801561039f57600080fd5b506003545b6040519081526020016102f0565b3480156103be57600080fd5b506102c26103cd36600461342e565b610c6d565b6102c2610c78565b3480156103e657600080fd5b506103fa6103f5366004613701565b610dd6565b604080516001600160a01b0390931683526020830191909152016102f0565b34801561042557600080fd5b506103a4610434366004613584565b610eb3565b34801561044557600080fd5b50600b546102e490610100900460ff1681565b34801561046457600080fd5b50600b546102e49060ff1681565b34801561047e57600080fd5b506102c2611067565b34801561049357600080fd5b506102c26104a236600461342e565b6110f0565b3480156104b357600080fd5b506102c26104c23660046133d8565b61110b565b3480156104d357600080fd5b506102c26104e2366004613584565b61127a565b3480156104f357600080fd5b506103a46105023660046135e5565b611342565b34801561051357600080fd5b506102c2610522366004613638565b6113c5565b34801561053357600080fd5b506102c26105423660046136c3565b61142b565b34801561055357600080fd5b5061035b6105623660046135e5565b611490565b34801561057357600080fd5b506103a46105823660046133d8565b6114a2565b34801561059357600080fd5b506102c261154e565b3480156105a857600080fd5b506102c26105b73660046135e5565b6115b2565b3480156105c857600080fd5b506000546001600160a01b031661035b565b3480156105e657600080fd5b506105fa6105f53660046135e5565b61161d565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102f0565b34801561063457600080fd5b5061032e61163a565b34801561064957600080fd5b506103a46106583660046133d8565b600d6020526000908152604090205481565b34801561067657600080fd5b506102c2610685366004613723565b611649565b34801561069657600080fd5b506102c2611897565b3480156106ab57600080fd5b506102c26106ba366004613551565b611923565b3480156106cb57600080fd5b506103a460105481565b3480156106e157600080fd5b506102c2611a06565b3480156106f657600080fd5b506102c261070536600461346f565b611a6a565b34801561071657600080fd5b506103a46107253660046133d8565b600c6020526000908152604090205481565b6102c2610745366004613723565b611af9565b34801561075657600080fd5b5061032e6107653660046135e5565b611ddd565b34801561077657600080fd5b506103a4600e5481565b34801561078c57600080fd5b506103a4600a5481565b3480156107a257600080fd5b506102c26107b13660046135e5565b611eaf565b3480156107c257600080fd5b506103a4600f5481565b3480156107d857600080fd5b506102e46107e73660046133f5565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b34801561082157600080fd5b506103a460125481565b34801561083757600080fd5b506102c26108463660046133d8565b611f0e565b34801561085757600080fd5b506102c2611fed565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806108f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061093f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061098b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061099a575061099a82612081565b92915050565b6000546001600160a01b031633146109ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610a098282612118565b5050565b606060048054610a1c90613b5c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4890613b5c565b8015610a955780601f10610a6a57610100808354040283529160200191610a95565b820191906000526020600020905b815481529060010190602001808311610a7857829003601f168201915b5050505050905090565b6000610aac826003541190565b610b1e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084016109f6565b506000908152600860205260409020546001600160a01b031690565b6000610b4582611490565b9050806001600160a01b0316836001600160a01b03161415610bcf5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b336001600160a01b0382161480610beb5750610beb81336107e7565b610c5d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109f6565b610c68838383612243565b505050565b610c688383836122b7565b323314610cc75760405162461bcd60e51b815260206004820152600360248201527f3f3f3f000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b600b5460ff16610d195760405162461bcd60e51b815260206004820152601860248201527f53414c455f4841535f4e4f545f535441525445445f594554000000000000000060448201526064016109f6565b346010541115610d6b5760405162461bcd60e51b815260206004820152600360248201527f455448000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b600e54600354610d7c906001613a4a565b10610dc95760405162461bcd60e51b815260206004820152601160248201527f4e4f545f454e4f5547485f535550504c5900000000000000000000000000000060448201526064016109f6565b610dd43360016126e6565b565b60008281526002602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16928201929092528291610e775750604080518082019091526001546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b602081015160009061271090610e9b906bffffffffffffffffffffffff1687613a76565b610ea59190613a62565b915196919550909350505050565b6000610ebe836114a2565b8210610f325760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f647300000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b6000610f3d60035490565b905060008060005b83811015610ff8576000818152600660209081526040918290208251808401909352546001600160a01b0381168084527401000000000000000000000000000000000000000090910467ffffffffffffffff169183019190915215610fa957805192505b876001600160a01b0316836001600160a01b03161415610fe55786841415610fd75750935061099a92505050565b83610fe181613bb0565b9450505b5080610ff081613bb0565b915050610f45565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e64657800000000000000000000000000000000000060648201526084016109f6565b6000546001600160a01b031633146110c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b60405133904780156108fc02916000818181858888f193505050501580156110ed573d6000803e3d6000fd5b50565b610c6883838360405180602001604052806000815250611a6a565b6000546001600160a01b031633146111655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120191906136aa565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561125f57600080fd5b505af1158015611273573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146112d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b600e54816112e160035490565b6112eb9190613a4a565b106113385760405162461bcd60e51b815260206004820152601160248201527f4e4f545f454e4f5547485f535550504c5900000000000000000000000000000060448201526064016109f6565b610a0982826126e6565b600061134d60035490565b82106113c15760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e6473000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b5090565b6000546001600160a01b0316331461141f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b610c6860118383613309565b6000546001600160a01b031633146114855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b610c68838383612700565b600061149b8261283c565b5192915050565b60006001600160a01b0382166115205760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084016109f6565b506001600160a01b03166000908152600760205260409020546fffffffffffffffffffffffffffffffff1690565b6000546001600160a01b031633146115a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b610dd46000612a18565b6000546001600160a01b0316331461160c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b600090815260026020526040812055565b604080518082019091526000808252602082015261099a8261283c565b606060058054610a1c90613b5c565b3233146116985760405162461bcd60e51b815260206004820152600360248201527f3f3f3f000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b600b54610100900460ff161580156116b35750600b5460ff16155b6116ff5760405162461bcd60e51b815260206004820152600d60248201527f467265654d696e745f4f5645520000000000000000000000000000000000000060448201526064016109f6565b6000831161174f5760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f5155414e544954590000000000000000000000000000000060448201526064016109f6565b336000908152600c60205260408120805485929061176e908490613a4a565b9091555061177e90508183612a80565b6117ca5760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49442050524f4f460000000000000000000000000000000000000060448201526064016109f6565b336000908152600c60205260409020548210156118295760405162461bcd60e51b815260206004820152601560248201527f43414e4e4f545f4d494e545f544841545f4d414e59000000000000000000000060448201526064016109f6565b6101708361183660035490565b6118409190613a4a565b1061188d5760405162461bcd60e51b815260206004820152601860248201527f4e4f545f454e4f5547485f464f525f465245455f4d494e54000000000000000060448201526064016109f6565b610c6833846126e6565b6000546001600160a01b031633146118f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6001600160a01b03821633141561197c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109f6565b3360008181526009602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611a605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b610dd46000600155565b611a758484846122b7565b611a8184848484612acb565b611af35760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016109f6565b50505050565b323314611b485760405162461bcd60e51b815260206004820152600360248201527f3f3f3f000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b600b54610100900460ff16611b9f5760405162461bcd60e51b815260206004820152601860248201527f53414c455f4841535f4e4f545f535441525445445f594554000000000000000060448201526064016109f6565b600b5460ff1615611bf25760405162461bcd60e51b815260206004820152600e60248201527f57484954454c4953545f4f56455200000000000000000000000000000000000060448201526064016109f6565b60008311611c425760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f5155414e544954590000000000000000000000000000000060448201526064016109f6565b336000908152600d602052604081208054859290611c61908490613a4a565b9091555050600f543490611c76908590613a76565b1115611cc45760405162461bcd60e51b815260206004820152600360248201527f455448000000000000000000000000000000000000000000000000000000000060448201526064016109f6565b611cce8183612c96565b611d1a5760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49442050524f4f460000000000000000000000000000000000000060448201526064016109f6565b336000908152600d6020526040902054821015611d795760405162461bcd60e51b815260206004820152601560248201527f43414e4e4f545f4d494e545f544841545f4d414e59000000000000000000000060448201526064016109f6565b600e5483611d8660035490565b611d909190613a4a565b1061188d5760405162461bcd60e51b815260206004820152601160248201527f4e4f545f454e4f5547485f535550504c5900000000000000000000000000000060448201526064016109f6565b6060611dea826003541190565b611e5c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109f6565b6000611e6783612cb4565b90506000815111611e875760405180602001604052806000815250611ea8565b80604051602001611e989190613940565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611f095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b601255565b6000546001600160a01b03163314611f685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b6001600160a01b038116611fe45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109f6565b6110ed81612a18565b6000546001600160a01b031633146120475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061099a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461099a565b6127106bffffffffffffffffffffffff8216111561219e5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084016109f6565b6001600160a01b0382166121f45760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109f6565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600155565b60008281526008602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006122c28261283c565b80519091506000906001600160a01b0316336001600160a01b031614806122f95750336122ee84610a9f565b6001600160a01b0316145b8061230b5750815161230b90336107e7565b9050806123805760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016109f6565b846001600160a01b031682600001516001600160a01b03161461240b5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e6572000000000000000000000000000000000000000000000000000060648201526084016109f6565b6001600160a01b0384166124875760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109f6565b6124976000848460000151612243565b6001600160a01b03851660009081526007602052604081208054600192906124d29084906fffffffffffffffffffffffffffffffff16613ab3565b82546101009290920a6fffffffffffffffffffffffffffffffff8181021990931691831602179091556001600160a01b0386166000908152600760205260408120805460019450909261252791859116613a1f565b82546fffffffffffffffffffffffffffffffff9182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff42811660208085019182526000898152600690915294852093518454915190921674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090911691909216171790556125e1846001613a4a565b6000818152600660205260409020549091506001600160a01b031661269c5761260b816003541190565b1561269c5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff908116828501908152600087815260069093529490912092518354945190911674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610a09828260405180602001604052806000815250612d78565b6127106bffffffffffffffffffffffff821611156127865760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084016109f6565b6001600160a01b0382166127dc5760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d6574657273000000000060448201526064016109f6565b6040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff9283166020808301918252600096875260029052919094209351905190911674010000000000000000000000000000000000000000029116179055565b604080518082019091526000808252602082015261285b826003541190565b6128cd5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e0000000000000000000000000000000000000000000060648201526084016109f6565b60007f0000000000000000000000000000000000000000000000000000000000000032831061292e576129207f000000000000000000000000000000000000000000000000000000000000003284613ae4565b61292b906001613a4a565b90505b825b8181106129a9576000818152600660209081526040918290208251808401909352546001600160a01b0381168084527401000000000000000000000000000000000000000090910467ffffffffffffffff16918301919091521561299657949350505050565b50806129a181613b27565b915050612930565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e000000000000000000000000000000000060648201526084016109f6565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008033612a8d8461313e565b604051602001612a9e9291906138a0565b604051602081830303815290604052805190602001209050612ac38460125483613270565b949350505050565b60006001600160a01b0384163b15612c8b576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612b28903390899088908890600401613981565b602060405180830381600087803b158015612b4257600080fd5b505af1925050508015612b90575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612b8d9181019061361b565b60015b612c40573d808015612bbe576040519150601f19603f3d011682016040523d82523d6000602084013e612bc3565b606091505b508051612c385760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016109f6565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612ac3565b506001949350505050565b60008033612ca38461313e565b604051602001612a9e92919061382f565b6060612cc1826003541190565b612d335760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109f6565b6000612d3d613286565b90506000815111612d5d5760405180602001604052806000815250611ea8565b80612d678461313e565b604051602001611e98929190613911565b6003546001600160a01b038416612df75760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b612e02816003541190565b15612e4f5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109f6565b7f0000000000000000000000000000000000000000000000000000000000000032831115612ee55760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f676800000000000000000000000000000000000000000000000000000000000060648201526084016109f6565b6001600160a01b0384166000908152600760209081526040918290208251808401845290546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810191909152815180830190925280519091908190612f57908790613a1f565b6fffffffffffffffffffffffffffffffff168152602001858360200151612f7e9190613a1f565b6fffffffffffffffffffffffffffffffff9081169091526001600160a01b03808816600081815260076020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff428116838601908152888352600690955294812091518254945190951674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090941694909216939093179190911790915582905b858110156131335760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46130a16000888488612acb565b6131135760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016109f6565b8161311d81613bb0565b925050808061312b90613bb0565b915050613054565b5060038190556126de565b60608161317e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156131a8578061319281613bb0565b91506131a19050600a83613a62565b9150613182565b60008167ffffffffffffffff8111156131c3576131c3613c8a565b6040519080825280601f01601f1916602001820160405280156131ed576020820181803683370190505b5090505b8415612ac357613202600183613ae4565b915061320f600a86613be9565b61321a906030613a4a565b60f81b81838151811061322f5761322f613c5b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613269600a86613a62565b94506131f1565b60008261327d8584613295565b14949350505050565b606060118054610a1c90613b5c565b600081815b84518110156133015760008582815181106132b7576132b7613c5b565b602002602001015190508083116132dd57600083815260208290526040902092506132ee565b600081815260208490526040902092505b50806132f981613bb0565b91505061329a565b509392505050565b82805461331590613b5c565b90600052602060002090601f016020900481019282613337576000855561339b565b82601f1061336e578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561339b565b8280016001018555821561339b579182015b8281111561339b578235825591602001919060010190613380565b506113c19291505b808211156113c157600081556001016133a3565b80356bffffffffffffffffffffffff811681146133d357600080fd5b919050565b6000602082840312156133ea57600080fd5b8135611ea881613cb9565b6000806040838503121561340857600080fd5b823561341381613cb9565b9150602083013561342381613cb9565b809150509250929050565b60008060006060848603121561344357600080fd5b833561344e81613cb9565b9250602084013561345e81613cb9565b929592945050506040919091013590565b6000806000806080858703121561348557600080fd5b843561349081613cb9565b93506020858101356134a181613cb9565b935060408601359250606086013567ffffffffffffffff808211156134c557600080fd5b818801915088601f8301126134d957600080fd5b8135818111156134eb576134eb613c8a565b61351b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016139d0565b9150808252898482850101111561353157600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561356457600080fd5b823561356f81613cb9565b91506020830135801515811461342357600080fd5b6000806040838503121561359757600080fd5b82356135a281613cb9565b946020939093013593505050565b600080604083850312156135c357600080fd5b82356135ce81613cb9565b91506135dc602084016133b7565b90509250929050565b6000602082840312156135f757600080fd5b5035919050565b60006020828403121561361057600080fd5b8135611ea881613cce565b60006020828403121561362d57600080fd5b8151611ea881613cce565b6000806020838503121561364b57600080fd5b823567ffffffffffffffff8082111561366357600080fd5b818501915085601f83011261367757600080fd5b81358181111561368657600080fd5b86602082850101111561369857600080fd5b60209290920196919550909350505050565b6000602082840312156136bc57600080fd5b5051919050565b6000806000606084860312156136d857600080fd5b8335925060208401356136ea81613cb9565b91506136f8604085016133b7565b90509250925092565b6000806040838503121561371457600080fd5b50508035926020909101359150565b60008060006060848603121561373857600080fd5b833592506020808501359250604085013567ffffffffffffffff8082111561375f57600080fd5b818701915087601f83011261377357600080fd5b81358181111561378557613785613c8a565b8060051b91506137968483016139d0565b8181528481019084860184860187018c10156137b157600080fd5b600095505b838610156137d45780358352600195909501949186019186016137b6565b508096505050505050509250925092565b600081518084526137fd816020860160208601613afb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1681527f3a77686974656c6973743a00000000000000000000000000000000000000000060148201526000825161389281601f850160208701613afb565b91909101601f019392505050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1681527f3a667265656d696e743a0000000000000000000000000000000000000000000060148201526000825161390381601e850160208701613afb565b91909101601e019392505050565b60008351613923818460208801613afb565b835190830190613937818360208801613afb565b01949350505050565b60008251613952818460208701613afb565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250600501919050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526139b360808301846137e5565b9695505050505050565b602081526000611ea860208301846137e5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a1757613a17613c8a565b604052919050565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561393757613937613bfd565b60008219821115613a5d57613a5d613bfd565b500190565b600082613a7157613a71613c2c565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613aae57613aae613bfd565b500290565b60006fffffffffffffffffffffffffffffffff83811690831681811015613adc57613adc613bfd565b039392505050565b600082821015613af657613af6613bfd565b500390565b60005b83811015613b16578181015183820152602001613afe565b83811115611af35750506000910152565b600081613b3657613b36613bfd565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613b7057607f821691505b60208210811415613baa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613be257613be2613bfd565b5060010190565b600082613bf857613bf8613c2c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b03811681146110ed57600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146110ed57600080fdfea2646970667358221220e8e3775ab3f2a85f318e92af36dfe0c9811e73901d565e6873ae316169d707c464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a04625cebd875ba3a68e450d0041eddcc0470a27e400eeffa8ee52958f9ed1233a000000000000000000000000000000000000000000000000000000000000000856696c6c61696e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f76696c6c61696e732e616e74686961676f2e636f6d2f6d657461646174612f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Villains
Arg [1] : uri (string): https://villains.anthiago.com/metadata/
Arg [2] : _root (bytes32): 0x4625cebd875ba3a68e450d0041eddcc0470a27e400eeffa8ee52958f9ed1233a

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 4625cebd875ba3a68e450d0041eddcc0470a27e400eeffa8ee52958f9ed1233a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 56696c6c61696e73000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [6] : 68747470733a2f2f76696c6c61696e732e616e74686961676f2e636f6d2f6d65
Arg [7] : 7461646174612f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

28604:5293:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17329:489;;;;;;;;;;-1:-1:-1;17329:489:0;;;;;:::i;:::-;;:::i;:::-;;;10832:14:1;;10825:22;10807:41;;10795:2;10780:18;17329:489:0;;;;;;;;33279:148;;;;;;;;;;-1:-1:-1;33279:148:0;;;;;:::i;:::-;;:::i;19190:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20399:292::-;;;;;;;;;;-1:-1:-1;20399:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9782:55:1;;;9764:74;;9752:2;9737:18;20399:292:0;9618:226:1;19980:413:0;;;;;;;;;;-1:-1:-1;19980:413:0;;;;;:::i;:::-;;:::i;16119:100::-;;;;;;;;;;-1:-1:-1;16199:12:0;;16119:100;;;11005:25:1;;;10993:2;10978:18;16119:100:0;10859:177:1;21234:162:0;;;;;;;;;;-1:-1:-1;21234:162:0;;;;;:::i;:::-;;:::i;31993:278::-;;;:::i;12048:494::-;;;;;;;;;;-1:-1:-1;12048:494:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10557:55:1;;;10539:74;;10644:2;10629:18;;10622:34;;;;10512:18;12048:494:0;10365:297:1;16459:864:0;;;;;;;;;;-1:-1:-1;16459:864:0;;;;;:::i;:::-;;:::i;28686:25::-;;;;;;;;;;-1:-1:-1;28686:25:0;;;;;;;;;;;28657:22;;;;;;;;;;-1:-1:-1;28657:22:0;;;;;;;;33020:109;;;;;;;;;;;;;:::i;21402:177::-;;;;;;;;;;-1:-1:-1;21402:177:0;;;;;:::i;:::-;;:::i;33137:130::-;;;;;;;;;;-1:-1:-1;33137:130:0;;;;;:::i;:::-;;:::i;32279:198::-;;;;;;;;;;-1:-1:-1;32279:198:0;;;;;:::i;:::-;;:::i;16225:228::-;;;;;;;;;;-1:-1:-1;16225:228:0;;;;;:::i;:::-;;:::i;32906:106::-;;;;;;;;;;-1:-1:-1;32906:106:0;;;;;:::i;:::-;;:::i;33536:164::-;;;;;;;;;;-1:-1:-1;33536:164:0;;;;;:::i;:::-;;:::i;19060:124::-;;;;;;;;;;-1:-1:-1;19060:124:0;;;;;:::i;:::-;;:::i;17832:258::-;;;;;;;;;;-1:-1:-1;17832:258:0;;;;;:::i;:::-;;:::i;7056:94::-;;;;;;;;;;;;;:::i;33708:109::-;;;;;;;;;;-1:-1:-1;33708:109:0;;;;;:::i;:::-;;:::i;6837:87::-;;;;;;;;;;-1:-1:-1;6883:7:0;6910:6;-1:-1:-1;;;;;6910:6:0;6837:87;;29532:167;;;;;;;;;;-1:-1:-1;29532:167:0;;;;;:::i;:::-;;:::i;:::-;;;;24112:13:1;;-1:-1:-1;;;;;24108:62:1;24090:81;;24231:4;24219:17;;;24213:24;24239:18;24209:49;24187:20;;;24180:79;;;;24063:18;29532:167:0;23880:385:1;19296:104:0;;;;;;;;;;;;;:::i;28768:46::-;;;;;;;;;;-1:-1:-1;28768:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;30739:537;;;;;;;;;;-1:-1:-1;30739:537:0;;;;;:::i;:::-;;:::i;32699:93::-;;;;;;;;;;;;;:::i;20697:311::-;;;;;;;;;;-1:-1:-1;20697:311:0;;;;;:::i;:::-;;:::i;28950:47::-;;;;;;;;;;;;;;;;33435:93;;;;;;;;;;;;;:::i;21585:355::-;;;;;;;;;;-1:-1:-1;21585:355:0;;;;;:::i;:::-;;:::i;28720:41::-;;;;;;;;;;-1:-1:-1;28720:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;31284:699;;;;;;:::i;:::-;;:::i;29707:478::-;;;;;;;;;;-1:-1:-1;29707:478:0;;;;;:::i;:::-;;:::i;28859:30::-;;;;;;;;;;;;;;;;25206:43;;;;;;;;;;;;;;;;32609:82;;;;;;;;;;-1:-1:-1;32609:82:0;;;;;:::i;:::-;;:::i;28896:47::-;;;;;;;;;;;;;;;;21014:214;;;;;;;;;;-1:-1:-1;21014:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;21185:25:0;;;21156:4;21185:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;21014:214;29047:19;;;;;;;;;;;;;;;;7156:229;;;;;;;;;;-1:-1:-1;7156:229:0;;;;;:::i;:::-;;:::i;32800:98::-;;;;;;;;;;;;;:::i;17329:489::-;17485:4;17527:41;;;17542:26;17527:41;;:98;;-1:-1:-1;17585:40:0;;;17600:25;17585:40;17527:98;:163;;;-1:-1:-1;17642:48:0;;;17657:33;17642:48;17527:163;:230;;;-1:-1:-1;17707:50:0;;;17722:35;17707:50;17527:230;:283;;;;17774:36;17798:11;17774:23;:36::i;:::-;17507:303;17329:489;-1:-1:-1;;17329:489:0:o;33279:148::-;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;;;;;;;;;33375:44:::1;33395:8;33406:12;33375:18;:44::i;:::-;33279:148:::0;;:::o;19190:100::-;19244:13;19277:5;19270:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19190:100;:::o;20399:292::-;20503:7;20550:16;20558:7;22037:12;;-1:-1:-1;22027:22:0;21946:111;20550:16;20528:111;;;;-1:-1:-1;;;20528:111:0;;22911:2:1;20528:111:0;;;22893:21:1;22950:2;22930:18;;;22923:30;22989:34;22969:18;;;22962:62;23060:15;23040:18;;;23033:43;23093:19;;20528:111:0;22709:409:1;20528:111:0;-1:-1:-1;20659:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;20659:24:0;;20399:292::o;19980:413::-;20053:13;20069:24;20085:7;20069:15;:24::i;:::-;20053:40;;20118:5;-1:-1:-1;;;;;20112:11:0;:2;-1:-1:-1;;;;;20112:11:0;;;20104:58;;;;-1:-1:-1;;;20104:58:0;;18337:2:1;20104:58:0;;;18319:21:1;18376:2;18356:18;;;18349:30;18415:34;18395:18;;;18388:62;18486:4;18466:18;;;18459:32;18508:19;;20104:58:0;18135:398:1;20104:58:0;6424:10;-1:-1:-1;;;;;20197:21:0;;;;:62;;-1:-1:-1;20222:37:0;20239:5;6424:10;21014:214;:::i;20222:37::-;20175:169;;;;-1:-1:-1;;;20175:169:0;;14191:2:1;20175:169:0;;;14173:21:1;14230:2;14210:18;;;14203:30;14269:34;14249:18;;;14242:62;14340:27;14320:18;;;14313:55;14385:19;;20175:169:0;13989:421:1;20175:169:0;20357:28;20366:2;20370:7;20379:5;20357:8;:28::i;:::-;20042:351;19980:413;;:::o;21234:162::-;21360:28;21370:4;21376:2;21380:7;21360:9;:28::i;31993:278::-;29350:9;29363:10;29350:23;29342:39;;;;-1:-1:-1;;;29342:39:0;;18006:2:1;29342:39:0;;;17988:21:1;18045:1;18025:18;;;18018:29;18083:5;18063:18;;;18056:33;18106:18;;29342:39:0;17804:326:1;29342:39:0;32064:10:::1;::::0;::::1;;32055:49;;;::::0;-1:-1:-1;;;32055:49:0;;18740:2:1;32055:49:0::1;::::0;::::1;18722:21:1::0;18779:2;18759:18;;;18752:30;18818:26;18798:18;;;18791:54;18862:18;;32055:49:0::1;18538:348:1::0;32055:49:0::1;32140:9;32124:12;;:25;;32115:43;;;::::0;-1:-1:-1;;;32115:43:0;;17675:2:1;32115:43:0::1;::::0;::::1;17657:21:1::0;17714:1;17694:18;;;17687:29;17752:5;17732:18;;;17725:33;17775:18;;32115:43:0::1;17473:326:1::0;32115:43:0::1;32197:8;::::0;16199:12;;32177:17:::1;::::0;32193:1:::1;32177:17;:::i;:::-;:28;32169:58;;;::::0;-1:-1:-1;;;32169:58:0;;17329:2:1;32169:58:0::1;::::0;::::1;17311:21:1::0;17368:2;17348:18;;;17341:30;17407:19;17387:18;;;17380:47;17444:18;;32169:58:0::1;17127:341:1::0;32169:58:0::1;32238:23;32248:10;32259:1;32238:9;:23::i;:::-;31993:278::o:0;12048:494::-;12192:7;12255:27;;;:17;:27;;;;;;;;12226:56;;;;;;;;;-1:-1:-1;;;;;12226:56:0;;;;;;;;;;;;;;;;;;12192:7;;12295:92;;-1:-1:-1;12346:29:0;;;;;;;;;12356:19;12346:29;-1:-1:-1;;;;;12346:29:0;;;;;;;;;;;;;12295:92;12437:23;;;;12399:21;;12908:5;;12424:36;;12423:58;12424:36;:10;:36;:::i;:::-;12423:58;;;;:::i;:::-;12502:16;;;;;-1:-1:-1;12048:494:0;;-1:-1:-1;;;;12048:494:0:o;16459:864::-;16584:7;16625:16;16635:5;16625:9;:16::i;:::-;16617:5;:24;16609:71;;;;-1:-1:-1;;;16609:71:0;;11467:2:1;16609:71:0;;;11449:21:1;11506:2;11486:18;;;11479:30;11545:34;11525:18;;;11518:62;11616:4;11596:18;;;11589:32;11638:19;;16609:71:0;11265:398:1;16609:71:0;16691:22;16716:13;16199:12;;;16119:100;16716:13;16691:38;;16740:19;16774:25;16828:9;16823:426;16847:14;16843:1;:18;16823:426;;;16883:31;16917:14;;;:11;:14;;;;;;;;;16883:48;;;;;;;;;-1:-1:-1;;;;;16883:48:0;;;;;;;;;;;;;;;;;;16950:28;16946:103;;17019:14;;;-1:-1:-1;16946:103:0;17088:5;-1:-1:-1;;;;;17067:26:0;:17;-1:-1:-1;;;;;17067:26:0;;17063:175;;;17133:5;17118:11;:20;17114:77;;;-1:-1:-1;17170:1:0;-1:-1:-1;17163:8:0;;-1:-1:-1;;;17163:8:0;17114:77;17209:13;;;;:::i;:::-;;;;17063:175;-1:-1:-1;16863:3:0;;;;:::i;:::-;;;;16823:426;;;-1:-1:-1;17259:56:0;;-1:-1:-1;;;17259:56:0;;22080:2:1;17259:56:0;;;22062:21:1;22119:2;22099:18;;;22092:30;22158:34;22138:18;;;22131:62;22229:16;22209:18;;;22202:44;22263:19;;17259:56:0;21878:410:1;33020:109:0;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;33070:51:::1;::::0;33078:10:::1;::::0;33099:21:::1;33070:51:::0;::::1;;;::::0;::::1;::::0;;;33099:21;33078:10;33070:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;33020:109::o:0;21402:177::-;21532:39;21549:4;21555:2;21559:7;21532:39;;;;;;;;;;;;:16;:39::i;33137:130::-;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;33228:30:::1;::::0;;;;33252:4:::1;33228:30;::::0;::::1;9764:74:1::0;-1:-1:-1;;;;;33201:14:0;::::1;::::0;::::1;::::0;33216:10:::1;::::0;33201:14;;33228:15:::1;::::0;9737:18:1;;33228:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33201:58;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;10557:55:1;;;33201:58:0::1;::::0;::::1;10539:74:1::0;10629:18;;;10622:34;10512:18;;33201:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33137:130:::0;:::o;32279:198::-;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;32399:8:::1;;32388;32372:13;16199:12:::0;;;16119:100;32372:13:::1;:24;;;;:::i;:::-;:35;32364:65;;;::::0;-1:-1:-1;;;32364:65:0;;17329:2:1;32364:65:0::1;::::0;::::1;17311:21:1::0;17368:2;17348:18;;;17341:30;17407:19;17387:18;;;17380:47;17444:18;;32364:65:0::1;17127:341:1::0;32364:65:0::1;32440:29;32450:8;32460;32440:9;:29::i;16225:228::-:0;16328:7;16369:13;16199:12;;;16119:100;16369:13;16361:5;:21;16353:69;;;;-1:-1:-1;;;16353:69:0;;13038:2:1;16353:69:0;;;13020:21:1;13077:2;13057:18;;;13050:30;13116:34;13096:18;;;13089:62;13187:5;13167:18;;;13160:33;13210:19;;16353:69:0;12836:399:1;16353:69:0;-1:-1:-1;16440:5:0;16225:228::o;32906:106::-;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;32981:23:::1;:13;32997:7:::0;;32981:23:::1;:::i;33536:164::-:0;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;33645:47:::1;33662:7;33670:8;33679:12;33645:16;:47::i;19060:124::-:0;19124:7;19151:20;19163:7;19151:11;:20::i;:::-;:25;;19060:124;-1:-1:-1;;19060:124:0:o;17832:258::-;17896:7;-1:-1:-1;;;;;17938:19:0;;17916:112;;;;-1:-1:-1;;;17916:112:0;;14617:2:1;17916:112:0;;;14599:21:1;14656:2;14636:18;;;14629:30;14695:34;14675:18;;;14668:62;14766:13;14746:18;;;14739:41;14797:19;;17916:112:0;14415:407:1;17916:112:0;-1:-1:-1;;;;;;18054:19:0;;;;;:12;:19;;;;;:27;;;;17832:258::o;7056:94::-;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;7121:21:::1;7139:1;7121:9;:21::i;33708:109::-:0;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;14600:26;;;;:17;:26;;;;;14593:33;33020:109::o;29532:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;29671:20:0;29683:7;29671:11;:20::i;19296:104::-;19352:13;19385:7;19378:14;;;;;:::i;30739:537::-;29350:9;29363:10;29350:23;29342:39;;;;-1:-1:-1;;;29342:39:0;;18006:2:1;29342:39:0;;;17988:21:1;18045:1;18025:18;;;18018:29;18083:5;18063:18;;;18056:33;18106:18;;29342:39:0;17804:326:1;29342:39:0;30858:13:::1;::::0;::::1;::::0;::::1;;;30857:14;:29:::0;::::1;;;-1:-1:-1::0;30876:10:0::1;::::0;::::1;;30875:11;30857:29;30849:55;;;::::0;-1:-1:-1;;;30849:55:0;;20982:2:1;30849:55:0::1;::::0;::::1;20964:21:1::0;21021:2;21001:18;;;20994:30;21060:15;21040:18;;;21033:43;21093:18;;30849:55:0::1;20780:337:1::0;30849:55:0::1;30934:1;30923:8;:12;30915:41;;;::::0;-1:-1:-1;;;30915:41:0;;21735:2:1;30915:41:0::1;::::0;::::1;21717:21:1::0;21774:2;21754:18;;;21747:30;21813:18;21793;;;21786:46;21849:18;;30915:41:0::1;21533:340:1::0;30915:41:0::1;30977:10;30967:21;::::0;;;:9:::1;:21;::::0;;;;:31;;30990:8;;30967:21;:31:::1;::::0;30990:8;;30967:31:::1;:::i;:::-;::::0;;;-1:-1:-1;31017:32:0::1;::::0;-1:-1:-1;31032:5:0;31039:8;31017:14:::1;:32::i;:::-;31009:57;;;::::0;-1:-1:-1;;;31009:57:0;;16213:2:1;31009:57:0::1;::::0;::::1;16195:21:1::0;16252:2;16232:18;;;16225:30;16291:15;16271:18;;;16264:43;16324:18;;31009:57:0::1;16011:337:1::0;31009:57:0::1;31096:10;31086:21;::::0;;;:9:::1;:21;::::0;;;;;:33;-1:-1:-1;31086:33:0::1;31077:68;;;::::0;-1:-1:-1;;;31077:68:0;;11870:2:1;31077:68:0::1;::::0;::::1;11852:21:1::0;11909:2;11889:18;;;11882:30;11948:23;11928:18;;;11921:51;11989:18;;31077:68:0::1;11668:345:1::0;31077:68:0::1;31191:3;31180:8;31164:13;16199:12:::0;;;16119:100;31164:13:::1;:24;;;;:::i;:::-;:30;31156:67;;;::::0;-1:-1:-1;;;31156:67:0;;20227:2:1;31156:67:0::1;::::0;::::1;20209:21:1::0;20266:2;20246:18;;;20239:30;20305:26;20285:18;;;20278:54;20349:18;;31156:67:0::1;20025:348:1::0;31156:67:0::1;31236:30;31246:10;31257:8;31236:9;:30::i;32699:93::-:0;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;32774:10:::1;::::0;;32760:24;;::::1;32774:10;::::0;;::::1;32773:11;32760:24;::::0;;32699:93::o;20697:311::-;-1:-1:-1;;;;;20815:24:0;;6424:10;20815:24;;20807:63;;;;-1:-1:-1;;;20807:63:0;;16555:2:1;20807:63:0;;;16537:21:1;16594:2;16574:18;;;16567:30;16633:28;16613:18;;;16606:56;16679:18;;20807:63:0;16353:350:1;20807:63:0;6424:10;20883:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;20883:42:0;;;;;;;;;;;;:53;;;;;;;;;;;;;20952:48;;10807:41:1;;;20883:42:0;;6424:10;20952:48;;10780:18:1;20952:48:0;;;;;;;20697:311;;:::o;33435:93::-;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;33497:23:::1;13668:19:::0;;13661:26;13600:95;21585:355;21744:28;21754:4;21760:2;21764:7;21744:9;:28::i;:::-;21805:48;21828:4;21834:2;21838:7;21847:5;21805:22;:48::i;:::-;21783:149;;;;-1:-1:-1;;;21783:149:0;;19093:2:1;21783:149:0;;;19075:21:1;19132:2;19112:18;;;19105:30;19171:34;19151:18;;;19144:62;19242:21;19222:18;;;19215:49;19281:19;;21783:149:0;18891:415:1;21783:149:0;21585:355;;;;:::o;31284:699::-;29350:9;29363:10;29350:23;29342:39;;;;-1:-1:-1;;;29342:39:0;;18006:2:1;29342:39:0;;;17988:21:1;18045:1;18025:18;;;18018:29;18083:5;18063:18;;;18056:33;18106:18;;29342:39:0;17804:326:1;29342:39:0;31415:13:::1;::::0;::::1;::::0;::::1;;;31407:50;;;::::0;-1:-1:-1;;;31407:50:0;;18740:2:1;31407:50:0::1;::::0;::::1;18722:21:1::0;18779:2;18759:18;;;18752:30;18818:26;18798:18;;;18791:54;18862:18;;31407:50:0::1;18538:348:1::0;31407:50:0::1;31477:10;::::0;::::1;;31476:11;31468:38;;;::::0;-1:-1:-1;;;31468:38:0;;13848:2:1;31468:38:0::1;::::0;::::1;13830:21:1::0;13887:2;13867:18;;;13860:30;13926:16;13906:18;;;13899:44;13960:18;;31468:38:0::1;13646:338:1::0;31468:38:0::1;31536:1;31525:8;:12;31517:41;;;::::0;-1:-1:-1;;;31517:41:0;;21735:2:1;31517:41:0::1;::::0;::::1;21717:21:1::0;21774:2;21754:18;;;21747:30;21813:18;21793;;;21786:46;21849:18;;31517:41:0::1;21533:340:1::0;31517:41:0::1;31586:10;31571:26;::::0;;;:14:::1;:26;::::0;;;;:36;;31599:8;;31571:26;:36:::1;::::0;31599:8;;31571:36:::1;:::i;:::-;::::0;;;-1:-1:-1;;31641:15:0::1;::::0;31669:9:::1;::::0;31641:24:::1;::::0;31657:8;;31641:24:::1;:::i;:::-;:37;;31632:55;;;::::0;-1:-1:-1;;;31632:55:0;;17675:2:1;31632:55:0::1;::::0;::::1;17657:21:1::0;17714:1;17694:18;;;17687:29;17752:5;17732:18;;;17725:33;17775:18;;31632:55:0::1;17473:326:1::0;31632:55:0::1;31710:37;31730:5;31737:8;31710:19;:37::i;:::-;31702:62;;;::::0;-1:-1:-1;;;31702:62:0;;16213:2:1;31702:62:0::1;::::0;::::1;16195:21:1::0;16252:2;16232:18;;;16225:30;16291:15;16271:18;;;16264:43;16324:18;;31702:62:0::1;16011:337:1::0;31702:62:0::1;31803:10;31788:26;::::0;;;:14:::1;:26;::::0;;;;;:38;-1:-1:-1;31788:38:0::1;31779:73;;;::::0;-1:-1:-1;;;31779:73:0;;11870:2:1;31779:73:0::1;::::0;::::1;11852:21:1::0;11909:2;11889:18;;;11882:30;11948:23;11928:18;;;11921:51;11989:18;;31779:73:0::1;11668:345:1::0;31779:73:0::1;31903:8;;31892;31876:13;16199:12:::0;;;16119:100;31876:13:::1;:24;;;;:::i;:::-;:35;31868:65;;;::::0;-1:-1:-1;;;31868:65:0;;17329:2:1;31868:65:0::1;::::0;::::1;17311:21:1::0;17368:2;17348:18;;;17341:30;17407:19;17387:18;;;17380:47;17444:18;;31868:65:0::1;17127:341:1::0;29707:478:0;29825:13;29878:16;29886:7;22037:12;;-1:-1:-1;22027:22:0;21946:111;29878:16;29856:113;;;;-1:-1:-1;;;29856:113:0;;15797:2:1;29856:113:0;;;15779:21:1;15836:2;15816:18;;;15809:30;15875:34;15855:18;;;15848:62;15946:17;15926:18;;;15919:45;15981:19;;29856:113:0;15595:411:1;29856:113:0;29984:23;30010;30025:7;30010:14;:23::i;:::-;29984:49;;30090:1;30070:9;30064:23;:27;:113;;;;;;;;;;;;;;;;;30135:9;30118:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;30064:113;30044:133;29707:478;-1:-1:-1;;;29707:478:0:o;32609:82::-;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;32671:4:::1;:12:::0;32609:82::o;7156:229::-;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;-1:-1:-1;;;;;7259:22:0;::::1;7237:110;;;::::0;-1:-1:-1;;;7237:110:0;;12220:2:1;7237:110:0::1;::::0;::::1;12202:21:1::0;12259:2;12239:18;;;12232:30;12298:34;12278:18;;;12271:62;12369:8;12349:18;;;12342:36;12395:19;;7237:110:0::1;12018:402:1::0;7237:110:0::1;7358:19;7368:8;7358:9;:19::i;32800:98::-:0;6883:7;6910:6;-1:-1:-1;;;;;6910:6:0;6424:10;6970:23;6962:68;;;;-1:-1:-1;;;6962:68:0;;15436:2:1;6962:68:0;;;15418:21:1;;;15455:18;;;15448:30;15514:34;15494:18;;;15487:62;15566:18;;6962:68:0;15234:356:1;6962:68:0;32877:13:::1;::::0;;32860:30;;::::1;32877:13;::::0;;;::::1;;;32876:14;32860:30:::0;;::::1;;::::0;;32800:98::o;11778:215::-;11880:4;11904:41;;;11919:26;11904:41;;:81;;-1:-1:-1;9543:25:0;9528:40;;;;11949:36;9369:207;13192:332;12908:5;13295:33;;;;;13287:88;;;;-1:-1:-1;;;13287:88:0;;21324:2:1;13287:88:0;;;21306:21:1;21363:2;21343:18;;;21336:30;21402:34;21382:18;;;21375:62;21473:12;21453:18;;;21446:40;21503:19;;13287:88:0;21122:406:1;13287:88:0;-1:-1:-1;;;;;13394:22:0;;13386:60;;;;-1:-1:-1;;;13386:60:0;;23325:2:1;13386:60:0;;;23307:21:1;23364:2;23344:18;;;23337:30;23403:27;23383:18;;;23376:55;23448:18;;13386:60:0;23123:349:1;13386:60:0;13481:35;;;;;;;;;-1:-1:-1;;;;;13481:35:0;;;;;;;;;;;;;;;;;13459:57;;;;;:19;:57;13192:332::o;25002:196::-;25117:24;;;;:15;:24;;;;;;:29;;;;-1:-1:-1;;;;;25117:29:0;;;;;;;;;25162:28;;25117:24;;25162:28;;;;;;;25002:196;;;:::o;23456:1540::-;23571:35;23609:20;23621:7;23609:11;:20::i;:::-;23684:18;;23571:58;;-1:-1:-1;23642:22:0;;-1:-1:-1;;;;;23668:34:0;6424:10;-1:-1:-1;;;;;23668:34:0;;:87;;;-1:-1:-1;6424:10:0;23719:20;23731:7;23719:11;:20::i;:::-;-1:-1:-1;;;;;23719:36:0;;23668:87;:154;;;-1:-1:-1;23789:18:0;;23772:50;;6424:10;21014:214;:::i;23772:50::-;23642:181;;23858:17;23836:117;;;;-1:-1:-1;;;23836:117:0;;16910:2:1;23836:117:0;;;16892:21:1;16949:2;16929:18;;;16922:30;16988:34;16968:18;;;16961:62;17059:20;17039:18;;;17032:48;17097:19;;23836:117:0;16708:414:1;23836:117:0;24010:4;-1:-1:-1;;;;;23988:26:0;:13;:18;;;-1:-1:-1;;;;;23988:26:0;;23966:114;;;;-1:-1:-1;;;23966:114:0;;15029:2:1;23966:114:0;;;15011:21:1;15068:2;15048:18;;;15041:30;15107:34;15087:18;;;15080:62;15178:8;15158:18;;;15151:36;15204:19;;23966:114:0;14827:402:1;23966:114:0;-1:-1:-1;;;;;24099:16:0;;24091:66;;;;-1:-1:-1;;;24091:66:0;;13442:2:1;24091:66:0;;;13424:21:1;13481:2;13461:18;;;13454:30;13520:34;13500:18;;;13493:62;13591:7;13571:18;;;13564:35;13616:19;;24091:66:0;13240:401:1;24091:66:0;24224:49;24241:1;24245:7;24254:13;:18;;;24224:8;:49::i;:::-;-1:-1:-1;;;;;24286:18:0;;;;;;:12;:18;;;;;:31;;24316:1;;24286:18;:31;;24316:1;;24286:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24328:16:0;;-1:-1:-1;24328:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;24328:16:0;;:29;;-1:-1:-1;;24328:29:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24391:43:0;;;;;;;;-1:-1:-1;;;;;24391:43:0;;;;;;24417:15;24391:43;;;;;;;;;-1:-1:-1;24368:20:0;;;:11;:20;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;24581:11;24380:7;-1:-1:-1;24581:11:0;:::i;:::-;24648:1;24607:24;;;:11;:24;;;;;:29;24559:33;;-1:-1:-1;;;;;;24607:29:0;24603:288;;24671:20;24679:11;22037:12;;-1:-1:-1;22027:22:0;21946:111;24671:20;24667:213;;;24739:125;;;;;;;;24776:18;;-1:-1:-1;;;;;24739:125:0;;;;;;24817:28;;;;24739:125;;;;;;;;;;-1:-1:-1;24712:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;24667:213;24927:7;24923:2;-1:-1:-1;;;;;24908:27:0;24917:4;-1:-1:-1;;;;;24908:27:0;;;;;;;;;;;24946:42;23560:1436;;;23456:1540;;;:::o;22065:104::-;22134:27;22144:2;22148:8;22134:27;;;;;;;;;;;;:9;:27::i;14019:390::-;12908:5;14171:33;;;;;14163:88;;;;-1:-1:-1;;;14163:88:0;;21324:2:1;14163:88:0;;;21306:21:1;21363:2;21343:18;;;21336:30;21402:34;21382:18;;;21375:62;21473:12;21453:18;;;21446:40;21503:19;;14163:88:0;21122:406:1;14163:88:0;-1:-1:-1;;;;;14270:22:0;;14262:62;;;;-1:-1:-1;;;14262:62:0;;19871:2:1;14262:62:0;;;19853:21:1;19910:2;19890:18;;;19883:30;19949:29;19929:18;;;19922:57;19996:18;;14262:62:0;19669:351:1;14262:62:0;14366:35;;;;;;;;-1:-1:-1;;;;;14366:35:0;;;;;;;;;;;;;;;;-1:-1:-1;14337:26:0;;;:17;:26;;;;;;:64;;;;;;;;;;;;;;14019:390::o;18372:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;18507:16:0;18515:7;22037:12;;-1:-1:-1;22027:22:0;21946:111;18507:16;18499:71;;;;-1:-1:-1;;;18499:71:0;;12627:2:1;18499:71:0;;;12609:21:1;12666:2;12646:18;;;12639:30;12705:34;12685:18;;;12678:62;12776:12;12756:18;;;12749:40;12806:19;;18499:71:0;12425:406:1;18499:71:0;18583:26;18635:12;18624:7;:23;18620:103;;18685:22;18695:12;18685:7;:22;:::i;:::-;:26;;18710:1;18685:26;:::i;:::-;18664:47;;18620:103;18755:7;18735:242;18772:18;18764:4;:26;18735:242;;18815:31;18849:17;;;:11;:17;;;;;;;;;18815:51;;;;;;;;;-1:-1:-1;;;;;18815:51:0;;;;;;;;;;;;;;;;;;18885:28;18881:85;;18941:9;18372:682;-1:-1:-1;;;;18372:682:0:o;18881:85::-;-1:-1:-1;18792:6:0;;;;:::i;:::-;;;;18735:242;;;-1:-1:-1;18989:57:0;;-1:-1:-1;;;18989:57:0;;22495:2:1;18989:57:0;;;22477:21:1;22534:2;22514:18;;;22507:30;22573:34;22553:18;;;22546:62;22644:17;22624:18;;;22617:45;22679:19;;18989:57:0;22293:411:1;7393:173:0;7449:16;7468:6;;-1:-1:-1;;;;;7485:17:0;;;;;;;;;;7518:40;;7468:6;;;;;;;7518:40;;7449:16;7518:40;7438:128;7393:173;:::o;30197:258::-;30286:4;30303:12;30345:10;30369:19;:8;:17;:19::i;:::-;30328:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30318:72;;;;;;30303:87;;30409:37;30428:5;30435:4;;30441;30409:18;:37::i;:::-;30401:45;30197:258;-1:-1:-1;;;;30197:258:0:o;26107:985::-;26262:4;-1:-1:-1;;;;;26283:13:0;;2436:19;:23;26279:806;;26336:175;;;;;-1:-1:-1;;;;;26336:36:0;;;;;:175;;6424:10;;26430:4;;26457:7;;26487:5;;26336:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26336:175:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26315:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26698:13:0;;26694:321;;26741:109;;-1:-1:-1;;;26741:109:0;;19093:2:1;26741:109:0;;;19075:21:1;19132:2;19112:18;;;19105:30;19171:34;19151:18;;;19144:62;19242:21;19222:18;;;19215:49;19281:19;;26741:109:0;18891:415:1;26694:321:0;26965:6;26959:13;26950:6;26946:2;26942:15;26935:38;26315:715;26575:55;;26585:45;26575:55;;-1:-1:-1;26568:62:0;;26279:806;-1:-1:-1;27069:4:0;26107:985;;;;;;:::o;30463:264::-;30557:4;30574:12;30616:10;30641:19;:8;:17;:19::i;:::-;30599:62;;;;;;;;;:::i;19406:468::-;19524:13;19577:16;19585:7;22037:12;;-1:-1:-1;22027:22:0;21946:111;19577:16;19555:113;;;;-1:-1:-1;;;19555:113:0;;15797:2:1;19555:113:0;;;15779:21:1;15836:2;15816:18;;;15809:30;15875:34;15855:18;;;15848:62;15946:17;15926:18;;;15919:45;15981:19;;19555:113:0;15595:411:1;19555:113:0;19681:21;19705:10;:8;:10::i;:::-;19681:34;;19770:1;19752:7;19746:21;:25;:120;;;;;;;;;;;;;;;;;19815:7;19824:18;:7;:16;:18::i;:::-;19798:45;;;;;;;;;:::i;22175:1275::-;22321:12;;-1:-1:-1;;;;;22352:16:0;;22344:62;;;;-1:-1:-1;;;22344:62:0;;20580:2:1;22344:62:0;;;20562:21:1;20619:2;20599:18;;;20592:30;20658:34;20638:18;;;20631:62;20729:3;20709:18;;;20702:31;20750:19;;22344:62:0;20378:397:1;22344:62:0;22426:21;22434:12;22037;;-1:-1:-1;22027:22:0;21946:111;22426:21;22425:22;22417:64;;;;-1:-1:-1;;;22417:64:0;;19513:2:1;22417:64:0;;;19495:21:1;19552:2;19532:18;;;19525:30;19591:31;19571:18;;;19564:59;19640:18;;22417:64:0;19311:353:1;22417:64:0;22512:12;22500:8;:24;;22492:71;;;;-1:-1:-1;;;22492:71:0;;23679:2:1;22492:71:0;;;23661:21:1;23718:2;23698:18;;;23691:30;23757:34;23737:18;;;23730:62;23828:4;23808:18;;;23801:32;23850:19;;22492:71:0;23477:398:1;22492:71:0;-1:-1:-1;;;;;22683:16:0;;22650:30;22683:16;;;:12;:16;;;;;;;;;22650:49;;;;;;;;;;;;;;;;;;;;;;;;;;;22729:135;;;;;;;;22755:19;;22650:49;;22729:135;;;22755:39;;22785:8;;22755:39;:::i;:::-;22729:135;;;;;;22844:8;22809:11;:24;;;:44;;;;:::i;:::-;22729:135;;;;;;;-1:-1:-1;;;;;22710:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;22903:43;;;;;;;;;;;22929:15;22903:43;;;;;;;;22875:25;;;:11;:25;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22887:12;;23007:325;23031:8;23027:1;:12;23007:325;;;23066:38;;23091:12;;-1:-1:-1;;;;;23066:38:0;;;23083:1;;23066:38;;23083:1;;23066:38;23145:59;23176:1;23180:2;23184:12;23198:5;23145:22;:59::i;:::-;23119:172;;;;-1:-1:-1;;;23119:172:0;;19093:2:1;23119:172:0;;;19075:21:1;19132:2;19112:18;;;19105:30;19171:34;19151:18;;;19144:62;19242:21;19222:18;;;19215:49;19281:19;;23119:172:0;18891:415:1;23119:172:0;23306:14;;;;:::i;:::-;;;;23041:3;;;;;:::i;:::-;;;;23007:325;;;-1:-1:-1;23344:12:0;:27;;;23382:60;21585:355;7738:656;7794:13;7948:10;7944:53;;-1:-1:-1;;7975:10:0;;;;;;;;;;;;;;;;;;7738:656::o;7944:53::-;8022:5;8007:12;8063:78;8070:9;;8063:78;;8096:8;;;;:::i;:::-;;-1:-1:-1;8119:10:0;;-1:-1:-1;8127:2:0;8119:10;;:::i;:::-;;;8063:78;;;8151:19;8183:6;8173:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8173:17:0;;8151:39;;8201:154;8208:10;;8201:154;;8235:11;8245:1;8235:11;;:::i;:::-;;-1:-1:-1;8304:10:0;8312:2;8304:5;:10;:::i;:::-;8291:24;;:2;:24;:::i;:::-;8278:39;;8261:6;8268;8261:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;8332:11:0;8341:2;8332:11;;:::i;:::-;;;8201:154;;27455:190;27580:4;27633;27604:25;27617:5;27624:4;27604:12;:25::i;:::-;:33;;27455:190;-1:-1:-1;;;;27455:190:0:o;32485:114::-;32545:13;32578;32571:20;;;;;:::i;27651:549::-;27761:7;27809:4;27761:7;27824:339;27848:5;:12;27844:1;:16;27824:339;;;27882:20;27905:5;27911:1;27905:8;;;;;;;;:::i;:::-;;;;;;;27882:31;;27948:12;27932;:28;27928:224;;28303:13;28358:15;;;28394:4;28387:15;;;28441:4;28425:21;;27981:57;;27928:224;;;28303:13;28358:15;;;28394:4;28387:15;;;28441:4;28425:21;;28079:57;;27928:224;-1:-1:-1;27862:3:0;;;;:::i;:::-;;;;27824:339;;;-1:-1:-1;28180:12:0;27651:549;-1:-1:-1;;;27651:549:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:179:1;81:20;;141:26;130:38;;120:49;;110:77;;183:1;180;173:12;110:77;14:179;;;:::o;198:247::-;257:6;310:2;298:9;289:7;285:23;281:32;278:52;;;326:1;323;316:12;278:52;365:9;352:23;384:31;409:5;384:31;:::i;450:388::-;518:6;526;579:2;567:9;558:7;554:23;550:32;547:52;;;595:1;592;585:12;547:52;634:9;621:23;653:31;678:5;653:31;:::i;:::-;703:5;-1:-1:-1;760:2:1;745:18;;732:32;773:33;732:32;773:33;:::i;:::-;825:7;815:17;;;450:388;;;;;:::o;843:456::-;920:6;928;936;989:2;977:9;968:7;964:23;960:32;957:52;;;1005:1;1002;995:12;957:52;1044:9;1031:23;1063:31;1088:5;1063:31;:::i;:::-;1113:5;-1:-1:-1;1170:2:1;1155:18;;1142:32;1183:33;1142:32;1183:33;:::i;:::-;843:456;;1235:7;;-1:-1:-1;;;1289:2:1;1274:18;;;;1261:32;;843:456::o;1304:1167::-;1399:6;1407;1415;1423;1476:3;1464:9;1455:7;1451:23;1447:33;1444:53;;;1493:1;1490;1483:12;1444:53;1532:9;1519:23;1551:31;1576:5;1551:31;:::i;:::-;1601:5;-1:-1:-1;1625:2:1;1664:18;;;1651:32;1692:33;1651:32;1692:33;:::i;:::-;1744:7;-1:-1:-1;1798:2:1;1783:18;;1770:32;;-1:-1:-1;1853:2:1;1838:18;;1825:32;1876:18;1906:14;;;1903:34;;;1933:1;1930;1923:12;1903:34;1971:6;1960:9;1956:22;1946:32;;2016:7;2009:4;2005:2;2001:13;1997:27;1987:55;;2038:1;2035;2028:12;1987:55;2074:2;2061:16;2096:2;2092;2089:10;2086:36;;;2102:18;;:::i;:::-;2144:112;2252:2;2183:66;2176:4;2172:2;2168:13;2164:86;2160:95;2144:112;:::i;:::-;2131:125;;2279:2;2272:5;2265:17;2319:7;2314:2;2309;2305;2301:11;2297:20;2294:33;2291:53;;;2340:1;2337;2330:12;2291:53;2395:2;2390;2386;2382:11;2377:2;2370:5;2366:14;2353:45;2439:1;2434:2;2429;2422:5;2418:14;2414:23;2407:34;;2460:5;2450:15;;;;;1304:1167;;;;;;;:::o;2476:416::-;2541:6;2549;2602:2;2590:9;2581:7;2577:23;2573:32;2570:52;;;2618:1;2615;2608:12;2570:52;2657:9;2644:23;2676:31;2701:5;2676:31;:::i;:::-;2726:5;-1:-1:-1;2783:2:1;2768:18;;2755:32;2825:15;;2818:23;2806:36;;2796:64;;2856:1;2853;2846:12;2897:315;2965:6;2973;3026:2;3014:9;3005:7;3001:23;2997:32;2994:52;;;3042:1;3039;3032:12;2994:52;3081:9;3068:23;3100:31;3125:5;3100:31;:::i;:::-;3150:5;3202:2;3187:18;;;;3174:32;;-1:-1:-1;;;2897:315:1:o;3217:319::-;3284:6;3292;3345:2;3333:9;3324:7;3320:23;3316:32;3313:52;;;3361:1;3358;3351:12;3313:52;3400:9;3387:23;3419:31;3444:5;3419:31;:::i;:::-;3469:5;-1:-1:-1;3493:37:1;3526:2;3511:18;;3493:37;:::i;:::-;3483:47;;3217:319;;;;;:::o;3541:180::-;3600:6;3653:2;3641:9;3632:7;3628:23;3624:32;3621:52;;;3669:1;3666;3659:12;3621:52;-1:-1:-1;3692:23:1;;3541:180;-1:-1:-1;3541:180:1:o;3726:245::-;3784:6;3837:2;3825:9;3816:7;3812:23;3808:32;3805:52;;;3853:1;3850;3843:12;3805:52;3892:9;3879:23;3911:30;3935:5;3911:30;:::i;3976:249::-;4045:6;4098:2;4086:9;4077:7;4073:23;4069:32;4066:52;;;4114:1;4111;4104:12;4066:52;4146:9;4140:16;4165:30;4189:5;4165:30;:::i;4497:592::-;4568:6;4576;4629:2;4617:9;4608:7;4604:23;4600:32;4597:52;;;4645:1;4642;4635:12;4597:52;4685:9;4672:23;4714:18;4755:2;4747:6;4744:14;4741:34;;;4771:1;4768;4761:12;4741:34;4809:6;4798:9;4794:22;4784:32;;4854:7;4847:4;4843:2;4839:13;4835:27;4825:55;;4876:1;4873;4866:12;4825:55;4916:2;4903:16;4942:2;4934:6;4931:14;4928:34;;;4958:1;4955;4948:12;4928:34;5003:7;4998:2;4989:6;4985:2;4981:15;4977:24;4974:37;4971:57;;;5024:1;5021;5014:12;4971:57;5055:2;5047:11;;;;;5077:6;;-1:-1:-1;4497:592:1;;-1:-1:-1;;;;4497:592:1:o;5279:184::-;5349:6;5402:2;5390:9;5381:7;5377:23;5373:32;5370:52;;;5418:1;5415;5408:12;5370:52;-1:-1:-1;5441:16:1;;5279:184;-1:-1:-1;5279:184:1:o;5468:387::-;5544:6;5552;5560;5613:2;5601:9;5592:7;5588:23;5584:32;5581:52;;;5629:1;5626;5619:12;5581:52;5665:9;5652:23;5642:33;;5725:2;5714:9;5710:18;5697:32;5738:31;5763:5;5738:31;:::i;:::-;5788:5;-1:-1:-1;5812:37:1;5845:2;5830:18;;5812:37;:::i;:::-;5802:47;;5468:387;;;;;:::o;5860:248::-;5928:6;5936;5989:2;5977:9;5968:7;5964:23;5960:32;5957:52;;;6005:1;6002;5995:12;5957:52;-1:-1:-1;;6028:23:1;;;6098:2;6083:18;;;6070:32;;-1:-1:-1;5860:248:1:o;6113:1093::-;6215:6;6223;6231;6284:2;6272:9;6263:7;6259:23;6255:32;6252:52;;;6300:1;6297;6290:12;6252:52;6336:9;6323:23;6313:33;;6365:2;6414;6403:9;6399:18;6386:32;6376:42;;6469:2;6458:9;6454:18;6441:32;6492:18;6533:2;6525:6;6522:14;6519:34;;;6549:1;6546;6539:12;6519:34;6587:6;6576:9;6572:22;6562:32;;6632:7;6625:4;6621:2;6617:13;6613:27;6603:55;;6654:1;6651;6644:12;6603:55;6690:2;6677:16;6712:2;6708;6705:10;6702:36;;;6718:18;;:::i;:::-;6764:2;6761:1;6757:10;6747:20;;6787:28;6811:2;6807;6803:11;6787:28;:::i;:::-;6849:15;;;6880:12;;;;6912:11;;;6942;;;6938:20;;6935:33;-1:-1:-1;6932:53:1;;;6981:1;6978;6971:12;6932:53;7003:1;6994:10;;7013:163;7027:2;7024:1;7021:9;7013:163;;;7084:17;;7072:30;;7045:1;7038:9;;;;;7122:12;;;;7154;;7013:163;;;7017:3;7195:5;7185:15;;;;;;;;6113:1093;;;;;:::o;7211:316::-;7252:3;7290:5;7284:12;7317:6;7312:3;7305:19;7333:63;7389:6;7382:4;7377:3;7373:14;7366:4;7359:5;7355:16;7333:63;:::i;:::-;7441:2;7429:15;7446:66;7425:88;7416:98;;;;7516:4;7412:109;;7211:316;-1:-1:-1;;7211:316:1:o;7532:577::-;7843:66;7834:6;7830:2;7826:15;7822:88;7817:3;7810:101;7941:13;7936:2;7931:3;7927:12;7920:35;7792:3;7984:6;7978:13;8000:62;8055:6;8050:2;8045:3;8041:12;8034:4;8026:6;8022:17;8000:62;:::i;:::-;8082:16;;;;8100:2;8078:25;;7532:577;-1:-1:-1;;;7532:577:1:o;8114:576::-;8425:66;8416:6;8412:2;8408:15;8404:88;8399:3;8392:101;8523:12;8518:2;8513:3;8509:12;8502:34;8374:3;8565:6;8559:13;8581:62;8636:6;8631:2;8626:3;8622:12;8615:4;8607:6;8603:17;8581:62;:::i;:::-;8663:16;;;;8681:2;8659:25;;8114:576;-1:-1:-1;;;8114:576:1:o;8695:470::-;8874:3;8912:6;8906:13;8928:53;8974:6;8969:3;8962:4;8954:6;8950:17;8928:53;:::i;:::-;9044:13;;9003:16;;;;9066:57;9044:13;9003:16;9100:4;9088:17;;9066:57;:::i;:::-;9139:20;;8695:470;-1:-1:-1;;;;8695:470:1:o;9170:443::-;9402:3;9440:6;9434:13;9456:53;9502:6;9497:3;9490:4;9482:6;9478:17;9456:53;:::i;:::-;9570:7;9531:16;;9556:22;;;-1:-1:-1;9605:1:1;9594:13;;9170:443;-1:-1:-1;9170:443:1:o;9849:511::-;10043:4;-1:-1:-1;;;;;10153:2:1;10145:6;10141:15;10130:9;10123:34;10205:2;10197:6;10193:15;10188:2;10177:9;10173:18;10166:43;;10245:6;10240:2;10229:9;10225:18;10218:34;10288:3;10283:2;10272:9;10268:18;10261:31;10309:45;10349:3;10338:9;10334:19;10326:6;10309:45;:::i;:::-;10301:53;9849:511;-1:-1:-1;;;;;;9849:511:1:o;11041:219::-;11190:2;11179:9;11172:21;11153:4;11210:44;11250:2;11239:9;11235:18;11227:6;11210:44;:::i;24452:334::-;24523:2;24517:9;24579:2;24569:13;;24584:66;24565:86;24553:99;;24682:18;24667:34;;24703:22;;;24664:62;24661:88;;;24729:18;;:::i;:::-;24765:2;24758:22;24452:334;;-1:-1:-1;24452:334:1:o;24791:253::-;24831:3;24859:34;24920:2;24917:1;24913:10;24950:2;24947:1;24943:10;24981:3;24977:2;24973:12;24968:3;24965:21;24962:47;;;24989:18;;:::i;25049:128::-;25089:3;25120:1;25116:6;25113:1;25110:13;25107:39;;;25126:18;;:::i;:::-;-1:-1:-1;25162:9:1;;25049:128::o;25182:120::-;25222:1;25248;25238:35;;25253:18;;:::i;:::-;-1:-1:-1;25287:9:1;;25182:120::o;25307:228::-;25347:7;25473:1;25405:66;25401:74;25398:1;25395:81;25390:1;25383:9;25376:17;25372:105;25369:131;;;25480:18;;:::i;:::-;-1:-1:-1;25520:9:1;;25307:228::o;25540:246::-;25580:4;25609:34;25693:10;;;;25663;;25715:12;;;25712:38;;;25730:18;;:::i;:::-;25767:13;;25540:246;-1:-1:-1;;;25540:246:1:o;25791:125::-;25831:4;25859:1;25856;25853:8;25850:34;;;25864:18;;:::i;:::-;-1:-1:-1;25901:9:1;;25791:125::o;25921:258::-;25993:1;26003:113;26017:6;26014:1;26011:13;26003:113;;;26093:11;;;26087:18;26074:11;;;26067:39;26039:2;26032:10;26003:113;;;26134:6;26131:1;26128:13;26125:48;;;-1:-1:-1;;26169:1:1;26151:16;;26144:27;25921:258::o;26184:196::-;26223:3;26251:5;26241:39;;26260:18;;:::i;:::-;-1:-1:-1;26307:66:1;26296:78;;26184:196::o;26385:437::-;26464:1;26460:12;;;;26507;;;26528:61;;26582:4;26574:6;26570:17;26560:27;;26528:61;26635:2;26627:6;26624:14;26604:18;26601:38;26598:218;;;26672:77;26669:1;26662:88;26773:4;26770:1;26763:15;26801:4;26798:1;26791:15;26598:218;;26385:437;;;:::o;26827:195::-;26866:3;26897:66;26890:5;26887:77;26884:103;;;26967:18;;:::i;:::-;-1:-1:-1;27014:1:1;27003:13;;26827:195::o;27027:112::-;27059:1;27085;27075:35;;27090:18;;:::i;:::-;-1:-1:-1;27124:9:1;;27027:112::o;27144:184::-;27196:77;27193:1;27186:88;27293:4;27290:1;27283:15;27317:4;27314:1;27307:15;27333:184;27385:77;27382:1;27375:88;27482:4;27479:1;27472:15;27506:4;27503:1;27496:15;27522:184;27574:77;27571:1;27564:88;27671:4;27668:1;27661:15;27695:4;27692:1;27685:15;27711:184;27763:77;27760:1;27753:88;27860:4;27857:1;27850:15;27884:4;27881:1;27874:15;27900:154;-1:-1:-1;;;;;27979:5:1;27975:54;27968:5;27965:65;27955:93;;28044:1;28041;28034:12;28059:177;28144:66;28137:5;28133:78;28126:5;28123:89;28113:117;;28226:1;28223;28216:12

Swarm Source

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