ETH Price: $3,481.06 (+7.21%)
Gas: 11 Gwei

Token

Kevinmon (KEVIN)
 

Overview

Max Total Supply

359 KEVIN

Holders

55

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 KEVIN
0x20fe10b966708b772e912458932a1206aa8d7e40
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:
Kevinmon

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-01
*/

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

// SPDX-License-Identifier: UNLICENSED

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


abstract contract Ownable is Context {
    address private _owner;

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


    constructor() {
        _transferOwnership(_msgSender());
    }


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


    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }


    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }


    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }


    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";


    function toString(uint256 value) internal pure returns (string memory) {

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


    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }


    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)



/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)



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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)



/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// File contracts/ERC721A.sol


// Creator: Chiru Labs


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    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');
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    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');

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

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public 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);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    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'
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        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);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(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;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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


// File contracts/test.sol


contract Kevinmon is ERC721A, Ownable {

    string public baseURI = "";
    string public contractURI = "";
    string public constant baseExtension = ".json";
    address public constant proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

    uint256 public constant MAX_PER_TX = 10;
    uint256 public constant MAX_SUPPLY = 6666;
    uint256 public constant price = 0.03 ether;

    bool public paused = true;

    constructor() ERC721A("Kevinmon", "KEVIN") {}

    /**
     * @notice Mint a Kevinmon for 0.03 each (Max 10 per transaction - 0.3)
     *
     * @dev Mints Kevinmon NFT
     *
     * @param  _amount         The amount of Kevinmons to mint
     *
     */
    function mint(uint256 _amount) external payable {
        address _caller = _msgSender();
        require(!paused, "Paused");
        require(MAX_SUPPLY >= totalSupply() + _amount, "Exceeds max supply");
        require(_amount > 0, "No 0 mints");

        require(MAX_PER_TX >= _amount , "Excess max per paid tx");
        require(_amount * price == msg.value, "Invalid funds provided");

        _safeMint(_caller, _amount);
    }

    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = _msgSender().call{value: balance}("");
        require(success, "Failed to send");
    }

    function setupOS() external onlyOwner {
        _safeMint(_msgSender(), 1);
    }

    function pause(bool _state) external onlyOwner {
        paused = _state;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function setContractURI(string memory _contractURI) external onlyOwner {
        contractURI = _contractURI;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              baseExtension
            )
        ) : "";
    }
}

