ETH Price: $2,522.97 (-5.07%)

Token

Shib's of football by $WCI (WCI NFT)
 

Overview

Max Total Supply

2,500 WCI NFT

Holders

359

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
20 WCI NFT
0x761493a52595F7016493b4a7515180d504CdF28f
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:
WCINFT

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-18
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface 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);
}

/**
 * @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;
}
/**
 * @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);
}
/**
 * @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);
}
/**
 * @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);
            }
        }
    }
}

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

/**
 * @dev 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;
    }
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    function _multiMint(uint256 amount, address to) internal virtual {
        unchecked {
            _balances[to] += amount;
        }
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

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

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

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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


        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

/**
 * @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);
}

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

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

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

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

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

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

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in paused state.
     */
    constructor() {
        _paused = true;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
}

contract WCINFT is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable {
    bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;
    bytes4 internal constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a;
    using Strings for uint256;

    uint256 public currentId = 1;

    uint256 gas = 5000000;

    address public constant feeReceiver = 0xCa99f437DE3Af9879b58ea9aD8d856c4b586FFAc;

    uint256 private _royaltyBps;
    address payable private _royaltyRecipient;

    IERC20 constant WCIContract = IERC20(0xC5a9BC46A7dbe1c6dE493E84A18f02E70E2c5A32);

    uint256 private status = 0;
    
    uint256 public constant mintingLimit = 10000;

    uint256 public constant price = 6 * 10**16;
    uint256 public constant whitelistPrice = 5 * 10**16;

    mapping(address => bool) _whitelist;
    uint256 public maxMint = 10;
    uint256 public maxWhitelistMint = 20;
    string baseURI = "";
    string placeholderURI;
    string constant baseExtension = ".json";

    uint256 public futureBlock;
    uint256 public randomShift;

    constructor() ERC721("Shib's of football by $WCI", "WCI NFT") {
      _royaltyBps = 750;
      _royaltyRecipient = payable(feeReceiver);
    }
    
    function setBaseURI(string calldata _base, bool randomize) external onlyOwner {
        require(randomShift == 0, "Already randomized");
        baseURI = _base;
        if(randomize) {
          require(futureBlock > 0, "Random block not primed, run primeRandom function");
          reveal();
        }
    }

    function setPlaceholderURI(string calldata _placeholder) external onlyOwner {
        placeholderURI = _placeholder;
    }
    
    function setMaxMint(uint256 _maxMint, uint256 _maxWhitelistMint) external onlyOwner {
        maxMint = _maxMint;
        maxWhitelistMint = _maxWhitelistMint;
    }

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

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function batchMint(uint256[] calldata amount, address[] calldata _to) external onlyOwner {
        require(status == 0, "Cannot airdrop once paid minting has started");
      for(uint256 i = 0; i < amount.length; i++) {
        _mintNFTs(amount[i], _to[i]);
      }
    }

   function mint(uint256 amount, address _to) external onlyOwner {
       require(status == 0, "Cannot airdrop once paid minting has started");
       _mintNFTs(amount, _to);
    }

    function mint(uint256 amount) external payable whenNotPaused {
        require(status > 0, "Minting not started yet");
        bool whitelisted = whitelist(msg.sender);
        uint256 limit = whitelisted ? maxWhitelistMint : maxMint;
        require(amount <= limit && amount > 0 && balanceOf(msg.sender) + amount <= limit, "Minting limits exceeded");

        bool isHolding = 5000 * 10**9 <= WCIContract.balanceOf(msg.sender);

        if (status == 1) {
            require(whitelisted, "Sorry, whitelist minting only");
        } else if (status == 2) {
            require(isHolding, "You don't have 5,000 $WSI tokens");
        }

        unchecked{
        uint256 totalCost = (whitelisted || isHolding ? whitelistPrice : price) * amount;
        require (msg.value == totalCost, "Incorrect amount paid");
        bool success;
        (success, ) = feeReceiver.call{value: msg.value}("");
        require(success, "Failed to transfer payment");  
        }
        
        _mintNFTs(amount, msg.sender);
    }

    function _mintNFTs(uint256 amount, address to) internal {       
      uint256 mintId = currentId;

      unchecked{
        require ((mintId-1) + amount <= mintingLimit, "Not enough NFTs remaining");
        
        for (uint256 i = 0; i < amount; i++){
            _safeMint(to, mintId);
            mintId++;
        }
        currentId = mintId;
      }

      _multiMint(amount, to);
    }

    function claimFunds() external onlyOwner {
      bool success;
      (success, ) = feeReceiver.call{value: address(this).balance}("");      
    }

    function setAllowWhiteListMint() external onlyOwner {
        status = 1;
    }

    function setAllowHolderMint() external onlyOwner {
        status = 2;
    }

    function setAllowPublicMint() external onlyOwner {
        status = 3;
    }

    function mintStatus() public view returns (string memory) {
        if (status == 1) {
            return "Whitelist minting";
        } else if (status == 2) {
            return "5,000 $WCI holder minting";
        } else if (status == 3) {
            return "Public minting";
        } else return "Minting not open yet";
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 _tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        require(_exists(_tokenId), "ERC721URIStorage: URI query for nonexistent token");
        string memory _tokenURI = _tokenURIs[_tokenId];
        string memory base = _baseURI();

        if (bytes(_tokenURI).length > 0) {
            return _tokenURI;
        }

        if (bytes(base).length > 0) {
            if(randomShift > 0) {
              uint256 totalMinted = totalSupply();
              uint256 shift = randomShift % totalMinted;
              _tokenId += shift;
              if (_tokenId > totalMinted) _tokenId -= totalMinted;
            }
            return concatenate(base, _tokenId.toString(), baseExtension);
        }

        if (bytes(placeholderURI).length > 0) {
            return placeholderURI;
        }

        return super.tokenURI(_tokenId);
    } 

    function listMyNFTs(address me, uint256 start, uint256 limit, uint256 _gas) external view returns (uint256[] memory myNFTIDs, string[] memory myNFTuris, uint256 lastId) {
        uint256 balance = balanceOf(me);
        if (limit == 0) limit = 1;
        if (balance > 0) {
            if (start >= balance) start = balance-1;
            if (start + limit > balance) limit = balance - start;

            myNFTIDs = new uint256[](limit);
            myNFTuris = new string[](limit);
            
            uint256 gasUsed = 0;
            uint256 gasLeft = gasleft();
            
            for (uint256 i=0; gasUsed < (_gas > 0 ? _gas : gas) && i < limit; i++) {
                lastId = i+start;
                uint256 id = tokenOfOwnerByIndex(me, lastId);
                myNFTIDs[i] = id;
                myNFTuris[i] = tokenURI(id);
                
                gasUsed = gasUsed + (gasLeft - gasleft());
                gasLeft = gasleft();
            }
        }
    }

    function remaining() external view returns(uint256) {
        return mintingLimit - (currentId-1);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981;
    }

    function updateRoyalties(address payable recipient, uint256 bps) external onlyOwner {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
    }

    function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) {
        return (_royaltyRecipient, value*_royaltyBps/10000);
    }

    function loadWhitelist(address[] calldata addressList, bool _listed) external onlyOwner {
      for (uint256 i = 0; i < addressList.length; i++) {
          _whitelist[addressList[i]] = _listed;
      }
    }

    function whitelist(address _wallet) public view returns(bool) {
        return 35000 * 10**9 <= WCIContract.balanceOf(_wallet) || _whitelist[_wallet];
    }

    function primeRandom() external onlyOwner {
        require(futureBlock == 0 || (block.number - futureBlock > 256 && randomShift == 0), "Already primed");
        futureBlock = block.number + 5;
    }

    function reveal() internal {
        require(futureBlock != 0, "Randomization not started");
        require(randomShift == 0, "Already randomized");
        require(block.number >= futureBlock, "Must wait at least 5 blocks");
        require(block.number - futureBlock < 256, "Waited too long");
        randomShift = uint256(blockhash(futureBlock));
    }

    function concatenate(string memory a, string memory b, string memory c) internal pure returns (string memory) {
        return string(abi.encodePacked(a, b, c));
    }
}

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futureBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"me","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"_gas","type":"uint256"}],"name":"listMyNFTs","outputs":[{"internalType":"uint256[]","name":"myNFTIDs","type":"uint256[]"},{"internalType":"string[]","name":"myNFTuris","type":"string[]"},{"internalType":"uint256","name":"lastId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"},{"internalType":"bool","name":"_listed","type":"bool"}],"name":"loadWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"primeRandom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"randomShift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAllowHolderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAllowPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAllowWhiteListMint","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":"_base","type":"string"},{"internalType":"bool","name":"randomize","type":"bool"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"},{"internalType":"uint256","name":"_maxWhitelistMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholder","type":"string"}],"name":"setPlaceholderURI","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6001600c55624c4b40600d5560006010819055600a6012556014601381905560a06040526080918252906200003590826200020d565b503480156200004357600080fd5b506040518060400160405280601a81526020017f536869622773206f6620666f6f7462616c6c20627920245743490000000000008152506040518060400160405280600781526020016615d0d24813919560ca1b8152508160009081620000ab91906200020d565b506001620000ba82826200020d565b5050600b805460ff1916600117905550620000dc620000d63390565b6200010e565b6102ee600e55600f80546001600160a01b03191673ca99f437de3af9879b58ea9ad8d856c4b586ffac179055620002d9565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200019357607f821691505b602082108103620001b457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020857600081815260208120601f850160051c81016020861015620001e35750805b601f850160051c820191505b818110156200020457828155600101620001ef565b5050505b505050565b81516001600160401b0381111562000229576200022962000168565b62000241816200023a84546200017e565b84620001ba565b602080601f831160018114620002795760008415620002605750858301515b600019600386901b1c1916600185901b17855562000204565b600085815260208120601f198616915b82811015620002aa5788860151825594840194600190910190840162000289565b5085821015620002c95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61399d80620002e96000396000f3fe6080604052600436106102c95760003560e01c80638456cb5911610175578063ac307773116100dc578063de5f386811610095578063f008de191161006f578063f008de1914610866578063f2fde38b1461087c578063fc1a1c361461089c578063fcaea0d4146108b757600080fd5b8063de5f3868146107e7578063e00dd16114610807578063e985e9c51461081d57600080fd5b8063ac30777314610735578063b3f006741461074a578063b64b21ca14610772578063b88d4fde14610792578063bc0688da146107b2578063c87b56dd146107c757600080fd5b80639da3f8fd1161012e5780639da3f8fd1461068e578063a035b1fe146106a3578063a0712d68146106be578063a22cb465146106d1578063a5e77397146106f1578063ab95dd0a1461070657600080fd5b80638456cb59146105eb5780638da5cb5b146106005780639429684c1461062357806394bf804d1461063957806395d89b41146106595780639b19251a1461066e57600080fd5b80633f4ba83a116102345780635a86c41a116101ed5780636c2f5acd116101c75780636c2f5acd1461058057806370a08231146105a0578063715018a6146105c05780637501f741146105d557600080fd5b80635a86c41a146105285780635c975abb146105485780636352211e1461056057600080fd5b80633f4ba83a1461048857806342842e0e1461049d57806342966c68146104bd57806349072f12146104dd5780634f6ccce7146104f357806355234ec01461051357600080fd5b806321edc4cb1161028657806321edc4cb146103b357806323b872dd146103d35780632a55205a146103f35780632f745c5914610432578063309a3686146104525780633574a2dd1461046857600080fd5b806301ffc9a7146102ce578063026948501461030357806306fdde031461031a578063081812fc1461033c578063095ea7b31461037457806318160ddd14610394575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612f5a565b6108cc565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186108f8565b005b34801561032657600080fd5b5061032f610938565b6040516102fa9190612fc7565b34801561034857600080fd5b5061035c610357366004612fda565b6109ca565b6040516001600160a01b0390911681526020016102fa565b34801561038057600080fd5b5061031861038f366004613008565b610a52565b3480156103a057600080fd5b506008545b6040519081526020016102fa565b3480156103bf57600080fd5b506103186103ce366004613034565b610b67565b3480156103df57600080fd5b506103186103ee366004613056565b610ba2565b3480156103ff57600080fd5b5061041361040e366004613034565b610bd4565b604080516001600160a01b0390931683526020830191909152016102fa565b34801561043e57600080fd5b506103a561044d366004613008565b610c0f565b34801561045e57600080fd5b506103a560135481565b34801561047457600080fd5b506103186104833660046130d9565b610ca5565b34801561049457600080fd5b50610318610ce2565b3480156104a957600080fd5b506103186104b8366004613056565b610d1c565b3480156104c957600080fd5b506103186104d8366004612fda565b610d37565b3480156104e957600080fd5b506103a561271081565b3480156104ff57600080fd5b506103a561050e366004612fda565b610db1565b34801561051f57600080fd5b506103a5610e44565b34801561053457600080fd5b50610318610543366004613160565b610e66565b34801561055457600080fd5b50600b5460ff166102ee565b34801561056c57600080fd5b5061035c61057b366004612fda565b610f22565b34801561058c57600080fd5b5061031861059b366004613008565b610f99565b3480156105ac57600080fd5b506103a56105bb3660046131cc565b610fef565b3480156105cc57600080fd5b50610318611076565b3480156105e157600080fd5b506103a560125481565b3480156105f757600080fd5b506103186110b0565b34801561060c57600080fd5b50600b5461010090046001600160a01b031661035c565b34801561062f57600080fd5b506103a560165481565b34801561064557600080fd5b506103186106543660046131e9565b6110e8565b34801561066557600080fd5b5061032f611146565b34801561067a57600080fd5b506102ee6106893660046131cc565b611155565b34801561069a57600080fd5b5061032f611202565b3480156106af57600080fd5b506103a566d529ae9e86000081565b6103186106cc366004612fda565b6112de565b3480156106dd57600080fd5b506103186106ec36600461322e565b611677565b3480156106fd57600080fd5b50610318611682565b34801561071257600080fd5b50610726610721366004613263565b611727565b6040516102fa9392919061329e565b34801561074157600080fd5b506103186118db565b34801561075657600080fd5b5061035c73ca99f437de3af9879b58ea9ad8d856c4b586ffac81565b34801561077e57600080fd5b5061031861078d36600461333f565b611961565b34801561079e57600080fd5b506103186107ad3660046133a9565b611a5e565b3480156107be57600080fd5b50610318611a90565b3480156107d357600080fd5b5061032f6107e2366004612fda565b611ac7565b3480156107f357600080fd5b50610318610802366004613489565b611ce0565b34801561081357600080fd5b506103a5600c5481565b34801561082957600080fd5b506102ee6108383660046134c1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561087257600080fd5b506103a560175481565b34801561088857600080fd5b506103186108973660046131cc565b611d81565b3480156108a857600080fd5b506103a566b1a2bc2ec5000081565b3480156108c357600080fd5b50610318611e1f565b60006108d782611e56565b806108f257506001600160e01b0319821663152a902d60e11b145b92915050565b600b546001600160a01b036101009091041633146109315760405162461bcd60e51b8152600401610928906134ef565b60405180910390fd5b6002601055565b60606000805461094790613524565b80601f016020809104026020016040519081016040528092919081815260200182805461097390613524565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611e7b565b610a365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610928565b506000908152600460205260409020546001600160a01b031690565b6000610a5d82610f22565b9050806001600160a01b0316836001600160a01b031603610aca5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610928565b336001600160a01b0382161480610ae65750610ae68133610838565b610b585760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610928565b610b628383611e98565b505050565b600b546001600160a01b03610100909104163314610b975760405162461bcd60e51b8152600401610928906134ef565b601291909155601355565b610bad335b82611f06565b610bc95760405162461bcd60e51b81526004016109289061355e565b610b62838383611fec565b600f54600e5460009182916001600160a01b039091169061271090610bf990866135c5565b610c0391906135f2565b915091505b9250929050565b6000610c1a83610fef565b8210610c7c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610928565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b03610100909104163314610cd55760405162461bcd60e51b8152600401610928906134ef565b6015610b62828483613654565b600b546001600160a01b03610100909104163314610d125760405162461bcd60e51b8152600401610928906134ef565b610d1a612197565b565b610b6283838360405180602001604052806000815250611a5e565b610d4033610ba7565b610da55760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610928565b610dae8161222a565b50565b6000610dbc60085490565b8210610e1f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610928565b60088281548110610e3257610e32613714565b90600052602060002001549050919050565b60006001600c54610e55919061372a565b610e619061271061372a565b905090565b600b546001600160a01b03610100909104163314610e965760405162461bcd60e51b8152600401610928906134ef565b60105415610eb65760405162461bcd60e51b81526004016109289061373d565b60005b83811015610f1b57610f09858583818110610ed657610ed6613714565b90506020020135848484818110610eef57610eef613714565b9050602002016020810190610f0491906131cc565b612233565b80610f1381613789565b915050610eb9565b5050505050565b6000818152600260205260408120546001600160a01b0316806108f25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610928565b600b546001600160a01b03610100909104163314610fc95760405162461bcd60e51b8152600401610928906134ef565b600f80546001600160a01b0319166001600160a01b039390931692909217909155600e55565b60006001600160a01b03821661105a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610928565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b036101009091041633146110a65760405162461bcd60e51b8152600401610928906134ef565b610d1a60006122d4565b600b546001600160a01b036101009091041633146110e05760405162461bcd60e51b8152600401610928906134ef565b610d1a61232e565b600b546001600160a01b036101009091041633146111185760405162461bcd60e51b8152600401610928906134ef565b601054156111385760405162461bcd60e51b81526004016109289061373d565b6111428282612233565b5050565b60606001805461094790613524565b6040516370a0823160e01b81526001600160a01b038216600482015260009073c5a9bc46a7dbe1c6de493e84a18f02e70e2c5a32906370a0823190602401602060405180830381865afa1580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d491906137a2565b651fd5129130001115806108f25750506001600160a01b031660009081526011602052604090205460ff1690565b606060105460010361123a575060408051808201909152601181527057686974656c697374206d696e74696e6760781b602082015290565b60105460020361127c575060408051808201909152601981527f352c303030202457434920686f6c646572206d696e74696e6700000000000000602082015290565b6010546003036112af575060408051808201909152600e81526d5075626c6963206d696e74696e6760901b602082015290565b50604080518082019091526014815273135a5b9d1a5b99c81b9bdd081bdc195b881e595d60621b602082015290565b600b5460ff16156113245760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610928565b6000601054116113765760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206e6f742073746172746564207965740000000000000000006044820152606401610928565b600061138133611155565b905060008161139257601254611396565b6013545b90508083111580156113a85750600083115b80156113c7575080836113ba33610fef565b6113c491906137bb565b11155b6114135760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206c696d6974732065786365656465640000000000000000006044820152606401610928565b6040516370a0823160e01b815233600482015260009073c5a9bc46a7dbe1c6de493e84a18f02e70e2c5a32906370a0823190602401602060405180830381865afa158015611465573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148991906137a2565b65048c27395000111590506010546001036114f057826114eb5760405162461bcd60e51b815260206004820152601d60248201527f536f7272792c2077686974656c697374206d696e74696e67206f6e6c790000006044820152606401610928565b611547565b60105460020361154757806115475760405162461bcd60e51b815260206004820181905260248201527f596f7520646f6e2774206861766520352c303030202457534920746f6b656e736044820152606401610928565b60008484806115535750825b6115645766d529ae9e86000061156d565b66b1a2bc2ec500005b0290508034146115b75760405162461bcd60e51b8152602060048201526015602482015274125b98dbdc9c9958dd08185b5bdd5b9d081c185a59605a1b6044820152606401610928565b60405160009073ca99f437de3af9879b58ea9ad8d856c4b586ffac9034908381818185875af1925050503d806000811461160d576040519150601f19603f3d011682016040523d82523d6000602084013e611612565b606091505b505080915050806116655760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f207472616e73666572207061796d656e740000000000006044820152606401610928565b50506116718433612233565b50505050565b6111423383836123a9565b600b546001600160a01b036101009091041633146116b25760405162461bcd60e51b8152600401610928906134ef565b60165415806116da5750610100601654436116cd919061372a565b1180156116da5750601754155b6117175760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481c1c9a5b595960921b6044820152606401610928565b6117224360056137bb565b601655565b60608060008061173688610fef565b90508560000361174557600195505b80156118d0578087106117605761175d60018261372a565b96505b8061176b87896137bb565b111561177e5761177b878261372a565b95505b8567ffffffffffffffff81111561179757611797613393565b6040519080825280602002602001820160405280156117c0578160200160208202803683370190505b5093508567ffffffffffffffff8111156117dc576117dc613393565b60405190808252806020026020018201604052801561180f57816020015b60608152602001906001900390816117fa5790505b5092506000805a905060005b6000881161182b57600d5461182d565b875b8310801561183a57508881105b156118cc576118498a826137bb565b945060006118578c87610c0f565b90508088838151811061186c5761186c613714565b60200260200101818152505061188181611ac7565b87838151811061189357611893613714565b60200260200101819052505a6118a9908461372a565b6118b390856137bb565b93505a92505080806118c490613789565b91505061181b565b5050505b509450945094915050565b600b546001600160a01b0361010090910416331461190b5760405162461bcd60e51b8152600401610928906134ef565b60405160009073ca99f437de3af9879b58ea9ad8d856c4b586ffac9047908381818185875af1925050503d8060008114611671576040519150601f19603f3d011682016040523d82523d6000602084013e611671565b600b546001600160a01b036101009091041633146119915760405162461bcd60e51b8152600401610928906134ef565b601754156119d65760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481c985b991bdb5a5e995960721b6044820152606401610928565b60146119e3838583613654565b508015610b6257600060165411611a565760405162461bcd60e51b815260206004820152603160248201527f52616e646f6d20626c6f636b206e6f74207072696d65642c2072756e2070726960448201527036b2a930b73237b690333ab731ba34b7b760791b6064820152608401610928565b610b62612477565b611a683383611f06565b611a845760405162461bcd60e51b81526004016109289061355e565b611671848484846125b9565b600b546001600160a01b03610100909104163314611ac05760405162461bcd60e51b8152600401610928906134ef565b6001601055565b6060611ad282611e7b565b611aee5760405162461bcd60e51b8152600401610928906137ce565b6000828152600a602052604081208054611b0790613524565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3390613524565b8015611b805780601f10611b5557610100808354040283529160200191611b80565b820191906000526020600020905b815481529060010190602001808311611b6357829003601f168201915b505050505090506000611b916125ec565b825190915015611ba2575092915050565b805115611c2c5760175415611bf4576000611bbc60085490565b9050600081601754611bce919061381f565b9050611bda81876137bb565b955081861115611bf157611bee828761372a565b95505b50505b611c2481611c01866125fb565b60405180604001604052806005815260200164173539b7b760d91b8152506126fc565b949350505050565b600060158054611c3b90613524565b90501115611cd75760158054611c5090613524565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7c90613524565b8015611cc95780601f10611c9e57610100808354040283529160200191611cc9565b820191906000526020600020905b815481529060010190602001808311611cac57829003601f168201915b505050505092505050919050565b611c248461272b565b600b546001600160a01b03610100909104163314611d105760405162461bcd60e51b8152600401610928906134ef565b60005b82811015611671578160116000868685818110611d3257611d32613714565b9050602002016020810190611d4791906131cc565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611d7981613789565b915050611d13565b600b546001600160a01b03610100909104163314611db15760405162461bcd60e51b8152600401610928906134ef565b6001600160a01b038116611e165760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610928565b610dae816122d4565b600b546001600160a01b03610100909104163314611e4f5760405162461bcd60e51b8152600401610928906134ef565b6003601055565b60006001600160e01b0319821663780e9d6360e01b14806108f257506108f282612842565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ecd82610f22565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f1182611e7b565b611f725760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610928565b6000611f7d83610f22565b9050806001600160a01b0316846001600160a01b03161480611fb85750836001600160a01b0316611fad846109ca565b6001600160a01b0316145b80611c2457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611c24565b826001600160a01b0316611fff82610f22565b6001600160a01b0316146120675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610928565b6001600160a01b0382166120c95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610928565b6120d4838383612892565b6120df600082611e98565b6001600160a01b038316600090815260036020526040812080546001929061210890849061372a565b90915550506001600160a01b03821660009081526003602052604081208054600192906121369084906137bb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b5460ff166121e05760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610928565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610dae8161289d565b600c5461271083820160001901111561228e5760405162461bcd60e51b815260206004820152601960248201527f4e6f7420656e6f756768204e4654732072656d61696e696e67000000000000006044820152606401610928565b60005b838110156122af576122a383836128dd565b60019182019101612291565b50600c556001600160a01b031660009081526003602052604090208054919091019055565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b5460ff16156123745760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610928565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861220d3390565b816001600160a01b0316836001600160a01b03160361240a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610928565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6016546000036124c95760405162461bcd60e51b815260206004820152601960248201527f52616e646f6d697a6174696f6e206e6f742073746172746564000000000000006044820152606401610928565b6017541561250e5760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481c985b991bdb5a5e995960721b6044820152606401610928565b6016544310156125605760405162461bcd60e51b815260206004820152601b60248201527f4d7573742077616974206174206c65617374203520626c6f636b7300000000006044820152606401610928565b61010060165443612571919061372a565b106125b05760405162461bcd60e51b815260206004820152600f60248201526e57616974656420746f6f206c6f6e6760881b6044820152606401610928565b60165440601755565b6125c4848484611fec565b6125d0848484846128f7565b6116715760405162461bcd60e51b815260040161092890613833565b60606014805461094790613524565b6060816000036126225750506040805180820190915260018152600360fc1b602082015290565b8160005b811561264c578061263681613789565b91506126459050600a836135f2565b9150612626565b60008167ffffffffffffffff81111561266757612667613393565b6040519080825280601f01601f191660200182016040528015612691576020820181803683370190505b5090505b8415611c24576126a660018361372a565b91506126b3600a8661381f565b6126be9060306137bb565b60f81b8183815181106126d3576126d3613714565b60200101906001600160f81b031916908160001a9053506126f5600a866135f2565b9450612695565b606083838360405160200161271393929190613885565b60405160208183030381529060405290509392505050565b606061273682611e7b565b6127525760405162461bcd60e51b8152600401610928906137ce565b6000828152600a60205260408120805461276b90613524565b80601f016020809104026020016040519081016040528092919081815260200182805461279790613524565b80156127e45780601f106127b9576101008083540402835291602001916127e4565b820191906000526020600020905b8154815290600101906020018083116127c757829003601f168201915b5050505050905060006127f56125ec565b90508051600003612807575092915050565b8151156128395780826040516020016128219291906138c8565b60405160208183030381529060405292505050919050565b611c24846129f8565b60006001600160e01b031982166380ac58cd60e01b148061287357506001600160e01b03198216635b5e139f60e01b145b806108f257506301ffc9a760e01b6001600160e01b03198316146108f2565b610b62838383612ac3565b6128a681612b7b565b6000818152600a6020526040902080546128bf90613524565b159050610dae576000818152600a60205260408120610dae91612ef6565b611142828260405180602001604052806000815250612c22565b60006001600160a01b0384163b156129ed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061293b9033908990889088906004016138f7565b6020604051808303816000875af1925050508015612976575060408051601f3d908101601f1916820190925261297391810190613934565b60015b6129d3573d8080156129a4576040519150601f19603f3d011682016040523d82523d6000602084013e6129a9565b606091505b5080516000036129cb5760405162461bcd60e51b815260040161092890613833565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c24565b506001949350505050565b6060612a0382611e7b565b612a675760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610928565b6000612a716125ec565b90506000815111612a915760405180602001604052806000815250612abc565b80612a9b846125fb565b604051602001612aac9291906138c8565b6040516020818303038152906040525b9392505050565b6001600160a01b038316612b1e57612b1981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b41565b816001600160a01b0316836001600160a01b031614612b4157612b418382612c55565b6001600160a01b038216612b5857610b6281612cf2565b826001600160a01b0316826001600160a01b031614610b6257610b628282612da1565b6000612b8682610f22565b9050612b9481600084612892565b612b9f600083611e98565b6001600160a01b0381166000908152600360205260408120805460019290612bc890849061372a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b612c2c8383612de5565b612c3960008484846128f7565b610b625760405162461bcd60e51b815260040161092890613833565b60006001612c6284610fef565b612c6c919061372a565b600083815260076020526040902054909150808214612cbf576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d049060019061372a565b60008381526009602052604081205460088054939450909284908110612d2c57612d2c613714565b906000526020600020015490508060088381548110612d4d57612d4d613714565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612d8557612d85613951565b6001900381819060005260206000200160009055905550505050565b6000612dac83610fef565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612e3b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610928565b612e4481611e7b565b15612e915760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610928565b612e9d60008383612892565b60008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b508054612f0290613524565b6000825580601f10612f12575050565b601f016020900490600052602060002090810190610dae91905b80821115612f405760008155600101612f2c565b5090565b6001600160e01b031981168114610dae57600080fd5b600060208284031215612f6c57600080fd5b8135612abc81612f44565b60005b83811015612f92578181015183820152602001612f7a565b50506000910152565b60008151808452612fb3816020860160208601612f77565b601f01601f19169290920160200192915050565b602081526000612abc6020830184612f9b565b600060208284031215612fec57600080fd5b5035919050565b6001600160a01b0381168114610dae57600080fd5b6000806040838503121561301b57600080fd5b823561302681612ff3565b946020939093013593505050565b6000806040838503121561304757600080fd5b50508035926020909101359150565b60008060006060848603121561306b57600080fd5b833561307681612ff3565b9250602084013561308681612ff3565b929592945050506040919091013590565b60008083601f8401126130a957600080fd5b50813567ffffffffffffffff8111156130c157600080fd5b602083019150836020828501011115610c0857600080fd5b600080602083850312156130ec57600080fd5b823567ffffffffffffffff81111561310357600080fd5b61310f85828601613097565b90969095509350505050565b60008083601f84011261312d57600080fd5b50813567ffffffffffffffff81111561314557600080fd5b6020830191508360208260051b8501011115610c0857600080fd5b6000806000806040858703121561317657600080fd5b843567ffffffffffffffff8082111561318e57600080fd5b61319a8883890161311b565b909650945060208701359150808211156131b357600080fd5b506131c08782880161311b565b95989497509550505050565b6000602082840312156131de57600080fd5b8135612abc81612ff3565b600080604083850312156131fc57600080fd5b82359150602083013561320e81612ff3565b809150509250929050565b8035801515811461322957600080fd5b919050565b6000806040838503121561324157600080fd5b823561324c81612ff3565b915061325a60208401613219565b90509250929050565b6000806000806080858703121561327957600080fd5b843561328481612ff3565b966020860135965060408601359560600135945092505050565b606080825284519082018190526000906020906080840190828801845b828110156132d7578151845292840192908401906001016132bb565b50505083810382850152855180825282820190600581901b8301840188850160005b8381101561332757601f19868403018552613315838351612f9b565b948701949250908601906001016132f9565b50508095505050505050826040830152949350505050565b60008060006040848603121561335457600080fd5b833567ffffffffffffffff81111561336b57600080fd5b61337786828701613097565b909450925061338a905060208501613219565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156133bf57600080fd5b84356133ca81612ff3565b935060208501356133da81612ff3565b925060408501359150606085013567ffffffffffffffff808211156133fe57600080fd5b818701915087601f83011261341257600080fd5b81358181111561342457613424613393565b604051601f8201601f19908116603f0116810190838211818310171561344c5761344c613393565b816040528281528a602084870101111561346557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060006040848603121561349e57600080fd5b833567ffffffffffffffff8111156134b557600080fd5b6133778682870161311b565b600080604083850312156134d457600080fd5b82356134df81612ff3565b9150602083013561320e81612ff3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061353857607f821691505b60208210810361355857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108f2576108f26135af565b634e487b7160e01b600052601260045260246000fd5b600082613601576136016135dc565b500490565b601f821115610b6257600081815260208120601f850160051c8101602086101561362d5750805b601f850160051c820191505b8181101561364c57828155600101613639565b505050505050565b67ffffffffffffffff83111561366c5761366c613393565b6136808361367a8354613524565b83613606565b6000601f8411600181146136b4576000851561369c5750838201355b600019600387901b1c1916600186901b178355610f1b565b600083815260209020601f19861690835b828110156136e557868501358255602094850194600190920191016136c5565b50868210156137025760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b818103818111156108f2576108f26135af565b6020808252602c908201527f43616e6e6f742061697264726f70206f6e63652070616964206d696e74696e6760408201526b081a185cc81cdd185c9d195960a21b606082015260800190565b60006001820161379b5761379b6135af565b5060010190565b6000602082840312156137b457600080fd5b5051919050565b808201808211156108f2576108f26135af565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b60008261382e5761382e6135dc565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008451613897818460208901612f77565b8451908301906138ab818360208901612f77565b84519101906138be818360208801612f77565b0195945050505050565b600083516138da818460208801612f77565b8351908301906138ee818360208801612f77565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061392a90830184612f9b565b9695505050505050565b60006020828403121561394657600080fd5b8151612abc81612f44565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208712448abd0ff0dac230485d34029c42f2dfc709bde2c6ae0da55dc84cde0f6c64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80638456cb5911610175578063ac307773116100dc578063de5f386811610095578063f008de191161006f578063f008de1914610866578063f2fde38b1461087c578063fc1a1c361461089c578063fcaea0d4146108b757600080fd5b8063de5f3868146107e7578063e00dd16114610807578063e985e9c51461081d57600080fd5b8063ac30777314610735578063b3f006741461074a578063b64b21ca14610772578063b88d4fde14610792578063bc0688da146107b2578063c87b56dd146107c757600080fd5b80639da3f8fd1161012e5780639da3f8fd1461068e578063a035b1fe146106a3578063a0712d68146106be578063a22cb465146106d1578063a5e77397146106f1578063ab95dd0a1461070657600080fd5b80638456cb59146105eb5780638da5cb5b146106005780639429684c1461062357806394bf804d1461063957806395d89b41146106595780639b19251a1461066e57600080fd5b80633f4ba83a116102345780635a86c41a116101ed5780636c2f5acd116101c75780636c2f5acd1461058057806370a08231146105a0578063715018a6146105c05780637501f741146105d557600080fd5b80635a86c41a146105285780635c975abb146105485780636352211e1461056057600080fd5b80633f4ba83a1461048857806342842e0e1461049d57806342966c68146104bd57806349072f12146104dd5780634f6ccce7146104f357806355234ec01461051357600080fd5b806321edc4cb1161028657806321edc4cb146103b357806323b872dd146103d35780632a55205a146103f35780632f745c5914610432578063309a3686146104525780633574a2dd1461046857600080fd5b806301ffc9a7146102ce578063026948501461030357806306fdde031461031a578063081812fc1461033c578063095ea7b31461037457806318160ddd14610394575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612f5a565b6108cc565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186108f8565b005b34801561032657600080fd5b5061032f610938565b6040516102fa9190612fc7565b34801561034857600080fd5b5061035c610357366004612fda565b6109ca565b6040516001600160a01b0390911681526020016102fa565b34801561038057600080fd5b5061031861038f366004613008565b610a52565b3480156103a057600080fd5b506008545b6040519081526020016102fa565b3480156103bf57600080fd5b506103186103ce366004613034565b610b67565b3480156103df57600080fd5b506103186103ee366004613056565b610ba2565b3480156103ff57600080fd5b5061041361040e366004613034565b610bd4565b604080516001600160a01b0390931683526020830191909152016102fa565b34801561043e57600080fd5b506103a561044d366004613008565b610c0f565b34801561045e57600080fd5b506103a560135481565b34801561047457600080fd5b506103186104833660046130d9565b610ca5565b34801561049457600080fd5b50610318610ce2565b3480156104a957600080fd5b506103186104b8366004613056565b610d1c565b3480156104c957600080fd5b506103186104d8366004612fda565b610d37565b3480156104e957600080fd5b506103a561271081565b3480156104ff57600080fd5b506103a561050e366004612fda565b610db1565b34801561051f57600080fd5b506103a5610e44565b34801561053457600080fd5b50610318610543366004613160565b610e66565b34801561055457600080fd5b50600b5460ff166102ee565b34801561056c57600080fd5b5061035c61057b366004612fda565b610f22565b34801561058c57600080fd5b5061031861059b366004613008565b610f99565b3480156105ac57600080fd5b506103a56105bb3660046131cc565b610fef565b3480156105cc57600080fd5b50610318611076565b3480156105e157600080fd5b506103a560125481565b3480156105f757600080fd5b506103186110b0565b34801561060c57600080fd5b50600b5461010090046001600160a01b031661035c565b34801561062f57600080fd5b506103a560165481565b34801561064557600080fd5b506103186106543660046131e9565b6110e8565b34801561066557600080fd5b5061032f611146565b34801561067a57600080fd5b506102ee6106893660046131cc565b611155565b34801561069a57600080fd5b5061032f611202565b3480156106af57600080fd5b506103a566d529ae9e86000081565b6103186106cc366004612fda565b6112de565b3480156106dd57600080fd5b506103186106ec36600461322e565b611677565b3480156106fd57600080fd5b50610318611682565b34801561071257600080fd5b50610726610721366004613263565b611727565b6040516102fa9392919061329e565b34801561074157600080fd5b506103186118db565b34801561075657600080fd5b5061035c73ca99f437de3af9879b58ea9ad8d856c4b586ffac81565b34801561077e57600080fd5b5061031861078d36600461333f565b611961565b34801561079e57600080fd5b506103186107ad3660046133a9565b611a5e565b3480156107be57600080fd5b50610318611a90565b3480156107d357600080fd5b5061032f6107e2366004612fda565b611ac7565b3480156107f357600080fd5b50610318610802366004613489565b611ce0565b34801561081357600080fd5b506103a5600c5481565b34801561082957600080fd5b506102ee6108383660046134c1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561087257600080fd5b506103a560175481565b34801561088857600080fd5b506103186108973660046131cc565b611d81565b3480156108a857600080fd5b506103a566b1a2bc2ec5000081565b3480156108c357600080fd5b50610318611e1f565b60006108d782611e56565b806108f257506001600160e01b0319821663152a902d60e11b145b92915050565b600b546001600160a01b036101009091041633146109315760405162461bcd60e51b8152600401610928906134ef565b60405180910390fd5b6002601055565b60606000805461094790613524565b80601f016020809104026020016040519081016040528092919081815260200182805461097390613524565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611e7b565b610a365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610928565b506000908152600460205260409020546001600160a01b031690565b6000610a5d82610f22565b9050806001600160a01b0316836001600160a01b031603610aca5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610928565b336001600160a01b0382161480610ae65750610ae68133610838565b610b585760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610928565b610b628383611e98565b505050565b600b546001600160a01b03610100909104163314610b975760405162461bcd60e51b8152600401610928906134ef565b601291909155601355565b610bad335b82611f06565b610bc95760405162461bcd60e51b81526004016109289061355e565b610b62838383611fec565b600f54600e5460009182916001600160a01b039091169061271090610bf990866135c5565b610c0391906135f2565b915091505b9250929050565b6000610c1a83610fef565b8210610c7c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610928565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b03610100909104163314610cd55760405162461bcd60e51b8152600401610928906134ef565b6015610b62828483613654565b600b546001600160a01b03610100909104163314610d125760405162461bcd60e51b8152600401610928906134ef565b610d1a612197565b565b610b6283838360405180602001604052806000815250611a5e565b610d4033610ba7565b610da55760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610928565b610dae8161222a565b50565b6000610dbc60085490565b8210610e1f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610928565b60088281548110610e3257610e32613714565b90600052602060002001549050919050565b60006001600c54610e55919061372a565b610e619061271061372a565b905090565b600b546001600160a01b03610100909104163314610e965760405162461bcd60e51b8152600401610928906134ef565b60105415610eb65760405162461bcd60e51b81526004016109289061373d565b60005b83811015610f1b57610f09858583818110610ed657610ed6613714565b90506020020135848484818110610eef57610eef613714565b9050602002016020810190610f0491906131cc565b612233565b80610f1381613789565b915050610eb9565b5050505050565b6000818152600260205260408120546001600160a01b0316806108f25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610928565b600b546001600160a01b03610100909104163314610fc95760405162461bcd60e51b8152600401610928906134ef565b600f80546001600160a01b0319166001600160a01b039390931692909217909155600e55565b60006001600160a01b03821661105a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610928565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b036101009091041633146110a65760405162461bcd60e51b8152600401610928906134ef565b610d1a60006122d4565b600b546001600160a01b036101009091041633146110e05760405162461bcd60e51b8152600401610928906134ef565b610d1a61232e565b600b546001600160a01b036101009091041633146111185760405162461bcd60e51b8152600401610928906134ef565b601054156111385760405162461bcd60e51b81526004016109289061373d565b6111428282612233565b5050565b60606001805461094790613524565b6040516370a0823160e01b81526001600160a01b038216600482015260009073c5a9bc46a7dbe1c6de493e84a18f02e70e2c5a32906370a0823190602401602060405180830381865afa1580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d491906137a2565b651fd5129130001115806108f25750506001600160a01b031660009081526011602052604090205460ff1690565b606060105460010361123a575060408051808201909152601181527057686974656c697374206d696e74696e6760781b602082015290565b60105460020361127c575060408051808201909152601981527f352c303030202457434920686f6c646572206d696e74696e6700000000000000602082015290565b6010546003036112af575060408051808201909152600e81526d5075626c6963206d696e74696e6760901b602082015290565b50604080518082019091526014815273135a5b9d1a5b99c81b9bdd081bdc195b881e595d60621b602082015290565b600b5460ff16156113245760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610928565b6000601054116113765760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206e6f742073746172746564207965740000000000000000006044820152606401610928565b600061138133611155565b905060008161139257601254611396565b6013545b90508083111580156113a85750600083115b80156113c7575080836113ba33610fef565b6113c491906137bb565b11155b6114135760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206c696d6974732065786365656465640000000000000000006044820152606401610928565b6040516370a0823160e01b815233600482015260009073c5a9bc46a7dbe1c6de493e84a18f02e70e2c5a32906370a0823190602401602060405180830381865afa158015611465573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148991906137a2565b65048c27395000111590506010546001036114f057826114eb5760405162461bcd60e51b815260206004820152601d60248201527f536f7272792c2077686974656c697374206d696e74696e67206f6e6c790000006044820152606401610928565b611547565b60105460020361154757806115475760405162461bcd60e51b815260206004820181905260248201527f596f7520646f6e2774206861766520352c303030202457534920746f6b656e736044820152606401610928565b60008484806115535750825b6115645766d529ae9e86000061156d565b66b1a2bc2ec500005b0290508034146115b75760405162461bcd60e51b8152602060048201526015602482015274125b98dbdc9c9958dd08185b5bdd5b9d081c185a59605a1b6044820152606401610928565b60405160009073ca99f437de3af9879b58ea9ad8d856c4b586ffac9034908381818185875af1925050503d806000811461160d576040519150601f19603f3d011682016040523d82523d6000602084013e611612565b606091505b505080915050806116655760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f207472616e73666572207061796d656e740000000000006044820152606401610928565b50506116718433612233565b50505050565b6111423383836123a9565b600b546001600160a01b036101009091041633146116b25760405162461bcd60e51b8152600401610928906134ef565b60165415806116da5750610100601654436116cd919061372a565b1180156116da5750601754155b6117175760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481c1c9a5b595960921b6044820152606401610928565b6117224360056137bb565b601655565b60608060008061173688610fef565b90508560000361174557600195505b80156118d0578087106117605761175d60018261372a565b96505b8061176b87896137bb565b111561177e5761177b878261372a565b95505b8567ffffffffffffffff81111561179757611797613393565b6040519080825280602002602001820160405280156117c0578160200160208202803683370190505b5093508567ffffffffffffffff8111156117dc576117dc613393565b60405190808252806020026020018201604052801561180f57816020015b60608152602001906001900390816117fa5790505b5092506000805a905060005b6000881161182b57600d5461182d565b875b8310801561183a57508881105b156118cc576118498a826137bb565b945060006118578c87610c0f565b90508088838151811061186c5761186c613714565b60200260200101818152505061188181611ac7565b87838151811061189357611893613714565b60200260200101819052505a6118a9908461372a565b6118b390856137bb565b93505a92505080806118c490613789565b91505061181b565b5050505b509450945094915050565b600b546001600160a01b0361010090910416331461190b5760405162461bcd60e51b8152600401610928906134ef565b60405160009073ca99f437de3af9879b58ea9ad8d856c4b586ffac9047908381818185875af1925050503d8060008114611671576040519150601f19603f3d011682016040523d82523d6000602084013e611671565b600b546001600160a01b036101009091041633146119915760405162461bcd60e51b8152600401610928906134ef565b601754156119d65760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481c985b991bdb5a5e995960721b6044820152606401610928565b60146119e3838583613654565b508015610b6257600060165411611a565760405162461bcd60e51b815260206004820152603160248201527f52616e646f6d20626c6f636b206e6f74207072696d65642c2072756e2070726960448201527036b2a930b73237b690333ab731ba34b7b760791b6064820152608401610928565b610b62612477565b611a683383611f06565b611a845760405162461bcd60e51b81526004016109289061355e565b611671848484846125b9565b600b546001600160a01b03610100909104163314611ac05760405162461bcd60e51b8152600401610928906134ef565b6001601055565b6060611ad282611e7b565b611aee5760405162461bcd60e51b8152600401610928906137ce565b6000828152600a602052604081208054611b0790613524565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3390613524565b8015611b805780601f10611b5557610100808354040283529160200191611b80565b820191906000526020600020905b815481529060010190602001808311611b6357829003601f168201915b505050505090506000611b916125ec565b825190915015611ba2575092915050565b805115611c2c5760175415611bf4576000611bbc60085490565b9050600081601754611bce919061381f565b9050611bda81876137bb565b955081861115611bf157611bee828761372a565b95505b50505b611c2481611c01866125fb565b60405180604001604052806005815260200164173539b7b760d91b8152506126fc565b949350505050565b600060158054611c3b90613524565b90501115611cd75760158054611c5090613524565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7c90613524565b8015611cc95780601f10611c9e57610100808354040283529160200191611cc9565b820191906000526020600020905b815481529060010190602001808311611cac57829003601f168201915b505050505092505050919050565b611c248461272b565b600b546001600160a01b03610100909104163314611d105760405162461bcd60e51b8152600401610928906134ef565b60005b82811015611671578160116000868685818110611d3257611d32613714565b9050602002016020810190611d4791906131cc565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611d7981613789565b915050611d13565b600b546001600160a01b03610100909104163314611db15760405162461bcd60e51b8152600401610928906134ef565b6001600160a01b038116611e165760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610928565b610dae816122d4565b600b546001600160a01b03610100909104163314611e4f5760405162461bcd60e51b8152600401610928906134ef565b6003601055565b60006001600160e01b0319821663780e9d6360e01b14806108f257506108f282612842565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ecd82610f22565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f1182611e7b565b611f725760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610928565b6000611f7d83610f22565b9050806001600160a01b0316846001600160a01b03161480611fb85750836001600160a01b0316611fad846109ca565b6001600160a01b0316145b80611c2457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611c24565b826001600160a01b0316611fff82610f22565b6001600160a01b0316146120675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610928565b6001600160a01b0382166120c95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610928565b6120d4838383612892565b6120df600082611e98565b6001600160a01b038316600090815260036020526040812080546001929061210890849061372a565b90915550506001600160a01b03821660009081526003602052604081208054600192906121369084906137bb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b5460ff166121e05760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610928565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610dae8161289d565b600c5461271083820160001901111561228e5760405162461bcd60e51b815260206004820152601960248201527f4e6f7420656e6f756768204e4654732072656d61696e696e67000000000000006044820152606401610928565b60005b838110156122af576122a383836128dd565b60019182019101612291565b50600c556001600160a01b031660009081526003602052604090208054919091019055565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b5460ff16156123745760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610928565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861220d3390565b816001600160a01b0316836001600160a01b03160361240a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610928565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6016546000036124c95760405162461bcd60e51b815260206004820152601960248201527f52616e646f6d697a6174696f6e206e6f742073746172746564000000000000006044820152606401610928565b6017541561250e5760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481c985b991bdb5a5e995960721b6044820152606401610928565b6016544310156125605760405162461bcd60e51b815260206004820152601b60248201527f4d7573742077616974206174206c65617374203520626c6f636b7300000000006044820152606401610928565b61010060165443612571919061372a565b106125b05760405162461bcd60e51b815260206004820152600f60248201526e57616974656420746f6f206c6f6e6760881b6044820152606401610928565b60165440601755565b6125c4848484611fec565b6125d0848484846128f7565b6116715760405162461bcd60e51b815260040161092890613833565b60606014805461094790613524565b6060816000036126225750506040805180820190915260018152600360fc1b602082015290565b8160005b811561264c578061263681613789565b91506126459050600a836135f2565b9150612626565b60008167ffffffffffffffff81111561266757612667613393565b6040519080825280601f01601f191660200182016040528015612691576020820181803683370190505b5090505b8415611c24576126a660018361372a565b91506126b3600a8661381f565b6126be9060306137bb565b60f81b8183815181106126d3576126d3613714565b60200101906001600160f81b031916908160001a9053506126f5600a866135f2565b9450612695565b606083838360405160200161271393929190613885565b60405160208183030381529060405290509392505050565b606061273682611e7b565b6127525760405162461bcd60e51b8152600401610928906137ce565b6000828152600a60205260408120805461276b90613524565b80601f016020809104026020016040519081016040528092919081815260200182805461279790613524565b80156127e45780601f106127b9576101008083540402835291602001916127e4565b820191906000526020600020905b8154815290600101906020018083116127c757829003601f168201915b5050505050905060006127f56125ec565b90508051600003612807575092915050565b8151156128395780826040516020016128219291906138c8565b60405160208183030381529060405292505050919050565b611c24846129f8565b60006001600160e01b031982166380ac58cd60e01b148061287357506001600160e01b03198216635b5e139f60e01b145b806108f257506301ffc9a760e01b6001600160e01b03198316146108f2565b610b62838383612ac3565b6128a681612b7b565b6000818152600a6020526040902080546128bf90613524565b159050610dae576000818152600a60205260408120610dae91612ef6565b611142828260405180602001604052806000815250612c22565b60006001600160a01b0384163b156129ed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061293b9033908990889088906004016138f7565b6020604051808303816000875af1925050508015612976575060408051601f3d908101601f1916820190925261297391810190613934565b60015b6129d3573d8080156129a4576040519150601f19603f3d011682016040523d82523d6000602084013e6129a9565b606091505b5080516000036129cb5760405162461bcd60e51b815260040161092890613833565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c24565b506001949350505050565b6060612a0382611e7b565b612a675760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610928565b6000612a716125ec565b90506000815111612a915760405180602001604052806000815250612abc565b80612a9b846125fb565b604051602001612aac9291906138c8565b6040516020818303038152906040525b9392505050565b6001600160a01b038316612b1e57612b1981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b41565b816001600160a01b0316836001600160a01b031614612b4157612b418382612c55565b6001600160a01b038216612b5857610b6281612cf2565b826001600160a01b0316826001600160a01b031614610b6257610b628282612da1565b6000612b8682610f22565b9050612b9481600084612892565b612b9f600083611e98565b6001600160a01b0381166000908152600360205260408120805460019290612bc890849061372a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b612c2c8383612de5565b612c3960008484846128f7565b610b625760405162461bcd60e51b815260040161092890613833565b60006001612c6284610fef565b612c6c919061372a565b600083815260076020526040902054909150808214612cbf576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d049060019061372a565b60008381526009602052604081205460088054939450909284908110612d2c57612d2c613714565b906000526020600020015490508060088381548110612d4d57612d4d613714565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612d8557612d85613951565b6001900381819060005260206000200160009055905550505050565b6000612dac83610fef565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612e3b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610928565b612e4481611e7b565b15612e915760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610928565b612e9d60008383612892565b60008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b508054612f0290613524565b6000825580601f10612f12575050565b601f016020900490600052602060002090810190610dae91905b80821115612f405760008155600101612f2c565b5090565b6001600160e01b031981168114610dae57600080fd5b600060208284031215612f6c57600080fd5b8135612abc81612f44565b60005b83811015612f92578181015183820152602001612f7a565b50506000910152565b60008151808452612fb3816020860160208601612f77565b601f01601f19169290920160200192915050565b602081526000612abc6020830184612f9b565b600060208284031215612fec57600080fd5b5035919050565b6001600160a01b0381168114610dae57600080fd5b6000806040838503121561301b57600080fd5b823561302681612ff3565b946020939093013593505050565b6000806040838503121561304757600080fd5b50508035926020909101359150565b60008060006060848603121561306b57600080fd5b833561307681612ff3565b9250602084013561308681612ff3565b929592945050506040919091013590565b60008083601f8401126130a957600080fd5b50813567ffffffffffffffff8111156130c157600080fd5b602083019150836020828501011115610c0857600080fd5b600080602083850312156130ec57600080fd5b823567ffffffffffffffff81111561310357600080fd5b61310f85828601613097565b90969095509350505050565b60008083601f84011261312d57600080fd5b50813567ffffffffffffffff81111561314557600080fd5b6020830191508360208260051b8501011115610c0857600080fd5b6000806000806040858703121561317657600080fd5b843567ffffffffffffffff8082111561318e57600080fd5b61319a8883890161311b565b909650945060208701359150808211156131b357600080fd5b506131c08782880161311b565b95989497509550505050565b6000602082840312156131de57600080fd5b8135612abc81612ff3565b600080604083850312156131fc57600080fd5b82359150602083013561320e81612ff3565b809150509250929050565b8035801515811461322957600080fd5b919050565b6000806040838503121561324157600080fd5b823561324c81612ff3565b915061325a60208401613219565b90509250929050565b6000806000806080858703121561327957600080fd5b843561328481612ff3565b966020860135965060408601359560600135945092505050565b606080825284519082018190526000906020906080840190828801845b828110156132d7578151845292840192908401906001016132bb565b50505083810382850152855180825282820190600581901b8301840188850160005b8381101561332757601f19868403018552613315838351612f9b565b948701949250908601906001016132f9565b50508095505050505050826040830152949350505050565b60008060006040848603121561335457600080fd5b833567ffffffffffffffff81111561336b57600080fd5b61337786828701613097565b909450925061338a905060208501613219565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156133bf57600080fd5b84356133ca81612ff3565b935060208501356133da81612ff3565b925060408501359150606085013567ffffffffffffffff808211156133fe57600080fd5b818701915087601f83011261341257600080fd5b81358181111561342457613424613393565b604051601f8201601f19908116603f0116810190838211818310171561344c5761344c613393565b816040528281528a602084870101111561346557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060006040848603121561349e57600080fd5b833567ffffffffffffffff8111156134b557600080fd5b6133778682870161311b565b600080604083850312156134d457600080fd5b82356134df81612ff3565b9150602083013561320e81612ff3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061353857607f821691505b60208210810361355857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108f2576108f26135af565b634e487b7160e01b600052601260045260246000fd5b600082613601576136016135dc565b500490565b601f821115610b6257600081815260208120601f850160051c8101602086101561362d5750805b601f850160051c820191505b8181101561364c57828155600101613639565b505050505050565b67ffffffffffffffff83111561366c5761366c613393565b6136808361367a8354613524565b83613606565b6000601f8411600181146136b4576000851561369c5750838201355b600019600387901b1c1916600186901b178355610f1b565b600083815260209020601f19861690835b828110156136e557868501358255602094850194600190920191016136c5565b50868210156137025760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b818103818111156108f2576108f26135af565b6020808252602c908201527f43616e6e6f742061697264726f70206f6e63652070616964206d696e74696e6760408201526b081a185cc81cdd185c9d195960a21b606082015260800190565b60006001820161379b5761379b6135af565b5060010190565b6000602082840312156137b457600080fd5b5051919050565b808201808211156108f2576108f26135af565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b60008261382e5761382e6135dc565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008451613897818460208901612f77565b8451908301906138ab818360208901612f77565b84519101906138be818360208801612f77565b0195945050505050565b600083516138da818460208801612f77565b8351908301906138ee818360208801612f77565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061392a90830184612f9b565b9695505050505050565b60006020828403121561394657600080fd5b8151612abc81612f44565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208712448abd0ff0dac230485d34029c42f2dfc709bde2c6ae0da55dc84cde0f6c64736f6c63430008110033