contract OwnableDelegateProxy { }
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setupOS","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600080805560a0604081905260808290526200001f916008919062000138565b50604080516020810191829052600090819052620000409160099162000138565b50600a805460ff191660011790553480156200005b57600080fd5b50604080518082018252600881526725b2bb34b736b7b760c11b60208083019182528351808501909452600584526425a2ab24a760d91b908401528151919291620000a99160019162000138565b508051620000bf90600290602084019062000138565b505050620000dc620000d6620000e260201b60201c565b620000e6565b6200021b565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014690620001de565b90600052602060002090601f0160209004810192826200016a5760008555620001b5565b82601f106200018557805160ff1916838001178555620001b5565b82800160010185558215620001b5579182015b82811115620001b557825182559160200191906001019062000198565b50620001c3929150620001c7565b5090565b5b80821115620001c35760008155600101620001c8565b600281046001821680620001f357607f821691505b602082108114156200021557634e487b7160e01b600052602260045260246000fd5b50919050565b612625806200022b6000396000f3fe6080604052600436106101ee5760003560e01c80636c0360eb1161010d578063a22cb465116100a0578063cd7c03261161006f578063cd7c032614610521578063e8a3d48514610536578063e985e9c51461054b578063f2fde38b1461056b578063f43a22dc1461058b576101ee565b8063a22cb465146104ac578063b88d4fde146104cc578063c6682862146104ec578063c87b56dd14610501576101ee565b8063938e3d7b116100dc578063938e3d7b1461044f57806395d89b411461046f578063a035b1fe14610484578063a0712d6814610499576101ee565b80636c0360eb146103f057806370a0823114610405578063715018a6146104255780638da5cb5b1461043a576101ee565b806332cb6b0c1161018557806355f804b31161015457806355f804b3146103865780635c975abb146103a65780636352211e146103bb578063698982ba146103db576101ee565b806332cb6b0c1461031c5780633ccfd60b1461033157806342842e0e146103465780634f6ccce714610366576101ee565b8063095ea7b3116101c1578063095ea7b31461029a57806318160ddd146102ba57806323b872dd146102dc5780632f745c59146102fc576101ee565b806301ffc9a7146101f357806302329a291461022957806306fdde031461024b578063081812fc1461026d575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611c09565b6105a0565b6040516102209190611dfd565b60405180910390f35b34801561023557600080fd5b50610249610244366004611bef565b610603565b005b34801561025757600080fd5b5061026061065e565b6040516102209190611e08565b34801561027957600080fd5b5061028d610288366004611ca3565b6106f0565b6040516102209190611db6565b3480156102a657600080fd5b506102496102b5366004611bc4565b610733565b3480156102c657600080fd5b506102cf6107cc565b6040516102209190612433565b3480156102e857600080fd5b506102496102f7366004611ad3565b6107d2565b34801561030857600080fd5b506102cf610317366004611bc4565b6107dd565b34801561032857600080fd5b506102cf6108d9565b34801561033d57600080fd5b506102496108df565b34801561035257600080fd5b50610249610361366004611ad3565b6109a6565b34801561037257600080fd5b506102cf610381366004611ca3565b6109c1565b34801561039257600080fd5b506102496103a1366004611c5d565b6109ed565b3480156103b257600080fd5b50610213610a3f565b3480156103c757600080fd5b5061028d6103d6366004611ca3565b610a48565b3480156103e757600080fd5b50610249610a5a565b3480156103fc57600080fd5b50610260610aad565b34801561041157600080fd5b506102cf610420366004611a78565b610b3b565b34801561043157600080fd5b50610249610b88565b34801561044657600080fd5b5061028d610bd1565b34801561045b57600080fd5b5061024961046a366004611c5d565b610be0565b34801561047b57600080fd5b50610260610c32565b34801561049057600080fd5b506102cf610c41565b6102496104a7366004611ca3565b610c4c565b3480156104b857600080fd5b506102496104c7366004611b90565b610d2a565b3480156104d857600080fd5b506102496104e7366004611b13565b610df8565b3480156104f857600080fd5b50610260610e31565b34801561050d57600080fd5b5061026061051c366004611ca3565b610e52565b34801561052d57600080fd5b5061028d610ef5565b34801561054257600080fd5b50610260610f0d565b34801561055757600080fd5b50610213610566366004611a9b565b610f1a565b34801561057757600080fd5b50610249610586366004611a78565b610fdc565b34801561059757600080fd5b506102cf61104d565b60006001600160e01b031982166380ac58cd60e01b14806105d157506001600160e01b03198216635b5e139f60e01b145b806105ec57506001600160e01b0319821663780e9d6360e01b145b806105fb57506105fb82611052565b90505b919050565b61060b61106b565b6001600160a01b031661061c610bd1565b6001600160a01b03161461064b5760405162461bcd60e51b815260040161064290612132565b60405180910390fd5b600a805460ff1916911515919091179055565b60606001805461066d90612518565b80601f016020809104026020016040519081016040528092919081815260200182805461069990612518565b80156106e65780601f106106bb576101008083540402835291602001916106e6565b820191906000526020600020905b8154815290600101906020018083116106c957829003601f168201915b5050505050905090565b60006106fb8261106f565b6107175760405162461bcd60e51b8152600401610642906123e6565b506000908152600560205260409020546001600160a01b031690565b600061073e82610a48565b9050806001600160a01b0316836001600160a01b031614156107725760405162461bcd60e51b815260040161064290612220565b806001600160a01b031661078461106b565b6001600160a01b031614806107a057506107a08161056661106b565b6107bc5760405162461bcd60e51b815260040161064290611fe9565b6107c7838383611076565b505050565b60005490565b6107c78383836110d2565b60006107e883610b3b565b82106108065760405162461bcd60e51b815260040161064290611e1b565b60006108106107cc565b905060008060005b838110156108ba576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561086b57805192505b876001600160a01b0316836001600160a01b031614156108a75786841415610899575093506108d392505050565b836108a381612553565b9450505b50806108b281612553565b915050610818565b5060405162461bcd60e51b815260040161064290612398565b92915050565b611a0a81565b6108e761106b565b6001600160a01b03166108f8610bd1565b6001600160a01b03161461091e5760405162461bcd60e51b815260040161064290612132565b47600061092961106b565b6001600160a01b03168260405161093f90611db3565b60006040518083038185875af1925050503d806000811461097c576040519150601f19603f3d011682016040523d82523d6000602084013e610981565b606091505b50509050806109a25760405162461bcd60e51b815260040161064290612370565b5050565b6107c783838360405180602001604052806000815250610df8565b60006109cb6107cc565b82106109e95760405162461bcd60e51b815260040161064290611f61565b5090565b6109f561106b565b6001600160a01b0316610a06610bd1565b6001600160a01b031614610a2c5760405162461bcd60e51b815260040161064290612132565b80516109a290600890602084019061194c565b600a5460ff1681565b6000610a538261139b565b5192915050565b610a6261106b565b6001600160a01b0316610a73610bd1565b6001600160a01b031614610a995760405162461bcd60e51b815260040161064290612132565b610aab610aa461106b565b600161142c565b565b60088054610aba90612518565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae690612518565b8015610b335780601f10610b0857610100808354040283529160200191610b33565b820191906000526020600020905b815481529060010190602001808311610b1657829003601f168201915b505050505081565b60006001600160a01b038216610b635760405162461bcd60e51b815260040161064290612072565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b610b9061106b565b6001600160a01b0316610ba1610bd1565b6001600160a01b031614610bc75760405162461bcd60e51b815260040161064290612132565b610aab6000611446565b6007546001600160a01b031690565b610be861106b565b6001600160a01b0316610bf9610bd1565b6001600160a01b031614610c1f5760405162461bcd60e51b815260040161064290612132565b80516109a290600990602084019061194c565b60606002805461066d90612518565b666a94d74f43000081565b6000610c5661106b565b600a5490915060ff1615610c7c5760405162461bcd60e51b815260040161064290611e5d565b81610c856107cc565b610c8f9190612473565b611a0a1015610cb05760405162461bcd60e51b815260040161064290612046565b60008211610cd05760405162461bcd60e51b815260040161064290611f0d565b81600a1015610cf15760405162461bcd60e51b815260040161064290611f31565b34610d03666a94d74f4300008461249f565b14610d205760405162461bcd60e51b8152600401610642906121f0565b6109a2818361142c565b610d3261106b565b6001600160a01b0316826001600160a01b03161415610d635760405162461bcd60e51b815260040161064290612167565b8060066000610d7061106b565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610db461106b565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610dec9190611dfd565b60405180910390a35050565b610e038484846110d2565b610e0f84848484611498565b610e2b5760405162461bcd60e51b8152600401610642906122a5565b50505050565b60405180604001604052806005815260200164173539b7b760d91b81525081565b6060610e5d8261106f565b610e795760405162461bcd60e51b8152600401610642906120bd565b600060088054610e8890612518565b905011610ea457604051806020016040528060008152506105fb565b6008610eaf836115b3565b60405180604001604052806005815260200164173539b7b760d91b815250604051602001610edf93929190611d03565b6040516020818303038152906040529050919050565b73a5409ec958c83c3f309868babaca7c86dcb077c181565b60098054610aba90612518565b60405163c455279160e01b815260009073a5409ec958c83c3f309868babaca7c86dcb077c1906001600160a01b03841690829063c455279190610f61908890600401611db6565b60206040518083038186803b158015610f7957600080fd5b505afa158015610f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb19190611c41565b6001600160a01b03161415610fca5760019150506108d3565b610fd484846116ce565b949350505050565b610fe461106b565b6001600160a01b0316610ff5610bd1565b6001600160a01b03161461101b5760405162461bcd60e51b815260040161064290612132565b6001600160a01b0381166110415760405162461bcd60e51b815260040161064290611e7d565b61104a81611446565b50565b600a81565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b6000541190565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110dd8261139b565b9050600081600001516001600160a01b03166110f761106b565b6001600160a01b0316148061112c575061110f61106b565b6001600160a01b0316611121846106f0565b6001600160a01b0316145b80611140575081516111409061056661106b565b90508061115f5760405162461bcd60e51b81526004016106429061219e565b846001600160a01b031682600001516001600160a01b0316146111945760405162461bcd60e51b8152600401610642906120ec565b6001600160a01b0384166111ba5760405162461bcd60e51b815260040161064290611fa4565b6111c78585856001610e2b565b6111d76000848460000151611076565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a875260039095529285209151825494516001600160a01b031990951696169590951767ffffffffffffffff60a01b1916600160a01b9390921692909202179055906112a0908590612473565b6000818152600360205260409020549091506001600160a01b0316611345576112c88161106f565b156113455760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff90811682850190815260008781526003909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113938686866001610e2b565b505050505050565b6113a36119cc565b6113ac8261106f565b6113c85760405162461bcd60e51b815260040161064290611ec3565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156114195791506105fe9050565b508061142481612501565b9150506113ca565b6109a28282604051806020016040528060008152506116fc565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006114ac846001600160a01b0316611946565b156115a857836001600160a01b031663150b7a026114c861106b565b8786866040518563ffffffff1660e01b81526004016114ea9493929190611dca565b602060405180830381600087803b15801561150457600080fd5b505af1925050508015611534575060408051601f3d908101601f1916820190925261153191810190611c25565b60015b61158e573d808015611562576040519150601f19603f3d011682016040523d82523d6000602084013e611567565b606091505b5080516115865760405162461bcd60e51b8152600401610642906122a5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fd4565b506001949350505050565b6060816115d857506040805180820190915260018152600360fc1b60208201526105fe565b8160005b811561160257806115ec81612553565b91506115fb9050600a8361248b565b91506115dc565b60008167ffffffffffffffff81111561162b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611655576020820181803683370190505b5090505b8415610fd45761166a6001836124be565b9150611677600a8661256e565b611682906030612473565b60f81b8183815181106116a557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506116c7600a8661248b565b9450611659565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b0384166117255760405162461bcd60e51b81526004016106429061232f565b61172e8161106f565b1561174b5760405162461bcd60e51b8152600401610642906122f8565b6000831161176b5760405162461bcd60e51b815260040161064290612262565b6117786000858386610e2b565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906117d4908790612448565b6001600160801b031681526020018583602001516117f29190612448565b6001600160801b039081169091526001600160a01b03808816600081815260046020908152604080832087518154988401518816600160801b029088166001600160801b031990991698909817909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b858110156119345760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46118f86000888488611498565b6119145760405162461bcd60e51b8152600401610642906122a5565b8161191e81612553565b925050808061192c90612553565b9150506118ab565b50600081815561139390878588610e2b565b3b151590565b82805461195890612518565b90600052602060002090601f01602090048101928261197a57600085556119c0565b82601f1061199357805160ff19168380011785556119c0565b828001600101855582156119c0579182015b828111156119c05782518255916020019190600101906119a5565b506109e99291506119e3565b604080518082019091526000808252602082015290565b5b808211156109e957600081556001016119e4565b600067ffffffffffffffff80841115611a1357611a136125ae565b604051601f8501601f191681016020018281118282101715611a3757611a376125ae565b604052848152915081838501861015611a4f57600080fd5b8484602083013760006020868301015250509392505050565b803580151581146105fe57600080fd5b600060208284031215611a89578081fd5b8135611a94816125c4565b9392505050565b60008060408385031215611aad578081fd5b8235611ab8816125c4565b91506020830135611ac8816125c4565b809150509250929050565b600080600060608486031215611ae7578081fd5b8335611af2816125c4565b92506020840135611b02816125c4565b929592945050506040919091013590565b60008060008060808587031215611b28578081fd5b8435611b33816125c4565b93506020850135611b43816125c4565b925060408501359150606085013567ffffffffffffffff811115611b65578182fd5b8501601f81018713611b75578182fd5b611b84878235602084016119f8565b91505092959194509250565b60008060408385031215611ba2578182fd5b8235611bad816125c4565b9150611bbb60208401611a68565b90509250929050565b60008060408385031215611bd6578182fd5b8235611be1816125c4565b946020939093013593505050565b600060208284031215611c00578081fd5b611a9482611a68565b600060208284031215611c1a578081fd5b8135611a94816125d9565b600060208284031215611c36578081fd5b8151611a94816125d9565b600060208284031215611c52578081fd5b8151611a94816125c4565b600060208284031215611c6e578081fd5b813567ffffffffffffffff811115611c84578182fd5b8201601f81018413611c94578182fd5b610fd4848235602084016119f8565b600060208284031215611cb4578081fd5b5035919050565b60008151808452611cd38160208601602086016124d5565b601f01601f19169290920160200192915050565b60008151611cf98185602086016124d5565b9290920192915050565b8354600090819060028104600180831680611d1f57607f831692505b6020808410821415611d3f57634e487b7160e01b87526022600452602487fd5b818015611d535760018114611d6457611d90565b60ff19861689528489019650611d90565b611d6d8c61243c565b885b86811015611d885781548b820152908501908301611d6f565b505084890196505b505050505050611da9611da38287611ce7565b85611ce7565b9695505050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611da990830184611cbb565b901515815260200190565b600060208252611a946020830184611cbb565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252600a90820152694e6f2030206d696e747360b01b604082015260600190565b60208082526016908201527508af0c6cae6e640dac2f040e0cae440e0c2d2c840e8f60531b604082015260600190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b60208082526012908201527145786365656473206d617820737570706c7960701b604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b6020808252601590820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604082015260600190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b602080825260169082015275125b9d985b1a5908199d5b991cc81c1c9bdd9a59195960521b604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b60208082526023908201527f455243373231413a207175616e74697479206d7573742062652067726561746560408201526207220360ec1b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600e908201526d11985a5b1959081d1bc81cd95b9960921b604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b90815260200190565b60009081526020902090565b60006001600160801b0380831681851680830382111561246a5761246a612582565b01949350505050565b6000821982111561248657612486612582565b500190565b60008261249a5761249a612598565b500490565b60008160001904831182151516156124b9576124b9612582565b500290565b6000828210156124d0576124d0612582565b500390565b60005b838110156124f05781810151838201526020016124d8565b83811115610e2b5750506000910152565b60008161251057612510612582565b506000190190565b60028104600182168061252c57607f821691505b6020821081141561254d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561256757612567612582565b5060010190565b60008261257d5761257d612598565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461104a57600080fd5b6001600160e01b03198116811461104a57600080fdfea264697066735822122079881d88dfa991e0fefbef092975d1d8c729c29baa0390dd1dc202f1b0e4f96464736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80636c0360eb1161010d578063a22cb465116100a0578063cd7c03261161006f578063cd7c032614610521578063e8a3d48514610536578063e985e9c51461054b578063f2fde38b1461056b578063f43a22dc1461058b576101ee565b8063a22cb465146104ac578063b88d4fde146104cc578063c6682862146104ec578063c87b56dd14610501576101ee565b8063938e3d7b116100dc578063938e3d7b1461044f57806395d89b411461046f578063a035b1fe14610484578063a0712d6814610499576101ee565b80636c0360eb146103f057806370a0823114610405578063715018a6146104255780638da5cb5b1461043a576101ee565b806332cb6b0c1161018557806355f804b31161015457806355f804b3146103865780635c975abb146103a65780636352211e146103bb578063698982ba146103db576101ee565b806332cb6b0c1461031c5780633ccfd60b1461033157806342842e0e146103465780634f6ccce714610366576101ee565b8063095ea7b3116101c1578063095ea7b31461029a57806318160ddd146102ba57806323b872dd146102dc5780632f745c59146102fc576101ee565b806301ffc9a7146101f357806302329a291461022957806306fdde031461024b578063081812fc1461026d575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611c09565b6105a0565b6040516102209190611dfd565b60405180910390f35b34801561023557600080fd5b50610249610244366004611bef565b610603565b005b34801561025757600080fd5b5061026061065e565b6040516102209190611e08565b34801561027957600080fd5b5061028d610288366004611ca3565b6106f0565b6040516102209190611db6565b3480156102a657600080fd5b506102496102b5366004611bc4565b610733565b3480156102c657600080fd5b506102cf6107cc565b6040516102209190612433565b3480156102e857600080fd5b506102496102f7366004611ad3565b6107d2565b34801561030857600080fd5b506102cf610317366004611bc4565b6107dd565b34801561032857600080fd5b506102cf6108d9565b34801561033d57600080fd5b506102496108df565b34801561035257600080fd5b50610249610361366004611ad3565b6109a6565b34801561037257600080fd5b506102cf610381366004611ca3565b6109c1565b34801561039257600080fd5b506102496103a1366004611c5d565b6109ed565b3480156103b257600080fd5b50610213610a3f565b3480156103c757600080fd5b5061028d6103d6366004611ca3565b610a48565b3480156103e757600080fd5b50610249610a5a565b3480156103fc57600080fd5b50610260610aad565b34801561041157600080fd5b506102cf610420366004611a78565b610b3b565b34801561043157600080fd5b50610249610b88565b34801561044657600080fd5b5061028d610bd1565b34801561045b57600080fd5b5061024961046a366004611c5d565b610be0565b34801561047b57600080fd5b50610260610c32565b34801561049057600080fd5b506102cf610c41565b6102496104a7366004611ca3565b610c4c565b3480156104b857600080fd5b506102496104c7366004611b90565b610d2a565b3480156104d857600080fd5b506102496104e7366004611b13565b610df8565b3480156104f857600080fd5b50610260610e31565b34801561050d57600080fd5b5061026061051c366004611ca3565b610e52565b34801561052d57600080fd5b5061028d610ef5565b34801561054257600080fd5b50610260610f0d565b34801561055757600080fd5b50610213610566366004611a9b565b610f1a565b34801561057757600080fd5b50610249610586366004611a78565b610fdc565b34801561059757600080fd5b506102cf61104d565b60006001600160e01b031982166380ac58cd60e01b14806105d157506001600160e01b03198216635b5e139f60e01b145b806105ec57506001600160e01b0319821663780e9d6360e01b145b806105fb57506105fb82611052565b90505b919050565b61060b61106b565b6001600160a01b031661061c610bd1565b6001600160a01b03161461064b5760405162461bcd60e51b815260040161064290612132565b60405180910390fd5b600a805460ff1916911515919091179055565b60606001805461066d90612518565b80601f016020809104026020016040519081016040528092919081815260200182805461069990612518565b80156106e65780601f106106bb576101008083540402835291602001916106e6565b820191906000526020600020905b8154815290600101906020018083116106c957829003601f168201915b5050505050905090565b60006106fb8261106f565b6107175760405162461bcd60e51b8152600401610642906123e6565b506000908152600560205260409020546001600160a01b031690565b600061073e82610a48565b9050806001600160a01b0316836001600160a01b031614156107725760405162461bcd60e51b815260040161064290612220565b806001600160a01b031661078461106b565b6001600160a01b031614806107a057506107a08161056661106b565b6107bc5760405162461bcd60e51b815260040161064290611fe9565b6107c7838383611076565b505050565b60005490565b6107c78383836110d2565b60006107e883610b3b565b82106108065760405162461bcd60e51b815260040161064290611e1b565b60006108106107cc565b905060008060005b838110156108ba576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561086b57805192505b876001600160a01b0316836001600160a01b031614156108a75786841415610899575093506108d392505050565b836108a381612553565b9450505b50806108b281612553565b915050610818565b5060405162461bcd60e51b815260040161064290612398565b92915050565b611a0a81565b6108e761106b565b6001600160a01b03166108f8610bd1565b6001600160a01b03161461091e5760405162461bcd60e51b815260040161064290612132565b47600061092961106b565b6001600160a01b03168260405161093f90611db3565b60006040518083038185875af1925050503d806000811461097c576040519150601f19603f3d011682016040523d82523d6000602084013e610981565b606091505b50509050806109a25760405162461bcd60e51b815260040161064290612370565b5050565b6107c783838360405180602001604052806000815250610df8565b60006109cb6107cc565b82106109e95760405162461bcd60e51b815260040161064290611f61565b5090565b6109f561106b565b6001600160a01b0316610a06610bd1565b6001600160a01b031614610a2c5760405162461bcd60e51b815260040161064290612132565b80516109a290600890602084019061194c565b600a5460ff1681565b6000610a538261139b565b5192915050565b610a6261106b565b6001600160a01b0316610a73610bd1565b6001600160a01b031614610a995760405162461bcd60e51b815260040161064290612132565b610aab610aa461106b565b600161142c565b565b60088054610aba90612518565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae690612518565b8015610b335780601f10610b0857610100808354040283529160200191610b33565b820191906000526020600020905b815481529060010190602001808311610b1657829003601f168201915b505050505081565b60006001600160a01b038216610b635760405162461bcd60e51b815260040161064290612072565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b610b9061106b565b6001600160a01b0316610ba1610bd1565b6001600160a01b031614610bc75760405162461bcd60e51b815260040161064290612132565b610aab6000611446565b6007546001600160a01b031690565b610be861106b565b6001600160a01b0316610bf9610bd1565b6001600160a01b031614610c1f5760405162461bcd60e51b815260040161064290612132565b80516109a290600990602084019061194c565b60606002805461066d90612518565b666a94d74f43000081565b6000610c5661106b565b600a5490915060ff1615610c7c5760405162461bcd60e51b815260040161064290611e5d565b81610c856107cc565b610c8f9190612473565b611a0a1015610cb05760405162461bcd60e51b815260040161064290612046565b60008211610cd05760405162461bcd60e51b815260040161064290611f0d565b81600a1015610cf15760405162461bcd60e51b815260040161064290611f31565b34610d03666a94d74f4300008461249f565b14610d205760405162461bcd60e51b8152600401610642906121f0565b6109a2818361142c565b610d3261106b565b6001600160a01b0316826001600160a01b03161415610d635760405162461bcd60e51b815260040161064290612167565b8060066000610d7061106b565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610db461106b565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610dec9190611dfd565b60405180910390a35050565b610e038484846110d2565b610e0f84848484611498565b610e2b5760405162461bcd60e51b8152600401610642906122a5565b50505050565b60405180604001604052806005815260200164173539b7b760d91b81525081565b6060610e5d8261106f565b610e795760405162461bcd60e51b8152600401610642906120bd565b600060088054610e8890612518565b905011610ea457604051806020016040528060008152506105fb565b6008610eaf836115b3565b60405180604001604052806005815260200164173539b7b760d91b815250604051602001610edf93929190611d03565b6040516020818303038152906040529050919050565b73a5409ec958c83c3f309868babaca7c86dcb077c181565b60098054610aba90612518565b60405163c455279160e01b815260009073a5409ec958c83c3f309868babaca7c86dcb077c1906001600160a01b03841690829063c455279190610f61908890600401611db6565b60206040518083038186803b158015610f7957600080fd5b505afa158015610f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb19190611c41565b6001600160a01b03161415610fca5760019150506108d3565b610fd484846116ce565b949350505050565b610fe461106b565b6001600160a01b0316610ff5610bd1565b6001600160a01b03161461101b5760405162461bcd60e51b815260040161064290612132565b6001600160a01b0381166110415760405162461bcd60e51b815260040161064290611e7d565b61104a81611446565b50565b600a81565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b6000541190565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110dd8261139b565b9050600081600001516001600160a01b03166110f761106b565b6001600160a01b0316148061112c575061110f61106b565b6001600160a01b0316611121846106f0565b6001600160a01b0316145b80611140575081516111409061056661106b565b90508061115f5760405162461bcd60e51b81526004016106429061219e565b846001600160a01b031682600001516001600160a01b0316146111945760405162461bcd60e51b8152600401610642906120ec565b6001600160a01b0384166111ba5760405162461bcd60e51b815260040161064290611fa4565b6111c78585856001610e2b565b6111d76000848460000151611076565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a875260039095529285209151825494516001600160a01b031990951696169590951767ffffffffffffffff60a01b1916600160a01b9390921692909202179055906112a0908590612473565b6000818152600360205260409020549091506001600160a01b0316611345576112c88161106f565b156113455760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff90811682850190815260008781526003909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113938686866001610e2b565b505050505050565b6113a36119cc565b6113ac8261106f565b6113c85760405162461bcd60e51b815260040161064290611ec3565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156114195791506105fe9050565b508061142481612501565b9150506113ca565b6109a28282604051806020016040528060008152506116fc565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006114ac846001600160a01b0316611946565b156115a857836001600160a01b031663150b7a026114c861106b565b8786866040518563ffffffff1660e01b81526004016114ea9493929190611dca565b602060405180830381600087803b15801561150457600080fd5b505af1925050508015611534575060408051601f3d908101601f1916820190925261153191810190611c25565b60015b61158e573d808015611562576040519150601f19603f3d011682016040523d82523d6000602084013e611567565b606091505b5080516115865760405162461bcd60e51b8152600401610642906122a5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fd4565b506001949350505050565b6060816115d857506040805180820190915260018152600360fc1b60208201526105fe565b8160005b811561160257806115ec81612553565b91506115fb9050600a8361248b565b91506115dc565b60008167ffffffffffffffff81111561162b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611655576020820181803683370190505b5090505b8415610fd45761166a6001836124be565b9150611677600a8661256e565b611682906030612473565b60f81b8183815181106116a557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506116c7600a8661248b565b9450611659565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b0384166117255760405162461bcd60e51b81526004016106429061232f565b61172e8161106f565b1561174b5760405162461bcd60e51b8152600401610642906122f8565b6000831161176b5760405162461bcd60e51b815260040161064290612262565b6117786000858386610e2b565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906117d4908790612448565b6001600160801b031681526020018583602001516117f29190612448565b6001600160801b039081169091526001600160a01b03808816600081815260046020908152604080832087518154988401518816600160801b029088166001600160801b031990991698909817909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b858110156119345760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46118f86000888488611498565b6119145760405162461bcd60e51b8152600401610642906122a5565b8161191e81612553565b925050808061192c90612553565b9150506118ab565b50600081815561139390878588610e2b565b3b151590565b82805461195890612518565b90600052602060002090601f01602090048101928261197a57600085556119c0565b82601f1061199357805160ff19168380011785556119c0565b828001600101855582156119c0579182015b828111156119c05782518255916020019190600101906119a5565b506109e99291506119e3565b604080518082019091526000808252602082015290565b5b808211156109e957600081556001016119e4565b600067ffffffffffffffff80841115611a1357611a136125ae565b604051601f8501601f191681016020018281118282101715611a3757611a376125ae565b604052848152915081838501861015611a4f57600080fd5b8484602083013760006020868301015250509392505050565b803580151581146105fe57600080fd5b600060208284031215611a89578081fd5b8135611a94816125c4565b9392505050565b60008060408385031215611aad578081fd5b8235611ab8816125c4565b91506020830135611ac8816125c4565b809150509250929050565b600080600060608486031215611ae7578081fd5b8335611af2816125c4565b92506020840135611b02816125c4565b929592945050506040919091013590565b60008060008060808587031215611b28578081fd5b8435611b33816125c4565b93506020850135611b43816125c4565b925060408501359150606085013567ffffffffffffffff811115611b65578182fd5b8501601f81018713611b75578182fd5b611b84878235602084016119f8565b91505092959194509250565b60008060408385031215611ba2578182fd5b8235611bad816125c4565b9150611bbb60208401611a68565b90509250929050565b60008060408385031215611bd6578182fd5b8235611be1816125c4565b946020939093013593505050565b600060208284031215611c00578081fd5b611a9482611a68565b600060208284031215611c1a578081fd5b8135611a94816125d9565b600060208284031215611c36578081fd5b8151611a94816125d9565b600060208284031215611c52578081fd5b8151611a94816125c4565b600060208284031215611c6e578081fd5b813567ffffffffffffffff811115611c84578182fd5b8201601f81018413611c94578182fd5b610fd4848235602084016119f8565b600060208284031215611cb4578081fd5b5035919050565b60008151808452611cd38160208601602086016124d5565b601f01601f19169290920160200192915050565b60008151611cf98185602086016124d5565b9290920192915050565b8354600090819060028104600180831680611d1f57607f831692505b6020808410821415611d3f57634e487b7160e01b87526022600452602487fd5b818015611d535760018114611d6457611d90565b60ff19861689528489019650611d90565b611d6d8c61243c565b885b86811015611d885781548b820152908501908301611d6f565b505084890196505b505050505050611da9611da38287611ce7565b85611ce7565b9695505050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611da990830184611cbb565b901515815260200190565b600060208252611a946020830184611cbb565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252600a90820152694e6f2030206d696e747360b01b604082015260600190565b60208082526016908201527508af0c6cae6e640dac2f040e0cae440e0c2d2c840e8f60531b604082015260600190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b60208082526012908201527145786365656473206d617820737570706c7960701b604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b6020808252601590820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604082015260600190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b602080825260169082015275125b9d985b1a5908199d5b991cc81c1c9bdd9a59195960521b604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b60208082526023908201527f455243373231413a207175616e74697479206d7573742062652067726561746560408201526207220360ec1b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600e908201526d11985a5b1959081d1bc81cd95b9960921b604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b90815260200190565b60009081526020902090565b60006001600160801b0380831681851680830382111561246a5761246a612582565b01949350505050565b6000821982111561248657612486612582565b500190565b60008261249a5761249a612598565b500490565b60008160001904831182151516156124b9576124b9612582565b500290565b6000828210156124d0576124d0612582565b500390565b60005b838110156124f05781810151838201526020016124d8565b83811115610e2b5750506000910152565b60008161251057612510612582565b506000190190565b60028104600182168061252c57607f821691505b6020821081141561254d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561256757612567612582565b5060010190565b60008261257d5761257d612598565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461104a57600080fd5b6001600160e01b03198116811461104a57600080fdfea264697066735822122079881d88dfa991e0fefbef092975d1d8c729c29baa0390dd1dc202f1b0e4f96464736f6c63430008000033

Deployed Bytecode Sourcemap

35506:2612:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23484:372;;;;;;;;;;-1:-1:-1;23484:372:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37432:81;;;;;;;;;;-1:-1:-1;37432:81:0;;;;;:::i;:::-;;:::i;:::-;;25111:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26672:214::-;;;;;;;;;;-1:-1:-1;26672:214:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26193:413::-;;;;;;;;;;-1:-1:-1;26193:413:0;;;;;:::i;:::-;;:::i;21925:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27548:162::-;;;;;;;;;;-1:-1:-1;27548:162:0;;;;;:::i;:::-;;:::i;22589:823::-;;;;;;;;;;-1:-1:-1;22589:823:0;;;;;:::i;:::-;;:::i;35820:41::-;;;;;;;;;;;;;:::i;37124:209::-;;;;;;;;;;;;;:::i;27781:177::-;;;;;;;;;;-1:-1:-1;27781:177:0;;;;;:::i;:::-;;:::i;22102:187::-;;;;;;;;;;-1:-1:-1;22102:187:0;;;;;:::i;:::-;;:::i;37521:100::-;;;;;;;;;;-1:-1:-1;37521:100:0;;;;;:::i;:::-;;:::i;35919:25::-;;;;;;;;;;;;;:::i;24920:124::-;;;;;;;;;;-1:-1:-1;24920:124:0;;;;;:::i;:::-;;:::i;37341:83::-;;;;;;;;;;;;;:::i;35553:26::-;;;;;;;;;;;;;:::i;23920:221::-;;;;;;;;;;-1:-1:-1;23920:221:0;;;;;:::i;:::-;;:::i;860:103::-;;;;;;;;;;;;;:::i;633:87::-;;;;;;;;;;;;;:::i;37629:116::-;;;;;;;;;;-1:-1:-1;37629:116:0;;;;;:::i;:::-;;:::i;25280:104::-;;;;;;;;;;;;;:::i;35868:42::-;;;;;;;;;;;;;:::i;36221:442::-;;;;;;:::i;:::-;;:::i;26958:288::-;;;;;;;;;;-1:-1:-1;26958:288:0;;;;;:::i;:::-;;:::i;28029:355::-;;;;;;;;;;-1:-1:-1;28029:355:0;;;;;:::i;:::-;;:::i;35623:46::-;;;;;;;;;;;;;:::i;37753:362::-;;;;;;;;;;-1:-1:-1;37753:362:0;;;;;:::i;:::-;;:::i;35676:89::-;;;;;;;;;;;;;:::i;35586:30::-;;;;;;;;;;;;;:::i;36671:445::-;;;;;;;;;;-1:-1:-1;36671:445:0;;;;;:::i;:::-;;:::i;973:201::-;;;;;;;;;;-1:-1:-1;973:201:0;;;;;:::i;:::-;;:::i;35774:39::-;;;;;;;;;;;;;:::i;23484:372::-;23586:4;-1:-1:-1;;;;;;23623:40:0;;-1:-1:-1;;;23623:40:0;;:105;;-1:-1:-1;;;;;;;23680:48:0;;-1:-1:-1;;;23680:48:0;23623:105;:172;;;-1:-1:-1;;;;;;;23745:50:0;;-1:-1:-1;;;23745:50:0;23623:172;:225;;;;23812:36;23836:11;23812:23;:36::i;:::-;23603:245;;23484:372;;;;:::o;37432:81::-;781:12;:10;:12::i;:::-;-1:-1:-1;;;;;770:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;770:23:0;;762:68;;;;-1:-1:-1;;;762:68:0;;;;;;;:::i;:::-;;;;;;;;;37490:6:::1;:15:::0;;-1:-1:-1;;37490:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37432:81::o;25111:100::-;25165:13;25198:5;25191:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25111:100;:::o;26672:214::-;26740:7;26768:16;26776:7;26768;:16::i;:::-;26760:74;;;;-1:-1:-1;;;26760:74:0;;;;;;;:::i;:::-;-1:-1:-1;26854:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26854:24:0;;26672:214::o;26193:413::-;26266:13;26282:24;26298:7;26282:15;:24::i;:::-;26266:40;;26331:5;-1:-1:-1;;;;;26325:11:0;:2;-1:-1:-1;;;;;26325:11:0;;;26317:58;;;;-1:-1:-1;;;26317:58:0;;;;;;;:::i;:::-;26426:5;-1:-1:-1;;;;;26410:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;26410:21:0;;:62;;;;26435:37;26452:5;26459:12;:10;:12::i;26435:37::-;26388:169;;;;-1:-1:-1;;;26388:169:0;;;;;;;:::i;:::-;26570:28;26579:2;26583:7;26592:5;26570:8;:28::i;:::-;26193:413;;;:::o;21925:100::-;21978:7;22005:12;21925:100;:::o;27548:162::-;27674:28;27684:4;27690:2;27694:7;27674:9;:28::i;22589:823::-;22678:7;22714:16;22724:5;22714:9;:16::i;:::-;22706:5;:24;22698:71;;;;-1:-1:-1;;;22698:71:0;;;;;;;:::i;:::-;22780:22;22805:13;:11;:13::i;:::-;22780:38;;22829:19;22863:25;22917:9;22912:426;22936:14;22932:1;:18;22912:426;;;22972:31;23006:14;;;:11;:14;;;;;;;;;22972:48;;;;;;;;;-1:-1:-1;;;;;22972:48:0;;;;;-1:-1:-1;;;22972:48:0;;;;;;;;;;;;23039:28;23035:103;;23108:14;;;-1:-1:-1;23035:103:0;23177:5;-1:-1:-1;;;;;23156:26:0;:17;-1:-1:-1;;;;;23156:26:0;;23152:175;;;23222:5;23207:11;:20;23203:77;;;-1:-1:-1;23259:1:0;-1:-1:-1;23252:8:0;;-1:-1:-1;;;23252:8:0;23203:77;23298:13;;;;:::i;:::-;;;;23152:175;-1:-1:-1;22952:3:0;;;;:::i;:::-;;;;22912:426;;;;23348:56;;-1:-1:-1;;;23348:56:0;;;;;;;:::i;22589:823::-;;;;;:::o;35820:41::-;35857:4;35820:41;:::o;37124:209::-;781:12;:10;:12::i;:::-;-1:-1:-1;;;;;770:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;770:23:0;;762:68;;;;-1:-1:-1;;;762:68:0;;;;;;;:::i;:::-;37192:21:::1;37174:15;37243:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;37243:17:0::1;37268:7;37243:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37224:56;;;37299:7;37291:34;;;;-1:-1:-1::0;;;37291:34:0::1;;;;;;;:::i;:::-;841:1;;37124:209::o:0;27781:177::-;27911:39;27928:4;27934:2;27938:7;27911:39;;;;;;;;;;;;:16;:39::i;22102:187::-;22169:7;22205:13;:11;:13::i;:::-;22197:5;:21;22189:69;;;;-1:-1:-1;;;22189:69:0;;;;;;;:::i;:::-;-1:-1:-1;22276:5:0;22102:187::o;37521:100::-;781:12;:10;:12::i;:::-;-1:-1:-1;;;;;770:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;770:23:0;;762:68;;;;-1:-1:-1;;;762:68:0;;;;;;;:::i;:::-;37595:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;35919:25::-:0;;;;;;:::o;24920:124::-;24984:7;25011:20;25023:7;25011:11;:20::i;:::-;:25;;24920:124;-1:-1:-1;;24920:124:0:o;37341:83::-;781:12;:10;:12::i;:::-;-1:-1:-1;;;;;770:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;770:23:0;;762:68;;;;-1:-1:-1;;;762:68:0;;;;;;;:::i;:::-;37390:26:::1;37400:12;:10;:12::i;:::-;37414:1;37390:9;:26::i;:::-;37341:83::o:0;35553:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23920:221::-;23984:7;-1:-1:-1;;;;;24012:19:0;;24004:75;;;;-1:-1:-1;;;24004:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;24105:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;24105:27:0;;23920:221::o;860:103::-;781:12;:10;:12::i;:::-;-1:-1:-1;;;;;770:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;770:23:0;;762:68;;;;-1:-1:-1;;;762:68:0;;;;;;;:::i;:::-;925:30:::1;952:1;925:18;:30::i;633:87::-:0;706:6;;-1:-1:-1;;;;;706:6:0;633:87;:::o;37629:116::-;781:12;:10;:12::i;:::-;-1:-1:-1;;;;;770:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;770:23:0;;762:68;;;;-1:-1:-1;;;762:68:0;;;;;;;:::i;:::-;37711:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;25280:104::-:0;25336:13;25369:7;25362:14;;;;;:::i;35868:42::-;35900:10;35868:42;:::o;36221:442::-;36280:15;36298:12;:10;:12::i;:::-;36330:6;;36280:30;;-1:-1:-1;36330:6:0;;36329:7;36321:26;;;;-1:-1:-1;;;36321:26:0;;;;;;;:::i;:::-;36396:7;36380:13;:11;:13::i;:::-;:23;;;;:::i;:::-;35857:4;36366:37;;36358:68;;;;-1:-1:-1;;;36358:68:0;;;;;;;:::i;:::-;36455:1;36445:7;:11;36437:34;;;;-1:-1:-1;;;36437:34:0;;;;;;;:::i;:::-;36506:7;35811:2;36492:21;;36484:57;;;;-1:-1:-1;;;36484:57:0;;;;;;;:::i;:::-;36579:9;36560:15;35900:10;36560:7;:15;:::i;:::-;:28;36552:63;;;;-1:-1:-1;;;36552:63:0;;;;;;;:::i;:::-;36628:27;36638:7;36647;36628:9;:27::i;26958:288::-;27065:12;:10;:12::i;:::-;-1:-1:-1;;;;;27053:24:0;:8;-1:-1:-1;;;;;27053:24:0;;;27045:63;;;;-1:-1:-1;;;27045:63:0;;;;;;;:::i;:::-;27166:8;27121:18;:32;27140:12;:10;:12::i;:::-;-1:-1:-1;;;;;27121:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;27121:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;27121:53:0;;;;;;;;;;;27205:12;:10;:12::i;:::-;-1:-1:-1;;;;;27190:48:0;;27229:8;27190:48;;;;;;:::i;:::-;;;;;;;;26958:288;;:::o;28029:355::-;28188:28;28198:4;28204:2;28208:7;28188:9;:28::i;:::-;28249:48;28272:4;28278:2;28282:7;28291:5;28249:22;:48::i;:::-;28227:149;;;;-1:-1:-1;;;28227:149:0;;;;;;;:::i;:::-;28029:355;;;;:::o;35623:46::-;;;;;;;;;;;;;;-1:-1:-1;;;35623:46:0;;;;:::o;37753:362::-;37819:13;37853:17;37861:8;37853:7;:17::i;:::-;37845:51;;;;-1:-1:-1;;;37845:51:0;;;;;;;:::i;:::-;37938:1;37920:7;37914:21;;;;;:::i;:::-;;;:25;:193;;;;;;;;;;;;;;;;;37996:7;38020:26;38037:8;38020:16;:26::i;:::-;38063:13;;;;;;;;;;;;;-1:-1:-1;;;38063:13:0;;;37963:128;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37907:200;;37753:362;;;:::o;35676:89::-;35723:42;35676:89;:::o;35586:30::-;;;;;;;:::i;36671:445::-;36969:28;;-1:-1:-1;;;36969:28:0;;36796:4;;35723:42;;-1:-1:-1;;;;;36961:49:0;;;35723:42;;36969:21;;:28;;36991:5;;36969:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36961:49:0;;36957:93;;;37034:4;37027:11;;;;;36957:93;37069:39;37092:5;37099:8;37069:22;:39::i;:::-;37062:46;36671:445;-1:-1:-1;;;;36671:445:0:o;973:201::-;781:12;:10;:12::i;:::-;-1:-1:-1;;;;;770:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;770:23:0;;762:68;;;;-1:-1:-1;;;762:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1062:22:0;::::1;1054:73;;;;-1:-1:-1::0;;;1054:73:0::1;;;;;;;:::i;:::-;1138:28;1157:8;1138:18;:28::i;:::-;973:201:::0;:::o;35774:39::-;35811:2;35774:39;:::o;19988:157::-;-1:-1:-1;;;;;;20097:40:0;;-1:-1:-1;;;20097:40:0;19988:157;;;:::o;173:98::-;253:10;173:98;:::o;28639:111::-;28696:4;28730:12;-1:-1:-1;28720:22:0;28639:111::o;32683:196::-;32798:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;32798:29:0;-1:-1:-1;;;;;32798:29:0;;;;;;;;;32843:28;;32798:24;;32843:28;;;;;;;32683:196;;;:::o;30782:1783::-;30897:35;30935:20;30947:7;30935:11;:20::i;:::-;30897:58;;30968:22;31010:13;:18;;;-1:-1:-1;;;;;30994:34:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;30994:34:0;;:87;;;;31069:12;:10;:12::i;:::-;-1:-1:-1;;;;;31045:36:0;:20;31057:7;31045:11;:20::i;:::-;-1:-1:-1;;;;;31045:36:0;;30994:87;:154;;;-1:-1:-1;31115:18:0;;31098:50;;31135:12;:10;:12::i;31098:50::-;30968:181;;31170:17;31162:80;;;;-1:-1:-1;;;31162:80:0;;;;;;;:::i;:::-;31285:4;-1:-1:-1;;;;;31263:26:0;:13;:18;;;-1:-1:-1;;;;;31263:26:0;;31255:77;;;;-1:-1:-1;;;31255:77:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31351:16:0;;31343:66;;;;-1:-1:-1;;;31343:66:0;;;;;;;:::i;:::-;31422:43;31444:4;31450:2;31454:7;31463:1;31422:21;:43::i;:::-;31530:49;31547:1;31551:7;31560:13;:18;;;31530:8;:49::i;:::-;-1:-1:-1;;;;;31784:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;31784:31:0;;;-1:-1:-1;;;;;31784:31:0;;;-1:-1:-1;;31784:31:0;;;;;;;31830:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;31830:29:0;;;;;;;;;;;;;31906:43;;;;;;;;;;31932:15;31906:43;;;;;;;;;;31883:20;;;:11;:20;;;;;;:66;;;;;;-1:-1:-1;;;;;;31883:66:0;;;;;;;;;-1:-1:-1;;;;31883:66:0;-1:-1:-1;;;31883:66:0;;;;;;;;;;;31784:18;32211:11;;31883:20;;32211:11;:::i;:::-;32278:1;32237:24;;;:11;:24;;;;;:29;32189:33;;-1:-1:-1;;;;;;32237:29:0;32233:227;;32301:20;32309:11;32301:7;:20::i;:::-;32297:152;;;32369:64;;;;;;;;32384:18;;-1:-1:-1;;;;;32369:64:0;;;;;;32404:28;;;;32369:64;;;;;;;;;;-1:-1:-1;32342:24:0;;;:11;:24;;;;;;;:91;;;;;;-1:-1:-1;;;;;;32342:91:0;;;;;;;;;-1:-1:-1;;;;32342:91:0;-1:-1:-1;;;32342:91:0;;;;;;;;;;;;;;32297:152;32496:7;32492:2;-1:-1:-1;;;;;32477:27:0;32486:4;-1:-1:-1;;;;;32477:27:0;;;;;;;;;;;32515:42;32536:4;32542:2;32546:7;32555:1;32515:20;:42::i;:::-;30782:1783;;;;;;:::o;24386:472::-;24447:21;;:::i;:::-;24489:16;24497:7;24489;:16::i;:::-;24481:71;;;;-1:-1:-1;;;24481:71:0;;;;;;;:::i;:::-;24585:7;24565:216;24619:31;24653:17;;;:11;:17;;;;;;;;;24619:51;;;;;;;;;-1:-1:-1;;;;;24619:51:0;;;;;-1:-1:-1;;;24619:51:0;;;;;;;;;;;;24689:28;24685:85;;24745:9;-1:-1:-1;24738:16:0;;-1:-1:-1;24738:16:0;24685:85;-1:-1:-1;24596:6:0;;;;:::i;:::-;;;;24565:216;;28758:104;28827:27;28837:2;28841:8;28827:27;;;;;;;;;;;;:9;:27::i;1184:191::-;1277:6;;;-1:-1:-1;;;;;1294:17:0;;;-1:-1:-1;;;;;;1294:17:0;;;;;;;1327:40;;1277:6;;;1294:17;1277:6;;1327:40;;1258:16;;1327:40;1184:191;;:::o;33444:804::-;33599:4;33620:15;:2;-1:-1:-1;;;;;33620:13:0;;:15::i;:::-;33616:625;;;33672:2;-1:-1:-1;;;;;33656:36:0;;33693:12;:10;:12::i;:::-;33707:4;33713:7;33722:5;33656:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33656:72:0;;;;;;;;-1:-1:-1;;33656:72:0;;;;;;;;;;;;:::i;:::-;;;33652:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33902:13:0;;33898:273;;33945:61;;-1:-1:-1;;;33945:61:0;;;;;;;:::i;33898:273::-;34121:6;34115:13;34106:6;34102:2;34098:15;34091:38;33652:534;-1:-1:-1;;;;;;33779:55:0;-1:-1:-1;;;33779:55:0;;-1:-1:-1;33772:62:0;;33616:625;-1:-1:-1;34225:4:0;33444:804;;;;;;:::o;1476:534::-;1532:13;1564:10;1560:53;;-1:-1:-1;1591:10:0;;;;;;;;;;;;-1:-1:-1;;;1591:10:0;;;;;;1560:53;1638:5;1623:12;1679:78;1686:9;;1679:78;;1712:8;;;;:::i;:::-;;-1:-1:-1;1735:10:0;;-1:-1:-1;1743:2:0;1735:10;;:::i;:::-;;;1679:78;;;1767:19;1799:6;1789:17;;;;;;-1:-1:-1;;;1789:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1789:17:0;;1767:39;;1817:154;1824:10;;1817:154;;1851:11;1861:1;1851:11;;:::i;:::-;;-1:-1:-1;1920:10:0;1928:2;1920:5;:10;:::i;:::-;1907:24;;:2;:24;:::i;:::-;1894:39;;1877:6;1884;1877:14;;;;;;-1:-1:-1;;;1877:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;1877:56:0;;;;;;;;-1:-1:-1;1948:11:0;1957:2;1948:11;;:::i;:::-;;;1817:154;;27317:164;-1:-1:-1;;;;;27438:25:0;;;27414:4;27438:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27317:164::o;29139:1389::-;29262:20;29285:12;-1:-1:-1;;;;;29316:16:0;;29308:62;;;;-1:-1:-1;;;29308:62:0;;;;;;;:::i;:::-;29515:21;29523:12;29515:7;:21::i;:::-;29514:22;29506:64;;;;-1:-1:-1;;;29506:64:0;;;;;;;:::i;:::-;29600:1;29589:8;:12;29581:60;;;;-1:-1:-1;;;29581:60:0;;;;;;;:::i;:::-;29654:61;29684:1;29688:2;29692:12;29706:8;29654:21;:61::i;:::-;-1:-1:-1;;;;;29761:16:0;;29728:30;29761:16;;;:12;:16;;;;;;;;;29728:49;;;;;;;;;-1:-1:-1;;;;;29728:49:0;;;;;-1:-1:-1;;;29728:49:0;;;;;;;;;;;29807:135;;;;;;;;29833:19;;29728:49;;29807:135;;;29833:39;;29863:8;;29833:39;:::i;:::-;-1:-1:-1;;;;;29807:135:0;;;;;29922:8;29887:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;29807:135:0;;;;;;-1:-1:-1;;;;;29788:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;;;-1:-1:-1;;;29788:154:0;;;;-1:-1:-1;;;;;;29788:154:0;;;;;;;;;;;;;;;;;29981:43;;;;;;;;;;;30007:15;29981:43;;;;;;;;29953:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;29953:71:0;-1:-1:-1;;;;29953:71:0;;;;-1:-1:-1;;;;;;29953:71:0;;;;;;;;;;;;;;;29965:12;;30085:325;30109:8;30105:1;:12;30085:325;;;30144:38;;30169:12;;-1:-1:-1;;;;;30144:38:0;;;30161:1;;30144:38;;30161:1;;30144:38;30223:59;30254:1;30258:2;30262:12;30276:5;30223:22;:59::i;:::-;30197:172;;;;-1:-1:-1;;;30197:172:0;;;;;;;:::i;:::-;30384:14;;;;:::i;:::-;;;;30119:3;;;;;:::i;:::-;;;;30085:325;;;-1:-1:-1;30422:12:0;:27;;;30460:60;;30493:2;30497:12;30511:8;30460:20;:60::i;11809:387::-;12132:20;12180:8;;;11809:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:162::-;693:20;;749:13;;742:21;732:32;;722:2;;778:1;775;768:12;793:259;;905:2;893:9;884:7;880:23;876:32;873:2;;;926:6;918;911:22;873:2;970:9;957:23;989:33;1016:5;989:33;:::i;:::-;1041:5;863:189;-1:-1:-1;;;863:189:1:o;1057:402::-;;;1186:2;1174:9;1165:7;1161:23;1157:32;1154:2;;;1207:6;1199;1192:22;1154:2;1251:9;1238:23;1270:33;1297:5;1270:33;:::i;:::-;1322:5;-1:-1:-1;1379:2:1;1364:18;;1351:32;1392:35;1351:32;1392:35;:::i;:::-;1446:7;1436:17;;;1144:315;;;;;:::o;1464:470::-;;;;1610:2;1598:9;1589:7;1585:23;1581:32;1578:2;;;1631:6;1623;1616:22;1578:2;1675:9;1662:23;1694:33;1721:5;1694:33;:::i;:::-;1746:5;-1:-1:-1;1803:2:1;1788:18;;1775:32;1816:35;1775:32;1816:35;:::i;:::-;1568:366;;1870:7;;-1:-1:-1;;;1924:2:1;1909:18;;;;1896:32;;1568:366::o;1939:830::-;;;;;2111:3;2099:9;2090:7;2086:23;2082:33;2079:2;;;2133:6;2125;2118:22;2079:2;2177:9;2164:23;2196:33;2223:5;2196:33;:::i;:::-;2248:5;-1:-1:-1;2305:2:1;2290:18;;2277:32;2318:35;2277:32;2318:35;:::i;:::-;2372:7;-1:-1:-1;2426:2:1;2411:18;;2398:32;;-1:-1:-1;2481:2:1;2466:18;;2453:32;2508:18;2497:30;;2494:2;;;2545:6;2537;2530:22;2494:2;2573:22;;2626:4;2618:13;;2614:27;-1:-1:-1;2604:2:1;;2660:6;2652;2645:22;2604:2;2688:75;2755:7;2750:2;2737:16;2732:2;2728;2724:11;2688:75;:::i;:::-;2678:85;;;2069:700;;;;;;;:::o;2774:329::-;;;2900:2;2888:9;2879:7;2875:23;2871:32;2868:2;;;2921:6;2913;2906:22;2868:2;2965:9;2952:23;2984:33;3011:5;2984:33;:::i;:::-;3036:5;-1:-1:-1;3060:37:1;3093:2;3078:18;;3060:37;:::i;:::-;3050:47;;2858:245;;;;;:::o;3108:327::-;;;3237:2;3225:9;3216:7;3212:23;3208:32;3205:2;;;3258:6;3250;3243:22;3205:2;3302:9;3289:23;3321:33;3348:5;3321:33;:::i;:::-;3373:5;3425:2;3410:18;;;;3397:32;;-1:-1:-1;;;3195:240:1:o;3440:192::-;;3549:2;3537:9;3528:7;3524:23;3520:32;3517:2;;;3570:6;3562;3555:22;3517:2;3598:28;3616:9;3598:28;:::i;3637:257::-;;3748:2;3736:9;3727:7;3723:23;3719:32;3716:2;;;3769:6;3761;3754:22;3716:2;3813:9;3800:23;3832:32;3858:5;3832:32;:::i;3899:261::-;;4021:2;4009:9;4000:7;3996:23;3992:32;3989:2;;;4042:6;4034;4027:22;3989:2;4079:9;4073:16;4098:32;4124:5;4098:32;:::i;4165:292::-;;4317:2;4305:9;4296:7;4292:23;4288:32;4285:2;;;4338:6;4330;4323:22;4285:2;4375:9;4369:16;4394:33;4421:5;4394:33;:::i;4462:482::-;;4584:2;4572:9;4563:7;4559:23;4555:32;4552:2;;;4605:6;4597;4590:22;4552:2;4650:9;4637:23;4683:18;4675:6;4672:30;4669:2;;;4720:6;4712;4705:22;4669:2;4748:22;;4801:4;4793:13;;4789:27;-1:-1:-1;4779:2:1;;4835:6;4827;4820:22;4779:2;4863:75;4930:7;4925:2;4912:16;4907:2;4903;4899:11;4863:75;:::i;4949:190::-;;5061:2;5049:9;5040:7;5036:23;5032:32;5029:2;;;5082:6;5074;5067:22;5029:2;-1:-1:-1;5110:23:1;;5019:120;-1:-1:-1;5019:120:1:o;5144:259::-;;5225:5;5219:12;5252:6;5247:3;5240:19;5268:63;5324:6;5317:4;5312:3;5308:14;5301:4;5294:5;5290:16;5268:63;:::i;:::-;5385:2;5364:15;-1:-1:-1;;5360:29:1;5351:39;;;;5392:4;5347:50;;5195:208;-1:-1:-1;;5195:208:1:o;5408:187::-;;5490:5;5484:12;5505:52;5550:6;5545:3;5538:4;5531:5;5527:16;5505:52;:::i;:::-;5573:16;;;;;5460:135;-1:-1:-1;;5460:135:1:o;5600:1258::-;5882:13;;5600:1258;;;;5955:1;5940:17;;5976:1;6012:18;;;;6039:2;;6093:4;6085:6;6081:17;6071:27;;6039:2;6119;6167;6159:6;6156:14;6136:18;6133:38;6130:2;;;-1:-1:-1;;;6194:33:1;;6250:4;6247:1;6240:15;6280:4;6201:3;6268:17;6130:2;6311:18;6338:104;;;;6456:1;6451:324;;;;6304:471;;6338:104;-1:-1:-1;;6371:24:1;;6359:37;;6416:16;;;;-1:-1:-1;6338:104:1;;6451:324;6487:39;6519:6;6487:39;:::i;:::-;6548:3;6564:165;6578:6;6575:1;6572:13;6564:165;;;6656:14;;6643:11;;;6636:35;6699:16;;;;6593:10;;6564:165;;;6568:3;;6758:6;6753:3;6749:16;6742:23;;6304:471;;;;;;;6791:61;6819:32;6847:3;6839:6;6819:32;:::i;:::-;6811:6;6791:61;:::i;:::-;6784:68;5832:1026;-1:-1:-1;;;;;;5832:1026:1:o;6863:205::-;7063:3;7054:14::o;7073:203::-;-1:-1:-1;;;;;7237:32:1;;;;7219:51;;7207:2;7192:18;;7174:102::o;7281:490::-;-1:-1:-1;;;;;7550:15:1;;;7532:34;;7602:15;;7597:2;7582:18;;7575:43;7649:2;7634:18;;7627:34;;;7697:3;7692:2;7677:18;;7670:31;;;7281:490;;7718:47;;7745:19;;7737:6;7718:47;:::i;7776:187::-;7941:14;;7934:22;7916:41;;7904:2;7889:18;;7871:92::o;7968:221::-;;8117:2;8106:9;8099:21;8137:46;8179:2;8168:9;8164:18;8156:6;8137:46;:::i;8194:398::-;8396:2;8378:21;;;8435:2;8415:18;;;8408:30;8474:34;8469:2;8454:18;;8447:62;-1:-1:-1;;;8540:2:1;8525:18;;8518:32;8582:3;8567:19;;8368:224::o;8597:329::-;8799:2;8781:21;;;8838:1;8818:18;;;8811:29;-1:-1:-1;;;8871:2:1;8856:18;;8849:36;8917:2;8902:18;;8771:155::o;8931:402::-;9133:2;9115:21;;;9172:2;9152:18;;;9145:30;9211:34;9206:2;9191:18;;9184:62;-1:-1:-1;;;9277:2:1;9262:18;;9255:36;9323:3;9308:19;;9105:228::o;9338:406::-;9540:2;9522:21;;;9579:2;9559:18;;;9552:30;9618:34;9613:2;9598:18;;9591:62;-1:-1:-1;;;9684:2:1;9669:18;;9662:40;9734:3;9719:19;;9512:232::o;9749:334::-;9951:2;9933:21;;;9990:2;9970:18;;;9963:30;-1:-1:-1;;;10024:2:1;10009:18;;10002:40;10074:2;10059:18;;9923:160::o;10088:346::-;10290:2;10272:21;;;10329:2;10309:18;;;10302:30;-1:-1:-1;;;10363:2:1;10348:18;;10341:52;10425:2;10410:18;;10262:172::o;10439:399::-;10641:2;10623:21;;;10680:2;10660:18;;;10653:30;10719:34;10714:2;10699:18;;10692:62;-1:-1:-1;;;10785:2:1;10770:18;;10763:33;10828:3;10813:19;;10613:225::o;10843:401::-;11045:2;11027:21;;;11084:2;11064:18;;;11057:30;11123:34;11118:2;11103:18;;11096:62;-1:-1:-1;;;11189:2:1;11174:18;;11167:35;11234:3;11219:19;;11017:227::o;11249:421::-;11451:2;11433:21;;;11490:2;11470:18;;;11463:30;11529:34;11524:2;11509:18;;11502:62;11600:27;11595:2;11580:18;;11573:55;11660:3;11645:19;;11423:247::o;11675:342::-;11877:2;11859:21;;;11916:2;11896:18;;;11889:30;-1:-1:-1;;;11950:2:1;11935:18;;11928:48;12008:2;11993:18;;11849:168::o;12022:407::-;12224:2;12206:21;;;12263:2;12243:18;;;12236:30;12302:34;12297:2;12282:18;;12275:62;-1:-1:-1;;;12368:2:1;12353:18;;12346:41;12419:3;12404:19;;12196:233::o;12434:345::-;12636:2;12618:21;;;12675:2;12655:18;;;12648:30;-1:-1:-1;;;12709:2:1;12694:18;;12687:51;12770:2;12755:18;;12608:171::o;12784:402::-;12986:2;12968:21;;;13025:2;13005:18;;;12998:30;13064:34;13059:2;13044:18;;13037:62;-1:-1:-1;;;13130:2:1;13115:18;;13108:36;13176:3;13161:19;;12958:228::o;13191:356::-;13393:2;13375:21;;;13412:18;;;13405:30;13471:34;13466:2;13451:18;;13444:62;13538:2;13523:18;;13365:182::o;13552:350::-;13754:2;13736:21;;;13793:2;13773:18;;;13766:30;13832:28;13827:2;13812:18;;13805:56;13893:2;13878:18;;13726:176::o;13907:414::-;14109:2;14091:21;;;14148:2;14128:18;;;14121:30;14187:34;14182:2;14167:18;;14160:62;-1:-1:-1;;;14253:2:1;14238:18;;14231:48;14311:3;14296:19;;14081:240::o;14326:346::-;14528:2;14510:21;;;14567:2;14547:18;;;14540:30;-1:-1:-1;;;14601:2:1;14586:18;;14579:52;14663:2;14648:18;;14500:172::o;14677:398::-;14879:2;14861:21;;;14918:2;14898:18;;;14891:30;14957:34;14952:2;14937:18;;14930:62;-1:-1:-1;;;15023:2:1;15008:18;;15001:32;15065:3;15050:19;;14851:224::o;15080:399::-;15282:2;15264:21;;;15321:2;15301:18;;;15294:30;15360:34;15355:2;15340:18;;15333:62;-1:-1:-1;;;15426:2:1;15411:18;;15404:33;15469:3;15454:19;;15254:225::o;15484:415::-;15686:2;15668:21;;;15725:2;15705:18;;;15698:30;15764:34;15759:2;15744:18;;15737:62;-1:-1:-1;;;15830:2:1;15815:18;;15808:49;15889:3;15874:19;;15658:241::o;15904:353::-;16106:2;16088:21;;;16145:2;16125:18;;;16118:30;16184:31;16179:2;16164:18;;16157:59;16248:2;16233:18;;16078:179::o;16262:397::-;16464:2;16446:21;;;16503:2;16483:18;;;16476:30;16542:34;16537:2;16522:18;;16515:62;-1:-1:-1;;;16608:2:1;16593:18;;16586:31;16649:3;16634:19;;16436:223::o;16664:338::-;16866:2;16848:21;;;16905:2;16885:18;;;16878:30;-1:-1:-1;;;16939:2:1;16924:18;;16917:44;16993:2;16978:18;;16838:164::o;17007:410::-;17209:2;17191:21;;;17248:2;17228:18;;;17221:30;17287:34;17282:2;17267:18;;17260:62;-1:-1:-1;;;17353:2:1;17338:18;;17331:44;17407:3;17392:19;;17181:236::o;17838:409::-;18040:2;18022:21;;;18079:2;18059:18;;;18052:30;18118:34;18113:2;18098:18;;18091:62;-1:-1:-1;;;18184:2:1;18169:18;;18162:43;18237:3;18222:19;;18012:235::o;18252:177::-;18398:25;;;18386:2;18371:18;;18353:76::o;18434:129::-;;18502:17;;;18552:4;18536:21;;;18492:71::o;18568:253::-;;-1:-1:-1;;;;;18697:2:1;18694:1;18690:10;18727:2;18724:1;18720:10;18758:3;18754:2;18750:12;18745:3;18742:21;18739:2;;;18766:18;;:::i;:::-;18802:13;;18616:205;-1:-1:-1;;;;18616:205:1:o;18826:128::-;;18897:1;18893:6;18890:1;18887:13;18884:2;;;18903:18;;:::i;:::-;-1:-1:-1;18939:9:1;;18874:80::o;18959:120::-;;19025:1;19015:2;;19030:18;;:::i;:::-;-1:-1:-1;19064:9:1;;19005:74::o;19084:168::-;;19190:1;19186;19182:6;19178:14;19175:1;19172:21;19167:1;19160:9;19153:17;19149:45;19146:2;;;19197:18;;:::i;:::-;-1:-1:-1;19237:9:1;;19136:116::o;19257:125::-;;19325:1;19322;19319:8;19316:2;;;19330:18;;:::i;:::-;-1:-1:-1;19367:9:1;;19306:76::o;19387:258::-;19459:1;19469:113;19483:6;19480:1;19477:13;19469:113;;;19559:11;;;19553:18;19540:11;;;19533:39;19505:2;19498:10;19469:113;;;19600:6;19597:1;19594:13;19591:2;;;-1:-1:-1;;19635:1:1;19617:16;;19610:27;19440:205::o;19650:136::-;;19717:5;19707:2;;19726:18;;:::i;:::-;-1:-1:-1;;;19762:18:1;;19697:89::o;19791:380::-;19876:1;19866:12;;19923:1;19913:12;;;19934:2;;19988:4;19980:6;19976:17;19966:27;;19934:2;20041;20033:6;20030:14;20010:18;20007:38;20004:2;;;20087:10;20082:3;20078:20;20075:1;20068:31;20122:4;20119:1;20112:15;20150:4;20147:1;20140:15;20004:2;;19846:325;;;:::o;20176:135::-;;-1:-1:-1;;20236:17:1;;20233:2;;;20256:18;;:::i;:::-;-1:-1:-1;20303:1:1;20292:13;;20223:88::o;20316:112::-;;20374:1;20364:2;;20379:18;;:::i;:::-;-1:-1:-1;20413:9:1;;20354:74::o;20433:127::-;20494:10;20489:3;20485:20;20482:1;20475:31;20525:4;20522:1;20515:15;20549:4;20546:1;20539:15;20565:127;20626:10;20621:3;20617:20;20614:1;20607:31;20657:4;20654:1;20647:15;20681:4;20678:1;20671:15;20697:127;20758:10;20753:3;20749:20;20746:1;20739:31;20789:4;20786:1;20779:15;20813:4;20810:1;20803:15;20829:133;-1:-1:-1;;;;;20906:31:1;;20896:42;;20886:2;;20952:1;20949;20942:12;20967:133;-1:-1:-1;;;;;;21043:32:1;;21033:43;;21023:2;;21090:1;21087;21080:12

Swarm Source

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