Deployed Bytecode Sourcemap

46259:9059:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53576:262;;;;;;;;;;-1:-1:-1;53576:262:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;53576:262:0;;;;;;;;50589:78;;;;;;;;;;;;;:::i;:::-;;19904:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21463:221::-;;;;;;;;;;-1:-1:-1;21463:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;21463:221:0;1533:203:1;20986:411:0;;;;;;;;;;-1:-1:-1;20986:411:0;;;;;:::i;:::-;;:::i;33702:113::-;;;;;;;;;;-1:-1:-1;33790:10:0;:17;33702:113;;;2343:25:1;;;2331:2;2316:18;33702:113:0;2197:177:1;47979:168:0;;;;;;;;;;-1:-1:-1;47979:168:0;;;;;:::i;:::-;;:::i;22213:339::-;;;;;;;;;;-1:-1:-1;22213:339:0;;;;;:::i;:::-;;:::i;54014:156::-;;;;;;;;;;-1:-1:-1;54014:156:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3285:32:1;;;3267:51;;3349:2;3334:18;;3327:34;;;;3240:18;54014:156:0;3093:274:1;33370:256:0;;;;;;;;;;-1:-1:-1;33370:256:0;;;;;:::i;:::-;;:::i;47148:36::-;;;;;;;;;;;;;;;;47843:124;;;;;;;;;;-1:-1:-1;47843:124:0;;;;;:::i;:::-;;:::i;48332:65::-;;;;;;;;;;;;;:::i;22623:185::-;;;;;;;;;;-1:-1:-1;22623:185:0;;;;;:::i;:::-;;:::i;45908:245::-;;;;;;;;;;-1:-1:-1;45908:245:0;;;;;:::i;:::-;;:::i;46910:44::-;;;;;;;;;;;;46949:5;46910:44;;33892:233;;;;;;;;;;-1:-1:-1;33892:233:0;;;;;:::i;:::-;;:::i;53462:106::-;;;;;;;;;;;;;:::i;48405:276::-;;;;;;;;;;-1:-1:-1;48405:276:0;;;;;:::i;:::-;;:::i;41992:86::-;;;;;;;;;;-1:-1:-1;42063:7:0;;;;41992:86;;19598:239;;;;;;;;;;-1:-1:-1;19598:239:0;;;;;:::i;:::-;;:::i;53846:160::-;;;;;;;;;;-1:-1:-1;53846:160:0;;;;;:::i;:::-;;:::i;19328:208::-;;;;;;;;;;-1:-1:-1;19328:208:0;;;;;:::i;:::-;;:::i;44748:103::-;;;;;;;;;;;;;:::i;47114:27::-;;;;;;;;;;;;;;;;48263:61;;;;;;;;;;;;;:::i;44097:87::-;;;;;;;;;;-1:-1:-1;44170:6:0;;;;;-1:-1:-1;;;;;44170:6:0;44097:87;;47293:26;;;;;;;;;;;;;;;;48688:180;;;;;;;;;;-1:-1:-1;48688:180:0;;;;;:::i;:::-;;:::i;20073:104::-;;;;;;;;;;;;;:::i;54398:158::-;;;;;;;;;;-1:-1:-1;54398:158:0;;;;;:::i;:::-;;:::i;50761:339::-;;;;;;;;;;;;;:::i;46963:42::-;;;;;;;;;;;;46995:10;46963:42;;48876:1042;;;;;;:::i;:::-;;:::i;21756:155::-;;;;;;;;;;-1:-1:-1;21756:155:0;;;;;:::i;:::-;;:::i;54564:203::-;;;;;;;;;;;;;:::i;52445:1009::-;;;;;;;;;;-1:-1:-1;52445:1009:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;50343:149::-;;;;;;;;;;;;;:::i;46609:80::-;;;;;;;;;;;;46647:42;46609:80;;47518:317;;;;;;;;;;-1:-1:-1;47518:317:0;;;;;:::i;:::-;;:::i;22879:328::-;;;;;;;;;;-1:-1:-1;22879:328:0;;;;;:::i;:::-;;:::i;50500:81::-;;;;;;;;;;;;;:::i;51513:923::-;;;;;;;;;;-1:-1:-1;51513:923:0;;;;;:::i;:::-;;:::i;54178:212::-;;;;;;;;;;-1:-1:-1;54178:212:0;;;;;:::i;:::-;;:::i;46542:28::-;;;;;;;;;;;;;;;;21982:164;;;;;;;;;;-1:-1:-1;21982:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;22103:25:0;;;22079:4;22103:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;21982:164;47326:26;;;;;;;;;;;;;;;;45006:201;;;;;;;;;;-1:-1:-1;45006:201:0;;;;;:::i;:::-;;:::i;47012:51::-;;;;;;;;;;;;47053:10;47012:51;;50675:78;;;;;;;;;;;;;:::i;53576:262::-;53715:4;53744:36;53768:11;53744:23;:36::i;:::-;:86;;;-1:-1:-1;;;;;;;53784:46:0;;-1:-1:-1;;;53784:46:0;53744:86;53737:93;53576:262;-1:-1:-1;;53576:262:0:o;50589:78::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;;;;;;;;;50658:1:::1;50649:6;:10:::0;50589:78::o;19904:100::-;19958:13;19991:5;19984:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19904:100;:::o;21463:221::-;21539:7;21567:16;21575:7;21567;:16::i;:::-;21559:73;;;;-1:-1:-1;;;21559:73:0;;12259:2:1;21559:73:0;;;12241:21:1;12298:2;12278:18;;;12271:30;12337:34;12317:18;;;12310:62;-1:-1:-1;;;12388:18:1;;;12381:42;12440:19;;21559:73:0;12057:408:1;21559:73:0;-1:-1:-1;21652:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;21652:24:0;;21463:221::o;20986:411::-;21067:13;21083:23;21098:7;21083:14;:23::i;:::-;21067:39;;21131:5;-1:-1:-1;;;;;21125:11:0;:2;-1:-1:-1;;;;;21125:11:0;;21117:57;;;;-1:-1:-1;;;21117:57:0;;12672:2:1;21117:57:0;;;12654:21:1;12711:2;12691:18;;;12684:30;12750:34;12730:18;;;12723:62;-1:-1:-1;;;12801:18:1;;;12794:31;12842:19;;21117:57:0;12470:397:1;21117:57:0;15627:10;-1:-1:-1;;;;;21209:21:0;;;;:62;;-1:-1:-1;21234:37:0;21251:5;15627:10;21982:164;:::i;21234:37::-;21187:168;;;;-1:-1:-1;;;21187:168:0;;13074:2:1;21187:168:0;;;13056:21:1;13113:2;13093:18;;;13086:30;13152:34;13132:18;;;13125:62;13223:26;13203:18;;;13196:54;13267:19;;21187:168:0;12872:420:1;21187:168:0;21368:21;21377:2;21381:7;21368:8;:21::i;:::-;21056:341;20986:411;;:::o;47979:168::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;48074:7:::1;:18:::0;;;;48103:16:::1;:36:::0;47979:168::o;22213:339::-;22408:41;15627:10;22427:12;22441:7;22408:18;:41::i;:::-;22400:103;;;;-1:-1:-1;;;22400:103:0;;;;;;;:::i;:::-;22516:28;22526:4;22532:2;22536:7;22516:9;:28::i;54014:156::-;54119:17;;54144:11;;54082:7;;;;-1:-1:-1;;;;;54119:17:0;;;;54156:5;;54138:17;;:5;:17;:::i;:::-;:23;;;;:::i;:::-;54111:51;;;;54014:156;;;;;;:::o;33370:256::-;33467:7;33503:23;33520:5;33503:16;:23::i;:::-;33495:5;:31;33487:87;;;;-1:-1:-1;;;33487:87:0;;14479:2:1;33487:87:0;;;14461:21:1;14518:2;14498:18;;;14491:30;14557:34;14537:18;;;14530:62;-1:-1:-1;;;14608:18:1;;;14601:41;14659:19;;33487:87:0;14277:407:1;33487:87:0;-1:-1:-1;;;;;;33592:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;33370:256::o;47843:124::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;47930:14:::1;:29;47947:12:::0;;47930:14;:29:::1;:::i;48332:65::-:0;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;48379:10:::1;:8;:10::i;:::-;48332:65::o:0;22623:185::-;22761:39;22778:4;22784:2;22788:7;22761:39;;;;;;;;;;;;:16;:39::i;45908:245::-;46026:41;15627:10;46045:12;15547:98;46026:41;46018:102;;;;-1:-1:-1;;;46018:102:0;;16949:2:1;46018:102:0;;;16931:21:1;16988:2;16968:18;;;16961:30;17027:34;17007:18;;;17000:62;-1:-1:-1;;;17078:18:1;;;17071:46;17134:19;;46018:102:0;16747:412:1;46018:102:0;46131:14;46137:7;46131:5;:14::i;:::-;45908:245;:::o;33892:233::-;33967:7;34003:30;33790:10;:17;;33702:113;34003:30;33995:5;:38;33987:95;;;;-1:-1:-1;;;33987:95:0;;17366:2:1;33987:95:0;;;17348:21:1;17405:2;17385:18;;;17378:30;17444:34;17424:18;;;17417:62;-1:-1:-1;;;17495:18:1;;;17488:42;17547:19;;33987:95:0;17164:408:1;33987:95:0;34100:10;34111:5;34100:17;;;;;;;;:::i;:::-;;;;;;;;;34093:24;;33892:233;;;:::o;53462:106::-;53505:7;53558:1;53548:9;;:11;;;;:::i;:::-;53532:28;;46949:5;53532:28;:::i;:::-;53525:35;;53462:106;:::o;48405:276::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;48513:6:::1;::::0;:11;48505:68:::1;;;;-1:-1:-1::0;;;48505:68:0::1;;;;;;;:::i;:::-;48586:9;48582:92;48601:17:::0;;::::1;48582:92;;;48636:28;48646:6;;48653:1;48646:9;;;;;;;:::i;:::-;;;;;;;48657:3;;48661:1;48657:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48636:9;:28::i;:::-;48620:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48582:92;;;;48405:276:::0;;;;:::o;19598:239::-;19670:7;19706:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19706:16:0;;19733:73;;;;-1:-1:-1;;;19733:73:0;;18597:2:1;19733:73:0;;;18579:21:1;18636:2;18616:18;;;18609:30;18675:34;18655:18;;;18648:62;-1:-1:-1;;;18726:18:1;;;18719:39;18775:19;;19733:73:0;18395:405:1;53846:160:0;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;53941:17:::1;:29:::0;;-1:-1:-1;;;;;;53941:29:0::1;-1:-1:-1::0;;;;;53941:29:0;;;::::1;::::0;;;::::1;::::0;;;53981:11:::1;:17:::0;53846:160::o;19328:208::-;19400:7;-1:-1:-1;;;;;19428:19:0;;19420:74;;;;-1:-1:-1;;;19420:74:0;;19007:2:1;19420:74:0;;;18989:21:1;19046:2;19026:18;;;19019:30;19085:34;19065:18;;;19058:62;-1:-1:-1;;;19136:18:1;;;19129:40;19186:19;;19420:74:0;18805:406:1;19420:74:0;-1:-1:-1;;;;;;19512:16:0;;;;;:9;:16;;;;;;;19328:208::o;44748:103::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;44813:30:::1;44840:1;44813:18;:30::i;48263:61::-:0;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;48308:8:::1;:6;:8::i;48688:180::-:0;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;48768:6:::1;::::0;:11;48760:68:::1;;;;-1:-1:-1::0;;;48760:68:0::1;;;;;;;:::i;:::-;48838:22;48848:6;48856:3;48838:9;:22::i;:::-;48688:180:::0;;:::o;20073:104::-;20129:13;20162:7;20155:14;;;;;:::i;54398:158::-;54495:30;;-1:-1:-1;;;54495:30:0;;-1:-1:-1;;;;;1697:32:1;;54495:30:0;;;1679:51:1;54454:4:0;;46819:42;;54495:21;;1652:18:1;;54495:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54478:13;:47;;:70;;;-1:-1:-1;;;;;;;54529:19:0;;;;;:10;:19;;;;;;;;;54398:158::o;50761:339::-;50804:13;50834:6;;50844:1;50834:11;50830:262;;-1:-1:-1;50862:26:0;;;;;;;;;;;;-1:-1:-1;;;50862:26:0;;;;;50761:339::o;50830:262::-;50910:6;;50920:1;50910:11;50906:186;;-1:-1:-1;50938:34:0;;;;;;;;;;;;;;;;;;50761:339::o;50906:186::-;50994:6;;51004:1;50994:11;50990:102;;-1:-1:-1;51022:23:0;;;;;;;;;;;;-1:-1:-1;;;51022:23:0;;;;;50761:339::o;50990:102::-;-1:-1:-1;51063:29:0;;;;;;;;;;;;-1:-1:-1;;;51063:29:0;;;;;50761:339::o;48876:1042::-;42063:7;;;;42317:9;42309:38;;;;-1:-1:-1;;;42309:38:0;;19607:2:1;42309:38:0;;;19589:21:1;19646:2;19626:18;;;19619:30;-1:-1:-1;;;19665:18:1;;;19658:46;19721:18;;42309:38:0;19405:340:1;42309:38:0;48965:1:::1;48956:6;;:10;48948:46;;;::::0;-1:-1:-1;;;48948:46:0;;19952:2:1;48948:46:0::1;::::0;::::1;19934:21:1::0;19991:2;19971:18;;;19964:30;20030:25;20010:18;;;20003:53;20073:18;;48948:46:0::1;19750:347:1::0;48948:46:0::1;49005:16;49024:21;49034:10;49024:9;:21::i;:::-;49005:40;;49056:13;49072:11;:40;;49105:7;;49072:40;;;49086:16;;49072:40;49056:56;;49141:5;49131:6;:15;;:29;;;;;49159:1;49150:6;:10;49131:29;:72;;;;;49198:5;49188:6;49164:21;49174:10;49164:9;:21::i;:::-;:30;;;;:::i;:::-;:39;;49131:72;49123:108;;;::::0;-1:-1:-1;;;49123:108:0;;20434:2:1;49123:108:0::1;::::0;::::1;20416:21:1::0;20473:2;20453:18;;;20446:30;20512:25;20492:18;;;20485:53;20555:18;;49123:108:0::1;20232:347:1::0;49123:108:0::1;49277:33;::::0;-1:-1:-1;;;49277:33:0;;49299:10:::1;49277:33;::::0;::::1;1679:51:1::0;49244:14:0::1;::::0;46819:42:::1;::::0;49277:21:::1;::::0;1652:18:1;;49277:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49261:12;:49;;49244:66;;49327:6;;49337:1;49327:11:::0;49323:201:::1;;49363:11;49355:53;;;::::0;-1:-1:-1;;;49355:53:0;;20786:2:1;49355:53:0::1;::::0;::::1;20768:21:1::0;20825:2;20805:18;;;20798:30;20864:31;20844:18;;;20837:59;20913:18;;49355:53:0::1;20584:353:1::0;49355:53:0::1;49323:201;;;49430:6;;49440:1;49430:11:::0;49426:98:::1;;49466:9;49458:54;;;::::0;-1:-1:-1;;;49458:54:0;;21144:2:1;49458:54:0::1;::::0;::::1;21126:21:1::0;;;21163:18;;;21156:30;21222:34;21202:18;;;21195:62;21274:18;;49458:54:0::1;20942:356:1::0;49458:54:0::1;49556:17;49630:6;49577:11;:24;;;;49592:9;49577:24;:49;;46995:10;49577:49;;;47053:10;49577:49;49576:60;49556:80;;49669:9;49656;:22;49647:57;;;::::0;-1:-1:-1;;;49647:57:0;;21505:2:1;49647:57:0::1;::::0;::::1;21487:21:1::0;21544:2;21524:18;;;21517:30;-1:-1:-1;;;21563:18:1;;;21556:51;21624:18;;49647:57:0::1;21303:345:1::0;49647:57:0::1;49752:38;::::0;49715:12:::1;::::0;46647:42:::1;::::0;49776:9:::1;::::0;49715:12;49752:38;49715:12;49752:38;49776:9;46647:42;49752:38:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49738:52;;;;;49809:7;49801:46;;;::::0;-1:-1:-1;;;49801:46:0;;22065:2:1;49801:46:0::1;::::0;::::1;22047:21:1::0;22104:2;22084:18;;;22077:30;22143:28;22123:18;;;22116:56;22189:18;;49801:46:0::1;21863:350:1::0;49801:46:0::1;49536:325;;49881:29;49891:6;49899:10;49881:9;:29::i;:::-;48937:981;;;48876:1042:::0;:::o;21756:155::-;21851:52;15627:10;21884:8;21894;21851:18;:52::i;54564:203::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;54625:11:::1;::::0;:16;;:74:::1;;;54675:3;54661:11;;54646:12;:26;;;;:::i;:::-;:32;:52;;;;-1:-1:-1::0;54682:11:0::1;::::0;:16;54646:52:::1;54617:101;;;::::0;-1:-1:-1;;;54617:101:0;;22420:2:1;54617:101:0::1;::::0;::::1;22402:21:1::0;22459:2;22439:18;;;22432:30;-1:-1:-1;;;22478:18:1;;;22471:44;22532:18;;54617:101:0::1;22218:338:1::0;54617:101:0::1;54743:16;:12;54758:1;54743:16;:::i;:::-;54729:11;:30:::0;54564:203::o;52445:1009::-;52544:25;52571;52598:14;52625:15;52643:13;52653:2;52643:9;:13::i;:::-;52625:31;;52671:5;52680:1;52671:10;52667:25;;52691:1;52683:9;;52667:25;52707:11;;52703:744;;52748:7;52739:5;:16;52735:39;;52765:9;52773:1;52765:7;:9;:::i;:::-;52757:17;;52735:39;52809:7;52793:13;52801:5;52793;:13;:::i;:::-;:23;52789:52;;;52826:15;52836:5;52826:7;:15;:::i;:::-;52818:23;;52789:52;52883:5;52869:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52869:20:0;;52858:31;;52929:5;52916:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52904:31;;52964:15;52998;53016:9;52998:27;;53059:9;53054:382;53090:1;53083:4;:8;:21;;53101:3;;53083:21;;;53094:4;53083:21;53072:7;:33;:46;;;;;53113:5;53109:1;:9;53072:46;53054:382;;;53153:7;53155:5;53153:1;:7;:::i;:::-;53144:16;;53179:10;53192:31;53212:2;53216:6;53192:19;:31::i;:::-;53179:44;;53256:2;53242:8;53251:1;53242:11;;;;;;;;:::i;:::-;;;;;;:16;;;;;53292:12;53301:2;53292:8;:12::i;:::-;53277:9;53287:1;53277:12;;;;;;;;:::i;:::-;;;;;;:27;;;;53372:9;53362:19;;:7;:19;:::i;:::-;53351:31;;:7;:31;:::i;:::-;53341:41;;53411:9;53401:19;;53125:311;53120:3;;;;;:::i;:::-;;;;53054:382;;;;52720:727;;52703:744;52614:840;52445:1009;;;;;;;;:::o;50343:149::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;50428:50:::1;::::0;50393:12:::1;::::0;46647:42:::1;::::0;50452:21:::1;::::0;50393:12;50428:50;50393:12;50428:50;50452:21;46647:42;50428:50:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47518:317:::0;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;47615:11:::1;::::0;:16;47607:47:::1;;;::::0;-1:-1:-1;;;47607:47:0;;22763:2:1;47607:47:0::1;::::0;::::1;22745:21:1::0;22802:2;22782:18;;;22775:30;-1:-1:-1;;;22821:18:1;;;22814:48;22879:18;;47607:47:0::1;22561:342:1::0;47607:47:0::1;47665:7;:15;47675:5:::0;;47665:7;:15:::1;:::i;:::-;;47694:9;47691:137;;;47740:1;47726:11;;:15;47718:77;;;::::0;-1:-1:-1;;;47718:77:0;;23110:2:1;47718:77:0::1;::::0;::::1;23092:21:1::0;23149:2;23129:18;;;23122:30;23188:34;23168:18;;;23161:62;-1:-1:-1;;;23239:18:1;;;23232:47;23296:19;;47718:77:0::1;22908:413:1::0;47718:77:0::1;47808:8;:6;:8::i;22879:328::-:0;23054:41;15627:10;23087:7;23054:18;:41::i;:::-;23046:103;;;;-1:-1:-1;;;23046:103:0;;;;;;;:::i;:::-;23160:39;23174:4;23180:2;23184:7;23193:5;23160:13;:39::i;50500:81::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;50572:1:::1;50563:6;:10:::0;50500:81::o;51513:923::-;51605:13;51639:17;51647:8;51639:7;:17::i;:::-;51631:79;;;;-1:-1:-1;;;51631:79:0;;;;;;;:::i;:::-;51721:23;51747:20;;;:10;:20;;;;;51721:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51778:18;51799:10;:8;:10::i;:::-;51826:23;;51778:31;;-1:-1:-1;51826:27:0;51822:76;;-1:-1:-1;51877:9:0;51513:923;-1:-1:-1;;51513:923:0:o;51822:76::-;51914:18;;:22;51910:377;;51956:11;;:15;51953:248;;51990:19;52012:13;33790:10;:17;;33702:113;52012:13;51990:35;;52042:13;52072:11;52058;;:25;;;;:::i;:::-;52042:41;-1:-1:-1;52100:17:0;52042:41;52100:17;;:::i;:::-;;;52149:11;52138:8;:22;52134:51;;;52162:23;52174:11;52162:23;;:::i;:::-;;;52134:51;51973:228;;51953:248;52222:53;52234:4;52240:19;:8;:17;:19::i;:::-;52261:13;;;;;;;;;;;;;-1:-1:-1;;;52261:13:0;;;52222:11;:53::i;:::-;52215:60;51513:923;-1:-1:-1;;;;51513:923:0:o;51910:377::-;52334:1;52309:14;52303:28;;;;;:::i;:::-;;;:32;52299:86;;;52359:14;52352:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51513:923;;;:::o;52299:86::-;52404:24;52419:8;52404:14;:24::i;54178:212::-;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;54280:9:::1;54275:108;54295:22:::0;;::::1;54275:108;;;54366:7;54337:10;:26;54348:11;;54360:1;54348:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54337:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54337:26:0;:36;;-1:-1:-1;;54337:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54319:3;::::1;::::0;::::1;:::i;:::-;;;;54275:108;;45006:201:::0;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45095:22:0;::::1;45087:73;;;::::0;-1:-1:-1;;;45087:73:0;;24063:2:1;45087:73:0::1;::::0;::::1;24045:21:1::0;24102:2;24082:18;;;24075:30;24141:34;24121:18;;;24114:62;-1:-1:-1;;;24192:18:1;;;24185:36;24238:19;;45087:73:0::1;23861:402:1::0;45087:73:0::1;45171:28;45190:8;45171:18;:28::i;50675:78::-:0;44170:6;;-1:-1:-1;;;;;44170:6:0;;;;;15627:10;44317:23;44309:68;;;;-1:-1:-1;;;44309:68:0;;;;;;;:::i;:::-;50744:1:::1;50735:6;:10:::0;50675:78::o;33062:224::-;33164:4;-1:-1:-1;;;;;;33188:50:0;;-1:-1:-1;;;33188:50:0;;:90;;;33242:36;33266:11;33242:23;:36::i;24717:127::-;24782:4;24806:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24806:16:0;:30;;;24717:127::o;28672:174::-;28747:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;28747:29:0;-1:-1:-1;;;;;28747:29:0;;;;;;;;:24;;28801:23;28747:24;28801:14;:23::i;:::-;-1:-1:-1;;;;;28792:46:0;;;;;;;;;;;28672:174;;:::o;25011:348::-;25104:4;25129:16;25137:7;25129;:16::i;:::-;25121:73;;;;-1:-1:-1;;;25121:73:0;;24470:2:1;25121:73:0;;;24452:21:1;24509:2;24489:18;;;24482:30;24548:34;24528:18;;;24521:62;-1:-1:-1;;;24599:18:1;;;24592:42;24651:19;;25121:73:0;24268:408:1;25121:73:0;25205:13;25221:23;25236:7;25221:14;:23::i;:::-;25205:39;;25274:5;-1:-1:-1;;;;;25263:16:0;:7;-1:-1:-1;;;;;25263:16:0;;:51;;;;25307:7;-1:-1:-1;;;;;25283:31:0;:20;25295:7;25283:11;:20::i;:::-;-1:-1:-1;;;;;25283:31:0;;25263:51;:87;;;-1:-1:-1;;;;;;22103:25:0;;;22079:4;22103:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;25318:32;21982:164;27974:580;28133:4;-1:-1:-1;;;;;28106:31:0;:23;28121:7;28106:14;:23::i;:::-;-1:-1:-1;;;;;28106:31:0;;28098:85;;;;-1:-1:-1;;;28098:85:0;;24883:2:1;28098:85:0;;;24865:21:1;24922:2;24902:18;;;24895:30;24961:34;24941:18;;;24934:62;-1:-1:-1;;;25012:18:1;;;25005:39;25061:19;;28098:85:0;24681:405:1;28098:85:0;-1:-1:-1;;;;;28202:16:0;;28194:65;;;;-1:-1:-1;;;28194:65:0;;25293:2:1;28194:65:0;;;25275:21:1;25332:2;25312:18;;;25305:30;25371:34;25351:18;;;25344:62;-1:-1:-1;;;25422:18:1;;;25415:34;25466:19;;28194:65:0;25091:400:1;28194:65:0;28272:39;28293:4;28299:2;28303:7;28272:20;:39::i;:::-;28376:29;28393:1;28397:7;28376:8;:29::i;:::-;-1:-1:-1;;;;;28418:15:0;;;;;;:9;:15;;;;;:20;;28437:1;;28418:15;:20;;28437:1;;28418:20;:::i;:::-;;;;-1:-1:-1;;;;;;;28449:13:0;;;;;;:9;:13;;;;;:18;;28466:1;;28449:13;:18;;28466:1;;28449:18;:::i;:::-;;;;-1:-1:-1;;28478:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28478:21:0;-1:-1:-1;;;;;28478:21:0;;;;;;;;;28519:27;;28478:16;;28519:27;;;;;;;27974:580;;;:::o;43051:120::-;42063:7;;;;42587:41;;;;-1:-1:-1;;;42587:41:0;;25698:2:1;42587:41:0;;;25680:21:1;25737:2;25717:18;;;25710:30;-1:-1:-1;;;25756:18:1;;;25749:50;25816:18;;42587:41:0;25496:344:1;42587:41:0;43110:7:::1;:15:::0;;-1:-1:-1;;43110:15:0::1;::::0;;43141:22:::1;15627:10:::0;43150:12:::1;43141:22;::::0;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;43141:22:0::1;;;;;;;43051:120::o:0;51390:115::-;51477:20;51489:7;51477:11;:20::i;49926:409::-;50015:9;;46949:5;50064:19;;;-1:-1:-1;;50064:19:0;:35;;50055:74;;;;-1:-1:-1;;;50055:74:0;;26047:2:1;50055:74:0;;;26029:21:1;26086:2;26066:18;;;26059:30;26125:27;26105:18;;;26098:55;26170:18;;50055:74:0;25845:349:1;50055:74:0;50155:9;50150:107;50174:6;50170:1;:10;50150:107;;;50201:21;50211:2;50215:6;50201:9;:21::i;:::-;50237:8;;;;;50182:3;50150:107;;;-1:-1:-1;50267:9:0;:18;-1:-1:-1;;;;;19222:13:0;;;;;:9;:13;;;;;:23;;;;;;;;20986:411::o;45367:191::-;45460:6;;;-1:-1:-1;;;;;45477:17:0;;;45460:6;45477:17;;;-1:-1:-1;;;;;;45477:17:0;;;;;;45510:40;;45460:6;;;;;;;;45510:40;;45441:16;;45510:40;45430:128;45367:191;:::o;42792:118::-;42063:7;;;;42317:9;42309:38;;;;-1:-1:-1;;;42309:38:0;;19607:2:1;42309:38:0;;;19589:21:1;19646:2;19626:18;;;19619:30;-1:-1:-1;;;19665:18:1;;;19658:46;19721:18;;42309:38:0;19405:340:1;42309:38:0;42852:7:::1;:14:::0;;-1:-1:-1;;42852:14:0::1;42862:4;42852:14;::::0;;42882:20:::1;42889:12;15627:10:::0;;15547:98;28988:315;29143:8;-1:-1:-1;;;;;29134:17:0;:5;-1:-1:-1;;;;;29134:17:0;;29126:55;;;;-1:-1:-1;;;29126:55:0;;26401:2:1;29126:55:0;;;26383:21:1;26440:2;26420:18;;;26413:30;26479:27;26459:18;;;26452:55;26524:18;;29126:55:0;26199:349:1;29126:55:0;-1:-1:-1;;;;;29192:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;29192:46:0;;;;;;;;;;29254:41;;540::1;;;29254::0;;513:18:1;29254:41:0;;;;;;;28988:315;;;:::o;54775:363::-;54821:11;;54836:1;54821:16;54813:54;;;;-1:-1:-1;;;54813:54:0;;26755:2:1;54813:54:0;;;26737:21:1;26794:2;26774:18;;;26767:30;26833:27;26813:18;;;26806:55;26878:18;;54813:54:0;26553:349:1;54813:54:0;54886:11;;:16;54878:47;;;;-1:-1:-1;;;54878:47:0;;22763:2:1;54878:47:0;;;22745:21:1;22802:2;22782:18;;;22775:30;-1:-1:-1;;;22821:18:1;;;22814:48;22879:18;;54878:47:0;22561:342:1;54878:47:0;54960:11;;54944:12;:27;;54936:67;;;;-1:-1:-1;;;54936:67:0;;27109:2:1;54936:67:0;;;27091:21:1;27148:2;27128:18;;;27121:30;27187:29;27167:18;;;27160:57;27234:18;;54936:67:0;26907:351:1;54936:67:0;55051:3;55037:11;;55022:12;:26;;;;:::i;:::-;:32;55014:60;;;;-1:-1:-1;;;55014:60:0;;27465:2:1;55014:60:0;;;27447:21:1;27504:2;27484:18;;;27477:30;-1:-1:-1;;;27523:18:1;;;27516:45;27578:18;;55014:60:0;27263:339:1;55014:60:0;55117:11;;55107:22;55085:11;:45;54775:363::o;24089:315::-;24246:28;24256:4;24262:2;24266:7;24246:9;:28::i;:::-;24293:48;24316:4;24322:2;24326:7;24335:5;24293:22;:48::i;:::-;24285:111;;;;-1:-1:-1;;;24285:111:0;;;;;;;:::i;48155:100::-;48207:13;48240:7;48233:14;;;;;:::i;15989:723::-;16045:13;16266:5;16275:1;16266:10;16262:53;;-1:-1:-1;;16293:10:0;;;;;;;;;;;;-1:-1:-1;;;16293:10:0;;;;;15989:723::o;16262:53::-;16340:5;16325:12;16381:78;16388:9;;16381:78;;16414:8;;;;:::i;:::-;;-1:-1:-1;16437:10:0;;-1:-1:-1;16445:2:0;16437:10;;:::i;:::-;;;16381:78;;;16469:19;16501:6;16491:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16491:17:0;;16469:39;;16519:154;16526:10;;16519:154;;16553:11;16563:1;16553:11;;:::i;:::-;;-1:-1:-1;16622:10:0;16630:2;16622:5;:10;:::i;:::-;16609:24;;:2;:24;:::i;:::-;16596:39;;16579:6;16586;16579:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16579:56:0;;;;;;;;-1:-1:-1;16650:11:0;16659:2;16650:11;;:::i;:::-;;;16519:154;;55146:169;55241:13;55298:1;55301;55304;55281:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55267:40;;55146:169;;;;;:::o;39518:679::-;39591:13;39625:16;39633:7;39625;:16::i;:::-;39617:78;;;;-1:-1:-1;;;39617:78:0;;;;;;;:::i;:::-;39708:23;39734:19;;;:10;:19;;;;;39708:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39764:18;39785:10;:8;:10::i;:::-;39764:31;;39877:4;39871:18;39893:1;39871:23;39867:72;;-1:-1:-1;39918:9:0;39518:679;-1:-1:-1;;39518:679:0:o;39867:72::-;40043:23;;:27;40039:108;;40118:4;40124:9;40101:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40087:48;;;;39518:679;;;:::o;40039:108::-;40166:23;40181:7;40166:14;:23::i;18808:305::-;18910:4;-1:-1:-1;;;;;;18947:40:0;;-1:-1:-1;;;18947:40:0;;:105;;-1:-1:-1;;;;;;;19004:48:0;;-1:-1:-1;;;19004:48:0;18947:105;:158;;;-1:-1:-1;;;;;;;;;;17526:40:0;;;19069:36;17417:157;51108:204;51259:45;51286:4;51292:2;51296:7;51259:26;:45::i;40799:206::-;40868:20;40880:7;40868:11;:20::i;:::-;40911:19;;;;:10;:19;;;;;40905:33;;;;;:::i;:::-;:38;;-1:-1:-1;40901:97:0;;40967:19;;;;:10;:19;;;;;40960:26;;;:::i;25701:110::-;25777:26;25787:2;25791:7;25777:26;;;;;;;;;;;;:9;:26::i;29868:799::-;30023:4;-1:-1:-1;;;;;30044:13:0;;7999:20;8047:8;30040:620;;30080:72;;-1:-1:-1;;;30080:72:0;;-1:-1:-1;;;;;30080:36:0;;;;;:72;;15627:10;;30131:4;;30137:7;;30146:5;;30080:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30080:72:0;;;;;;;;-1:-1:-1;;30080:72:0;;;;;;;;;;;;:::i;:::-;;;30076:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30322:6;:13;30339:1;30322:18;30318:272;;30365:60;;-1:-1:-1;;;30365:60:0;;;;;;;:::i;30318:272::-;30540:6;30534:13;30525:6;30521:2;30517:15;30510:38;30076:529;-1:-1:-1;;;;;;30203:51:0;-1:-1:-1;;;30203:51:0;;-1:-1:-1;30196:58:0;;30040:620;-1:-1:-1;30644:4:0;29868:799;;;;;;:::o;20248:334::-;20321:13;20355:16;20363:7;20355;:16::i;:::-;20347:76;;;;-1:-1:-1;;;20347:76:0;;30185:2:1;20347:76:0;;;30167:21:1;30224:2;30204:18;;;30197:30;30263:34;30243:18;;;30236:62;-1:-1:-1;;;30314:18:1;;;30307:45;30369:19;;20347:76:0;29983:411:1;20347:76:0;20436:21;20460:10;:8;:10::i;:::-;20436:34;;20512:1;20494:7;20488:21;:25;:86;;;;;;;;;;;;;;;;;20540:7;20549:18;:7;:16;:18::i;:::-;20523:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20488:86;20481:93;20248:334;-1:-1:-1;;;20248:334:0:o;34738:589::-;-1:-1:-1;;;;;34944:18:0;;34940:187;;34979:40;35011:7;36154:10;:17;;36127:24;;;;:15;:24;;;;;:44;;;36182:24;;;;;;;;;;;;36050:164;34979:40;34940:187;;;35049:2;-1:-1:-1;;;;;35041:10:0;:4;-1:-1:-1;;;;;35041:10:0;;35037:90;;35068:47;35101:4;35107:7;35068:32;:47::i;:::-;-1:-1:-1;;;;;35141:16:0;;35137:183;;35174:45;35211:7;35174:36;:45::i;35137:183::-;35247:4;-1:-1:-1;;;;;35241:10:0;:2;-1:-1:-1;;;;;35241:10:0;;35237:83;;35268:40;35296:2;35300:7;35268:27;:40::i;27277:360::-;27337:13;27353:23;27368:7;27353:14;:23::i;:::-;27337:39;;27389:48;27410:5;27425:1;27429:7;27389:20;:48::i;:::-;27478:29;27495:1;27499:7;27478:8;:29::i;:::-;-1:-1:-1;;;;;27520:16:0;;;;;;:9;:16;;;;;:21;;27540:1;;27520:16;:21;;27540:1;;27520:21;:::i;:::-;;;;-1:-1:-1;;27559:16:0;;;;:7;:16;;;;;;27552:23;;-1:-1:-1;;;;;;27552:23:0;;;27593:36;27567:7;;27559:16;-1:-1:-1;;;;;27593:36:0;;;;;27559:16;;27593:36;27326:311;27277:360;:::o;26038:321::-;26168:18;26174:2;26178:7;26168:5;:18::i;:::-;26219:54;26250:1;26254:2;26258:7;26267:5;26219:22;:54::i;:::-;26197:154;;;;-1:-1:-1;;;26197:154:0;;;;;;;:::i;36841:988::-;37107:22;37157:1;37132:22;37149:4;37132:16;:22::i;:::-;:26;;;;:::i;:::-;37169:18;37190:26;;;:17;:26;;;;;;37107:51;;-1:-1:-1;37323:28:0;;;37319:328;;-1:-1:-1;;;;;37390:18:0;;37368:19;37390:18;;;:12;:18;;;;;;;;:34;;;;;;;;;37441:30;;;;;;:44;;;37558:30;;:17;:30;;;;;:43;;;37319:328;-1:-1:-1;37743:26:0;;;;:17;:26;;;;;;;;37736:33;;;-1:-1:-1;;;;;37787:18:0;;;;;:12;:18;;;;;:34;;;;;;;37780:41;36841:988::o;38124:1079::-;38402:10;:17;38377:22;;38402:21;;38422:1;;38402:21;:::i;:::-;38434:18;38455:24;;;:15;:24;;;;;;38828:10;:26;;38377:46;;-1:-1:-1;38455:24:0;;38377:46;;38828:26;;;;;;:::i;:::-;;;;;;;;;38806:48;;38892:11;38867:10;38878;38867:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;38972:28;;;:15;:28;;;;;;;:41;;;39144:24;;;;;39137:31;39179:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;38195:1008;;;38124:1079;:::o;35628:221::-;35713:14;35730:20;35747:2;35730:16;:20::i;:::-;-1:-1:-1;;;;;35761:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;35806:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;35628:221:0:o;26695:353::-;-1:-1:-1;;;;;26775:16:0;;26767:61;;;;-1:-1:-1;;;26767:61:0;;30733:2:1;26767:61:0;;;30715:21:1;;;30752:18;;;30745:30;30811:34;30791:18;;;30784:62;30863:18;;26767:61:0;30531:356:1;26767:61:0;26848:16;26856:7;26848;:16::i;:::-;26847:17;26839:58;;;;-1:-1:-1;;;26839:58:0;;31094:2:1;26839:58:0;;;31076:21:1;31133:2;31113:18;;;31106:30;31172;31152:18;;;31145:58;31220:18;;26839:58:0;30892:352:1;26839:58:0;26910:45;26939:1;26943:2;26947:7;26910:20;:45::i;:::-;26968:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;26968:21:0;-1:-1:-1;;;;;26968:21:0;;;;;;;;27007:33;;26968:16;;;27007:33;;26968:16;;27007:33;26695:353;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2379:248::-;2447:6;2455;2508:2;2496:9;2487:7;2483:23;2479:32;2476:52;;;2524:1;2521;2514:12;2476:52;-1:-1:-1;;2547:23:1;;;2617:2;2602:18;;;2589:32;;-1:-1:-1;2379:248:1:o;2632:456::-;2709:6;2717;2725;2778:2;2766:9;2757:7;2753:23;2749:32;2746:52;;;2794:1;2791;2784:12;2746:52;2833:9;2820:23;2852:31;2877:5;2852:31;:::i;:::-;2902:5;-1:-1:-1;2959:2:1;2944:18;;2931:32;2972:33;2931:32;2972:33;:::i;:::-;2632:456;;3024:7;;-1:-1:-1;;;3078:2:1;3063:18;;;;3050:32;;2632:456::o;3372:348::-;3424:8;3434:6;3488:3;3481:4;3473:6;3469:17;3465:27;3455:55;;3506:1;3503;3496:12;3455:55;-1:-1:-1;3529:20:1;;3572:18;3561:30;;3558:50;;;3604:1;3601;3594:12;3558:50;3641:4;3633:6;3629:17;3617:29;;3693:3;3686:4;3677:6;3669;3665:19;3661:30;3658:39;3655:59;;;3710:1;3707;3700:12;3725:411;3796:6;3804;3857:2;3845:9;3836:7;3832:23;3828:32;3825:52;;;3873:1;3870;3863:12;3825:52;3913:9;3900:23;3946:18;3938:6;3935:30;3932:50;;;3978:1;3975;3968:12;3932:50;4017:59;4068:7;4059:6;4048:9;4044:22;4017:59;:::i;:::-;4095:8;;3991:85;;-1:-1:-1;3725:411:1;-1:-1:-1;;;;3725:411:1:o;4141:367::-;4204:8;4214:6;4268:3;4261:4;4253:6;4249:17;4245:27;4235:55;;4286:1;4283;4276:12;4235:55;-1:-1:-1;4309:20:1;;4352:18;4341:30;;4338:50;;;4384:1;4381;4374:12;4338:50;4421:4;4413:6;4409:17;4397:29;;4481:3;4474:4;4464:6;4461:1;4457:14;4449:6;4445:27;4441:38;4438:47;4435:67;;;4498:1;4495;4488:12;4513:773;4635:6;4643;4651;4659;4712:2;4700:9;4691:7;4687:23;4683:32;4680:52;;;4728:1;4725;4718:12;4680:52;4768:9;4755:23;4797:18;4838:2;4830:6;4827:14;4824:34;;;4854:1;4851;4844:12;4824:34;4893:70;4955:7;4946:6;4935:9;4931:22;4893:70;:::i;:::-;4982:8;;-1:-1:-1;4867:96:1;-1:-1:-1;5070:2:1;5055:18;;5042:32;;-1:-1:-1;5086:16:1;;;5083:36;;;5115:1;5112;5105:12;5083:36;;5154:72;5218:7;5207:8;5196:9;5192:24;5154:72;:::i;:::-;4513:773;;;;-1:-1:-1;5245:8:1;-1:-1:-1;;;;4513:773:1:o;5619:247::-;5678:6;5731:2;5719:9;5710:7;5706:23;5702:32;5699:52;;;5747:1;5744;5737:12;5699:52;5786:9;5773:23;5805:31;5830:5;5805:31;:::i;5871:315::-;5939:6;5947;6000:2;5988:9;5979:7;5975:23;5971:32;5968:52;;;6016:1;6013;6006:12;5968:52;6052:9;6039:23;6029:33;;6112:2;6101:9;6097:18;6084:32;6125:31;6150:5;6125:31;:::i;:::-;6175:5;6165:15;;;5871:315;;;;;:::o;6191:160::-;6256:20;;6312:13;;6305:21;6295:32;;6285:60;;6341:1;6338;6331:12;6285:60;6191:160;;;:::o;6356:315::-;6421:6;6429;6482:2;6470:9;6461:7;6457:23;6453:32;6450:52;;;6498:1;6495;6488:12;6450:52;6537:9;6524:23;6556:31;6581:5;6556:31;:::i;:::-;6606:5;-1:-1:-1;6630:35:1;6661:2;6646:18;;6630:35;:::i;:::-;6620:45;;6356:315;;;;;:::o;6676:452::-;6762:6;6770;6778;6786;6839:3;6827:9;6818:7;6814:23;6810:33;6807:53;;;6856:1;6853;6846:12;6807:53;6895:9;6882:23;6914:31;6939:5;6914:31;:::i;:::-;6964:5;7016:2;7001:18;;6988:32;;-1:-1:-1;7067:2:1;7052:18;;7039:32;;7118:2;7103:18;7090:32;;-1:-1:-1;6676:452:1;-1:-1:-1;;;6676:452:1:o;7133:1383::-;7449:2;7461:21;;;7531:13;;7434:18;;;7553:22;;;7401:4;;7629;;7606:3;7591:19;;;7656:15;;;7401:4;7699:169;7713:6;7710:1;7707:13;7699:169;;;7774:13;;7762:26;;7808:12;;;;7843:15;;;;7735:1;7728:9;7699:169;;;-1:-1:-1;;;7904:19:1;;;7884:18;;;7877:47;7974:13;;7996:21;;;8035:12;;;;8087:1;8083:16;;;8074:26;;8070:35;;8130:15;;;8165:1;8175:269;8191:8;8186:3;8183:17;8175:269;;;8286:2;8282:7;8276:3;8268:6;8264:16;8260:30;8253:5;8246:45;8314:42;8349:6;8338:8;8332:15;8314:42;:::i;:::-;8420:14;;;;8304:52;-1:-1:-1;8381:17:1;;;;8219:1;8210:11;8175:269;;;8179:3;;8461:6;8453:14;;;;;;;8503:6;8498:2;8487:9;8483:18;8476:34;7133:1383;;;;;;:::o;8521:479::-;8598:6;8606;8614;8667:2;8655:9;8646:7;8642:23;8638:32;8635:52;;;8683:1;8680;8673:12;8635:52;8723:9;8710:23;8756:18;8748:6;8745:30;8742:50;;;8788:1;8785;8778:12;8742:50;8827:59;8878:7;8869:6;8858:9;8854:22;8827:59;:::i;:::-;8905:8;;-1:-1:-1;8801:85:1;-1:-1:-1;8959:35:1;;-1:-1:-1;8990:2:1;8975:18;;8959:35;:::i;:::-;8949:45;;8521:479;;;;;:::o;9005:127::-;9066:10;9061:3;9057:20;9054:1;9047:31;9097:4;9094:1;9087:15;9121:4;9118:1;9111:15;9137:1266;9232:6;9240;9248;9256;9309:3;9297:9;9288:7;9284:23;9280:33;9277:53;;;9326:1;9323;9316:12;9277:53;9365:9;9352:23;9384:31;9409:5;9384:31;:::i;:::-;9434:5;-1:-1:-1;9491:2:1;9476:18;;9463:32;9504:33;9463:32;9504:33;:::i;:::-;9556:7;-1:-1:-1;9610:2:1;9595:18;;9582:32;;-1:-1:-1;9665:2:1;9650:18;;9637:32;9688:18;9718:14;;;9715:34;;;9745:1;9742;9735:12;9715:34;9783:6;9772:9;9768:22;9758:32;;9828:7;9821:4;9817:2;9813:13;9809:27;9799:55;;9850:1;9847;9840:12;9799:55;9886:2;9873:16;9908:2;9904;9901:10;9898:36;;;9914:18;;:::i;:::-;9989:2;9983:9;9957:2;10043:13;;-1:-1:-1;;10039:22:1;;;10063:2;10035:31;10031:40;10019:53;;;10087:18;;;10107:22;;;10084:46;10081:72;;;10133:18;;:::i;:::-;10173:10;10169:2;10162:22;10208:2;10200:6;10193:18;10248:7;10243:2;10238;10234;10230:11;10226:20;10223:33;10220:53;;;10269:1;10266;10259:12;10220:53;10325:2;10320;10316;10312:11;10307:2;10299:6;10295:15;10282:46;10370:1;10365:2;10360;10352:6;10348:15;10344:24;10337:35;10391:6;10381:16;;;;;;;9137:1266;;;;;;;:::o;10408:505::-;10500:6;10508;10516;10569:2;10557:9;10548:7;10544:23;10540:32;10537:52;;;10585:1;10582;10575:12;10537:52;10625:9;10612:23;10658:18;10650:6;10647:30;10644:50;;;10690:1;10687;10680:12;10644:50;10729:70;10791:7;10782:6;10771:9;10767:22;10729:70;:::i;10918:388::-;10986:6;10994;11047:2;11035:9;11026:7;11022:23;11018:32;11015:52;;;11063:1;11060;11053:12;11015:52;11102:9;11089:23;11121:31;11146:5;11121:31;:::i;:::-;11171:5;-1:-1:-1;11228:2:1;11213:18;;11200:32;11241:33;11200:32;11241:33;:::i;11311:356::-;11513:2;11495:21;;;11532:18;;;11525:30;11591:34;11586:2;11571:18;;11564:62;11658:2;11643:18;;11311:356::o;11672:380::-;11751:1;11747:12;;;;11794;;;11815:61;;11869:4;11861:6;11857:17;11847:27;;11815:61;11922:2;11914:6;11911:14;11891:18;11888:38;11885:161;;11968:10;11963:3;11959:20;11956:1;11949:31;12003:4;12000:1;11993:15;12031:4;12028:1;12021:15;11885:161;;11672:380;;;:::o;13297:413::-;13499:2;13481:21;;;13538:2;13518:18;;;13511:30;13577:34;13572:2;13557:18;;13550:62;-1:-1:-1;;;13643:2:1;13628:18;;13621:47;13700:3;13685:19;;13297:413::o;13715:127::-;13776:10;13771:3;13767:20;13764:1;13757:31;13807:4;13804:1;13797:15;13831:4;13828:1;13821:15;13847:168;13920:9;;;13951;;13968:15;;;13962:22;;13948:37;13938:71;;13989:18;;:::i;14020:127::-;14081:10;14076:3;14072:20;14069:1;14062:31;14112:4;14109:1;14102:15;14136:4;14133:1;14126:15;14152:120;14192:1;14218;14208:35;;14223:18;;:::i;:::-;-1:-1:-1;14257:9:1;;14152:120::o;14815:545::-;14917:2;14912:3;14909:11;14906:448;;;14953:1;14978:5;14974:2;14967:17;15023:4;15019:2;15009:19;15093:2;15081:10;15077:19;15074:1;15070:27;15064:4;15060:38;15129:4;15117:10;15114:20;15111:47;;;-1:-1:-1;15152:4:1;15111:47;15207:2;15202:3;15198:12;15195:1;15191:20;15185:4;15181:31;15171:41;;15262:82;15280:2;15273:5;15270:13;15262:82;;;15325:17;;;15306:1;15295:13;15262:82;;;15266:3;;;14815:545;;;:::o;15536:1206::-;15660:18;15655:3;15652:27;15649:53;;;15682:18;;:::i;:::-;15711:94;15801:3;15761:38;15793:4;15787:11;15761:38;:::i;:::-;15755:4;15711:94;:::i;:::-;15831:1;15856:2;15851:3;15848:11;15873:1;15868:616;;;;16528:1;16545:3;16542:93;;;-1:-1:-1;16601:19:1;;;16588:33;16542:93;-1:-1:-1;;15493:1:1;15489:11;;;15485:24;15481:29;15471:40;15517:1;15513:11;;;15468:57;16648:78;;15841:895;;15868:616;14762:1;14755:14;;;14799:4;14786:18;;-1:-1:-1;;15904:17:1;;;16005:9;16027:229;16041:7;16038:1;16035:14;16027:229;;;16130:19;;;16117:33;16102:49;;16237:4;16222:20;;;;16190:1;16178:14;;;;16057:12;16027:229;;;16031:3;16284;16275:7;16272:16;16269:159;;;16408:1;16404:6;16398:3;16392;16389:1;16385:11;16381:21;16377:34;16373:39;16360:9;16355:3;16351:19;16338:33;16334:79;16326:6;16319:95;16269:159;;;16471:1;16465:3;16462:1;16458:11;16454:19;16448:4;16441:33;15841:895;;15536:1206;;;:::o;17577:127::-;17638:10;17633:3;17629:20;17626:1;17619:31;17669:4;17666:1;17659:15;17693:4;17690:1;17683:15;17709:128;17776:9;;;17797:11;;;17794:37;;;17811:18;;:::i;17842:408::-;18044:2;18026:21;;;18083:2;18063:18;;;18056:30;18122:34;18117:2;18102:18;;18095:62;-1:-1:-1;;;18188:2:1;18173:18;;18166:42;18240:3;18225:19;;17842:408::o;18255:135::-;18294:3;18315:17;;;18312:43;;18335:18;;:::i;:::-;-1:-1:-1;18382:1:1;18371:13;;18255:135::o;19216:184::-;19286:6;19339:2;19327:9;19318:7;19314:23;19310:32;19307:52;;;19355:1;19352;19345:12;19307:52;-1:-1:-1;19378:16:1;;19216:184;-1:-1:-1;19216:184:1:o;20102:125::-;20167:9;;;20188:10;;;20185:36;;;20201:18;;:::i;23326:413::-;23528:2;23510:21;;;23567:2;23547:18;;;23540:30;23606:34;23601:2;23586:18;;23579:62;-1:-1:-1;;;23672:2:1;23657:18;;23650:47;23729:3;23714:19;;23326:413::o;23744:112::-;23776:1;23802;23792:35;;23807:18;;:::i;:::-;-1:-1:-1;23841:9:1;;23744:112::o;27607:414::-;27809:2;27791:21;;;27848:2;27828:18;;;27821:30;27887:34;27882:2;27867:18;;27860:62;-1:-1:-1;;;27953:2:1;27938:18;;27931:48;28011:3;27996:19;;27607:414::o;28026:703::-;28253:3;28291:6;28285:13;28307:66;28366:6;28361:3;28354:4;28346:6;28342:17;28307:66;:::i;:::-;28436:13;;28395:16;;;;28458:70;28436:13;28395:16;28505:4;28493:17;;28458:70;:::i;:::-;28595:13;;28550:20;;;28617:70;28595:13;28550:20;28664:4;28652:17;;28617:70;:::i;:::-;28703:20;;28026:703;-1:-1:-1;;;;;28026:703:1:o;28734:496::-;28913:3;28951:6;28945:13;28967:66;29026:6;29021:3;29014:4;29006:6;29002:17;28967:66;:::i;:::-;29096:13;;29055:16;;;;29118:70;29096:13;29055:16;29165:4;29153:17;;29118:70;:::i;:::-;29204:20;;28734:496;-1:-1:-1;;;;28734:496:1:o;29235:489::-;-1:-1:-1;;;;;29504:15:1;;;29486:34;;29556:15;;29551:2;29536:18;;29529:43;29603:2;29588:18;;29581:34;;;29651:3;29646:2;29631:18;;29624:31;;;29429:4;;29672:46;;29698:19;;29690:6;29672:46;:::i;:::-;29664:54;29235:489;-1:-1:-1;;;;;;29235:489:1:o;29729:249::-;29798:6;29851:2;29839:9;29830:7;29826:23;29822:32;29819:52;;;29867:1;29864;29857:12;29819:52;29899:9;29893:16;29918:30;29942:5;29918:30;:::i;30399:127::-;30460:10;30455:3;30451:20;30448:1;30441:31;30491:4;30488:1;30481:15;30515:4;30512:1;30505:15

Swarm Source

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