FTM Price: $1.26 (-4.96%)
Gas: 3.5 GWei
 

Overview

Max Total Supply

1,155 HAMSTORY

Holders

1,004

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Balance
0 HAMSTORY
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
HamStory

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2021-12-15
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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 Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

    /**
     * @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}. 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
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _balances[to] += 1;
        _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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 {}
}

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

/**
 * @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 unpaused state.
     */
    constructor() {
        _paused = false;
    }

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

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

pragma solidity ^0.8.0;

/**
 * @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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

pragma solidity ^0.8.7;

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

interface IERC20 {
    function transfer(address _to, uint256 _amount) external returns (bool);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
}

pragma solidity ^0.8.0;

contract HamStory is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    IERC2981,
    Pausable,
    Ownable,
    ERC721Burnable
{
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;


    string public baseURI;
    address private royaltyAddress=0x5e6067e5ccA3a5aEe7a5991e482A026A68C3E42d;
    uint256 public royalty = 500;

    constructor() ERC721("HamStory", "HAMSTORY") {
    }


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


    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function royaltyInfo(uint256, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (royaltyAddress, (_salePrice * royalty) / 10000);
    }

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

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

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }
    
    function setIPFSHash(string memory _uri, uint256 start, uint256 end) public onlyOwner {
        for (uint256 i = start; i <= end; i++) {
         _setTokenURI(i, _uri);
        }
    }

    
    function setRoyalty(uint16 _royalty) external onlyOwner {
        require(_royalty >= 0, "Royalty must be greater than or equal to 0%");
        require(
            _royalty <= 750,
            "Royalty must be greater than or equal to 7.5%"
        );

        royalty = _royalty;
    }
    
    function setRoyaltyAddress(address _royaltyAddress) external onlyOwner {
        royaltyAddress = _royaltyAddress;
    }
    
    function distStory(uint256 amount, address _addr, string memory uri) public onlyOwner {
        for (uint256 i = 0; i < amount; i++) {
            internalMint(_addr,uri);
        }
    }
    
    function distStoryMulti(address[] memory _addr, uint256 amount, string memory uri) public onlyOwner {
        for (uint256 i = 0; i < _addr.length; i++) {
                distStoryInternal(amount,_addr[i],uri);
        }
    }
    
    function distStoryInternal(uint256 amount, address _addr, string memory uri) internal {
        for (uint256 i = 0; i < amount; i++) {
            internalMint(_addr,uri);
        }
    }
    
     function internalMint(address to,string memory uri) internal {
        _safeMint(to, _tokenIdCounter.current());
         _setTokenURI(_tokenIdCounter.current(), uri);
        _tokenIdCounter.increment();
    }
    
   
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    
    function bannersOwned(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    

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

    function withdraw() public onlyOwner{
        uint256 amount=(address(this).balance);
        payable(msg.sender).transfer(amount);
    }
    
    receive() external payable {
    }
    
}

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":"address","name":"_owner","type":"address"}],"name":"bannersOwned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"distStory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addr","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"distStoryMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"setIPFSHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052735e6067e5cca3a5aee7a5991e482a026a68c3e42d600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101f4600f553480156200006c57600080fd5b506040518060400160405280600881526020017f48616d53746f72790000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f48414d53544f52590000000000000000000000000000000000000000000000008152508160009080519060200190620000f1929190620001e7565b5080600190805190602001906200010a929190620001e7565b5050506000600b60006101000a81548160ff02191690831515021790555060006200013a620001df60201b60201c565b905080600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002fc565b600033905090565b828054620001f59062000297565b90600052602060002090601f01602090048101928262000219576000855562000265565b82601f106200023457805160ff191683800117855562000265565b8280016001018555821562000265579182015b828111156200026457825182559160200191906001019062000247565b5b50905062000274919062000278565b5090565b5b808211156200029357600081600090555060010162000279565b5090565b60006002820490506001821680620002b057607f821691505b60208210811415620002c757620002c6620002cd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615036806200030c6000396000f3fe6080604052600436106101fd5760003560e01c806354309fcf1161010d5780638da5cb5b116100a0578063b34fd42c1161006f578063b34fd42c14610701578063b88d4fde1461073e578063c87b56dd14610767578063e985e9c5146107a4578063f2fde38b146107e157610204565b80638da5cb5b1461065957806395d89b4114610684578063a22cb465146106af578063b344e8ca146106d857610204565b80636c0360eb116100dc5780636c0360eb146105c357806370a08231146105ee578063715018a61461062b5780638456cb591461064257610204565b806354309fcf1461050957806355f804b3146105325780635c975abb1461055b5780636352211e1461058657610204565b80632a55205a116101905780633f4ba83a1161015f5780633f4ba83a1461043a57806342031b7a1461045157806342842e0e1461047a57806342966c68146104a35780634f6ccce7146104cc57610204565b80632a55205a1461037f5780632f745c59146103bd57806336e79a5a146103fa5780633ccfd60b1461042357610204565b8063095ea7b3116101cc578063095ea7b3146102d757806318160ddd1461030057806323b872dd1461032b57806329ee566c1461035457610204565b806301ffc9a71461020957806306d254da1461024657806306fdde031461026f578063081812fc1461029a57610204565b3661020457005b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613868565b61080a565b60405161023d9190614019565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061361a565b610884565b005b34801561027b57600080fd5b50610284610944565b6040516102919190614034565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906139a7565b6109d6565b6040516102ce9190613f67565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f9919061379d565b610a5b565b005b34801561030c57600080fd5b50610315610b73565b6040516103229190614376565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190613687565b610b80565b005b34801561036057600080fd5b50610369610be0565b6040516103769190614376565b60405180910390f35b34801561038b57600080fd5b506103a660048036038101906103a19190613a43565b610be6565b6040516103b4929190613fce565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df919061379d565b610c32565b6040516103f19190614376565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c919061397a565b610cd7565b005b34801561042f57600080fd5b50610438610df2565b005b34801561044657600080fd5b5061044f610ebd565b005b34801561045d57600080fd5b50610478600480360381019061047391906137dd565b610f43565b005b34801561048657600080fd5b506104a1600480360381019061049c9190613687565b611009565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906139a7565b611029565b005b3480156104d857600080fd5b506104f360048036038101906104ee91906139a7565b611085565b6040516105009190614376565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b919061390b565b6110f6565b005b34801561053e57600080fd5b50610559600480360381019061055491906138c2565b6111a2565b005b34801561056757600080fd5b50610570611238565b60405161057d9190614019565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a891906139a7565b61124f565b6040516105ba9190613f67565b60405180910390f35b3480156105cf57600080fd5b506105d8611301565b6040516105e59190614034565b60405180910390f35b3480156105fa57600080fd5b506106156004803603810190610610919061361a565b61138f565b6040516106229190614376565b60405180910390f35b34801561063757600080fd5b50610640611447565b005b34801561064e57600080fd5b50610657611584565b005b34801561066557600080fd5b5061066e61160a565b60405161067b9190613f67565b60405180910390f35b34801561069057600080fd5b50610699611634565b6040516106a69190614034565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d1919061375d565b6116c6565b005b3480156106e457600080fd5b506106ff60048036038101906106fa91906139d4565b611847565b005b34801561070d57600080fd5b506107286004803603810190610723919061361a565b6118f1565b6040516107359190613ff7565b60405180910390f35b34801561074a57600080fd5b50610765600480360381019061076091906136da565b6119fb565b005b34801561077357600080fd5b5061078e600480360381019061078991906139a7565b611a5d565b60405161079b9190614034565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613647565b611a6f565b6040516107d89190614019565b60405180910390f35b3480156107ed57600080fd5b506108086004803603810190610803919061361a565b611b03565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087d575061087c82611caf565b5b9050919050565b61088c611d29565b73ffffffffffffffffffffffffffffffffffffffff166108aa61160a565b73ffffffffffffffffffffffffffffffffffffffff1614610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790614276565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000805461095390614699565b80601f016020809104026020016040519081016040528092919081815260200182805461097f90614699565b80156109cc5780601f106109a1576101008083540402835291602001916109cc565b820191906000526020600020905b8154815290600101906020018083116109af57829003601f168201915b5050505050905090565b60006109e182611d31565b610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1790614256565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a668261124f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ace906142d6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af6611d29565b73ffffffffffffffffffffffffffffffffffffffff161480610b255750610b2481610b1f611d29565b611a6f565b5b610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b90614176565b60405180910390fd5b610b6e8383611d9d565b505050565b6000600880549050905090565b610b91610b8b611d29565b82611e56565b610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc790614316565b60405180910390fd5b610bdb838383611f34565b505050565b600f5481565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600f5485610c1d9190614547565b610c279190614516565b915091509250929050565b6000610c3d8361138f565b8210610c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7590614076565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610cdf611d29565b73ffffffffffffffffffffffffffffffffffffffff16610cfd61160a565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614276565b60405180910390fd5b60008161ffff161015610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9290614196565b60405180910390fd5b6102ee8161ffff161115610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb906142f6565b60405180910390fd5b8061ffff16600f8190555050565b610dfa611d29565b73ffffffffffffffffffffffffffffffffffffffff16610e1861160a565b73ffffffffffffffffffffffffffffffffffffffff1614610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590614276565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610eb9573d6000803e3d6000fd5b5050565b610ec5611d29565b73ffffffffffffffffffffffffffffffffffffffff16610ee361160a565b73ffffffffffffffffffffffffffffffffffffffff1614610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3090614276565b60405180910390fd5b610f41612190565b565b610f4b611d29565b73ffffffffffffffffffffffffffffffffffffffff16610f6961160a565b73ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb690614276565b60405180910390fd5b60005b835181101561100357610ff083858381518110610fe257610fe1614832565b5b602002602001015184612232565b8080610ffb906146fc565b915050610fc2565b50505050565b611024838383604051806020016040528060008152506119fb565b505050565b61103a611034611d29565b82611e56565b611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090614356565b60405180910390fd5b61108281612260565b50565b600061108f610b73565b82106110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790614336565b60405180910390fd5b600882815481106110e4576110e3614832565b5b90600052602060002001549050919050565b6110fe611d29565b73ffffffffffffffffffffffffffffffffffffffff1661111c61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614276565b60405180910390fd5b60008290505b81811161119c57611189818561226c565b8080611194906146fc565b915050611178565b50505050565b6111aa611d29565b73ffffffffffffffffffffffffffffffffffffffff166111c861160a565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590614276565b60405180910390fd5b80600d908051906020019061123492919061333b565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef906141d6565b60405180910390fd5b80915050919050565b600d805461130e90614699565b80601f016020809104026020016040519081016040528092919081815260200182805461133a90614699565b80156113875780601f1061135c57610100808354040283529160200191611387565b820191906000526020600020905b81548152906001019060200180831161136a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f7906141b6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61144f611d29565b73ffffffffffffffffffffffffffffffffffffffff1661146d61160a565b73ffffffffffffffffffffffffffffffffffffffff16146114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61158c611d29565b73ffffffffffffffffffffffffffffffffffffffff166115aa61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790614276565b60405180910390fd5b6116086122e0565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461164390614699565b80601f016020809104026020016040519081016040528092919081815260200182805461166f90614699565b80156116bc5780601f10611691576101008083540402835291602001916116bc565b820191906000526020600020905b81548152906001019060200180831161169f57829003601f168201915b5050505050905090565b6116ce611d29565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173390614116565b60405180910390fd5b8060056000611749611d29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117f6611d29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161183b9190614019565b60405180910390a35050565b61184f611d29565b73ffffffffffffffffffffffffffffffffffffffff1661186d61160a565b73ffffffffffffffffffffffffffffffffffffffff16146118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ba90614276565b60405180910390fd5b60005b838110156118eb576118d88383612383565b80806118e3906146fc565b9150506118c6565b50505050565b606060006118fe8361138f565b9050600081141561195b57600067ffffffffffffffff81111561192457611923614861565b5b6040519080825280602002602001820160405280156119525781602001602082028036833780820191505090505b509150506119f6565b60008167ffffffffffffffff81111561197757611976614861565b5b6040519080825280602002602001820160405280156119a55781602001602082028036833780820191505090505b50905060005b828110156119ef576119bd8582610c32565b8282815181106119d0576119cf614832565b5b60200260200101818152505080806119e7906146fc565b9150506119ab565b8193505050505b919050565b611a0c611a06611d29565b83611e56565b611a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4290614316565b60405180910390fd5b611a57848484846123b7565b50505050565b6060611a6882612413565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b0b611d29565b73ffffffffffffffffffffffffffffffffffffffff16611b2961160a565b73ffffffffffffffffffffffffffffffffffffffff1614611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690614276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be6906140b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d225750611d2182612565565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e108361124f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e6182611d31565b611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9790614136565b60405180910390fd5b6000611eab8361124f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f1a57508373ffffffffffffffffffffffffffffffffffffffff16611f02846109d6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f2b5750611f2a8185611a6f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f548261124f565b73ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190614296565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561201a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612011906140f6565b60405180910390fd5b612025838383612647565b612030600082611d9d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461208091906145a1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120d791906144c0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612198611238565b6121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce90614056565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61221b611d29565b6040516122289190613f67565b60405180910390a1565b60005b8381101561225a576122478383612383565b8080612252906146fc565b915050612235565b50505050565b6122698161269f565b50565b61227582611d31565b6122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab906141f6565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906122db92919061333b565b505050565b6122e8611238565b15612328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231f90614156565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861236c611d29565b6040516123799190613f67565b60405180910390a1565b61239682612391600c6126f2565b612700565b6123a96123a3600c6126f2565b8261226c565b6123b3600c61271e565b5050565b6123c2848484611f34565b6123ce84848484612734565b61240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614096565b60405180910390fd5b50505050565b606061241e82611d31565b61245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245490614236565b60405180910390fd5b6000600a6000848152602001908152602001600020805461247d90614699565b80601f01602080910402602001604051908101604052809291908181526020018280546124a990614699565b80156124f65780601f106124cb576101008083540402835291602001916124f6565b820191906000526020600020905b8154815290600101906020018083116124d957829003601f168201915b5050505050905060006125076128cb565b905060008151141561251d578192505050612560565b60008251111561255257808260405160200161253a929190613f43565b60405160208183030381529060405292505050612560565b61255b8461295d565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612640575061263f82612a04565b5b9050919050565b61264f611238565b1561268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690614156565b60405180910390fd5b61269a838383612a6e565b505050565b6126a881612b82565b6000600a600083815260200190815260200160002080546126c890614699565b9050146126ef57600a600082815260200190815260200160002060006126ee91906133c1565b5b50565b600081600001549050919050565b61271a828260405180602001604052806000815250612c93565b5050565b6001816000016000828254019250508190555050565b60006127558473ffffffffffffffffffffffffffffffffffffffff16612cee565b156128be578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261277e611d29565b8786866040518563ffffffff1660e01b81526004016127a09493929190613f82565b602060405180830381600087803b1580156127ba57600080fd5b505af19250505080156127eb57506040513d601f19601f820116820180604052508101906127e89190613895565b60015b61286e573d806000811461281b576040519150601f19603f3d011682016040523d82523d6000602084013e612820565b606091505b50600081511415612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90614096565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128c3565b600190505b949350505050565b6060600d80546128da90614699565b80601f016020809104026020016040519081016040528092919081815260200182805461290690614699565b80156129535780601f1061292857610100808354040283529160200191612953565b820191906000526020600020905b81548152906001019060200180831161293657829003601f168201915b5050505050905090565b606061296882611d31565b6129a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299e906142b6565b60405180910390fd5b60006129b16128cb565b905060008151116129d157604051806020016040528060008152506129fc565b806129db84612d01565b6040516020016129ec929190613f43565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a79838383612e62565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612abc57612ab781612e67565b612afb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612afa57612af98382612eb0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b3e57612b398161301d565b612b7d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b7c57612b7b82826130ee565b5b5b505050565b6000612b8d8261124f565b9050612b9b81600084612647565b612ba6600083611d9d565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf691906145a1565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612c9d838361316d565b612caa6000848484612734565b612ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce090614096565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60606000821415612d49576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e5d565b600082905060005b60008214612d7b578080612d64906146fc565b915050600a82612d749190614516565b9150612d51565b60008167ffffffffffffffff811115612d9757612d96614861565b5b6040519080825280601f01601f191660200182016040528015612dc95781602001600182028036833780820191505090505b5090505b60008514612e5657600182612de291906145a1565b9150600a85612df19190614745565b6030612dfd91906144c0565b60f81b818381518110612e1357612e12614832565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e4f9190614516565b9450612dcd565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ebd8461138f565b612ec791906145a1565b9050600060076000848152602001908152602001600020549050818114612fac576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061303191906145a1565b905060006009600084815260200190815260200160002054905060006008838154811061306157613060614832565b5b90600052602060002001549050806008838154811061308357613082614832565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130d2576130d1614803565b5b6001900381819060005260206000200160009055905550505050565b60006130f98361138f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d490614216565b60405180910390fd5b6131e681611d31565b15613226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321d906140d6565b60405180910390fd5b61323260008383612647565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461328291906144c0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461334790614699565b90600052602060002090601f01602090048101928261336957600085556133b0565b82601f1061338257805160ff19168380011785556133b0565b828001600101855582156133b0579182015b828111156133af578251825591602001919060010190613394565b5b5090506133bd9190613401565b5090565b5080546133cd90614699565b6000825580601f106133df57506133fe565b601f0160209004906000526020600020908101906133fd9190613401565b5b50565b5b8082111561341a576000816000905550600101613402565b5090565b600061343161342c846143b6565b614391565b9050808382526020820190508285602086028201111561345457613453614895565b5b60005b85811015613484578161346a8882613512565b845260208401935060208301925050600181019050613457565b5050509392505050565b60006134a161349c846143e2565b614391565b9050828152602081018484840111156134bd576134bc61489a565b5b6134c8848285614657565b509392505050565b60006134e36134de84614413565b614391565b9050828152602081018484840111156134ff576134fe61489a565b5b61350a848285614657565b509392505050565b60008135905061352181614f8d565b92915050565b600082601f83011261353c5761353b614890565b5b813561354c84826020860161341e565b91505092915050565b60008135905061356481614fa4565b92915050565b60008135905061357981614fbb565b92915050565b60008151905061358e81614fbb565b92915050565b600082601f8301126135a9576135a8614890565b5b81356135b984826020860161348e565b91505092915050565b600082601f8301126135d7576135d6614890565b5b81356135e78482602086016134d0565b91505092915050565b6000813590506135ff81614fd2565b92915050565b60008135905061361481614fe9565b92915050565b6000602082840312156136305761362f6148a4565b5b600061363e84828501613512565b91505092915050565b6000806040838503121561365e5761365d6148a4565b5b600061366c85828601613512565b925050602061367d85828601613512565b9150509250929050565b6000806000606084860312156136a05761369f6148a4565b5b60006136ae86828701613512565b93505060206136bf86828701613512565b92505060406136d086828701613605565b9150509250925092565b600080600080608085870312156136f4576136f36148a4565b5b600061370287828801613512565b945050602061371387828801613512565b935050604061372487828801613605565b925050606085013567ffffffffffffffff8111156137455761374461489f565b5b61375187828801613594565b91505092959194509250565b60008060408385031215613774576137736148a4565b5b600061378285828601613512565b925050602061379385828601613555565b9150509250929050565b600080604083850312156137b4576137b36148a4565b5b60006137c285828601613512565b92505060206137d385828601613605565b9150509250929050565b6000806000606084860312156137f6576137f56148a4565b5b600084013567ffffffffffffffff8111156138145761381361489f565b5b61382086828701613527565b935050602061383186828701613605565b925050604084013567ffffffffffffffff8111156138525761385161489f565b5b61385e868287016135c2565b9150509250925092565b60006020828403121561387e5761387d6148a4565b5b600061388c8482850161356a565b91505092915050565b6000602082840312156138ab576138aa6148a4565b5b60006138b98482850161357f565b91505092915050565b6000602082840312156138d8576138d76148a4565b5b600082013567ffffffffffffffff8111156138f6576138f561489f565b5b613902848285016135c2565b91505092915050565b600080600060608486031215613924576139236148a4565b5b600084013567ffffffffffffffff8111156139425761394161489f565b5b61394e868287016135c2565b935050602061395f86828701613605565b925050604061397086828701613605565b9150509250925092565b6000602082840312156139905761398f6148a4565b5b600061399e848285016135f0565b91505092915050565b6000602082840312156139bd576139bc6148a4565b5b60006139cb84828501613605565b91505092915050565b6000806000606084860312156139ed576139ec6148a4565b5b60006139fb86828701613605565b9350506020613a0c86828701613512565b925050604084013567ffffffffffffffff811115613a2d57613a2c61489f565b5b613a39868287016135c2565b9150509250925092565b60008060408385031215613a5a57613a596148a4565b5b6000613a6885828601613605565b9250506020613a7985828601613605565b9150509250929050565b6000613a8f8383613f25565b60208301905092915050565b613aa4816145d5565b82525050565b6000613ab582614454565b613abf8185614482565b9350613aca83614444565b8060005b83811015613afb578151613ae28882613a83565b9750613aed83614475565b925050600181019050613ace565b5085935050505092915050565b613b11816145e7565b82525050565b6000613b228261445f565b613b2c8185614493565b9350613b3c818560208601614666565b613b45816148a9565b840191505092915050565b6000613b5b8261446a565b613b6581856144a4565b9350613b75818560208601614666565b613b7e816148a9565b840191505092915050565b6000613b948261446a565b613b9e81856144b5565b9350613bae818560208601614666565b80840191505092915050565b6000613bc76014836144a4565b9150613bd2826148ba565b602082019050919050565b6000613bea602b836144a4565b9150613bf5826148e3565b604082019050919050565b6000613c0d6032836144a4565b9150613c1882614932565b604082019050919050565b6000613c306026836144a4565b9150613c3b82614981565b604082019050919050565b6000613c53601c836144a4565b9150613c5e826149d0565b602082019050919050565b6000613c766024836144a4565b9150613c81826149f9565b604082019050919050565b6000613c996019836144a4565b9150613ca482614a48565b602082019050919050565b6000613cbc602c836144a4565b9150613cc782614a71565b604082019050919050565b6000613cdf6010836144a4565b9150613cea82614ac0565b602082019050919050565b6000613d026038836144a4565b9150613d0d82614ae9565b604082019050919050565b6000613d25602b836144a4565b9150613d3082614b38565b604082019050919050565b6000613d48602a836144a4565b9150613d5382614b87565b604082019050919050565b6000613d6b6029836144a4565b9150613d7682614bd6565b604082019050919050565b6000613d8e602e836144a4565b9150613d9982614c25565b604082019050919050565b6000613db16020836144a4565b9150613dbc82614c74565b602082019050919050565b6000613dd46031836144a4565b9150613ddf82614c9d565b604082019050919050565b6000613df7602c836144a4565b9150613e0282614cec565b604082019050919050565b6000613e1a6020836144a4565b9150613e2582614d3b565b602082019050919050565b6000613e3d6029836144a4565b9150613e4882614d64565b604082019050919050565b6000613e60602f836144a4565b9150613e6b82614db3565b604082019050919050565b6000613e836021836144a4565b9150613e8e82614e02565b604082019050919050565b6000613ea6602d836144a4565b9150613eb182614e51565b604082019050919050565b6000613ec96031836144a4565b9150613ed482614ea0565b604082019050919050565b6000613eec602c836144a4565b9150613ef782614eef565b604082019050919050565b6000613f0f6030836144a4565b9150613f1a82614f3e565b604082019050919050565b613f2e8161464d565b82525050565b613f3d8161464d565b82525050565b6000613f4f8285613b89565b9150613f5b8284613b89565b91508190509392505050565b6000602082019050613f7c6000830184613a9b565b92915050565b6000608082019050613f976000830187613a9b565b613fa46020830186613a9b565b613fb16040830185613f34565b8181036060830152613fc38184613b17565b905095945050505050565b6000604082019050613fe36000830185613a9b565b613ff06020830184613f34565b9392505050565b600060208201905081810360008301526140118184613aaa565b905092915050565b600060208201905061402e6000830184613b08565b92915050565b6000602082019050818103600083015261404e8184613b50565b905092915050565b6000602082019050818103600083015261406f81613bba565b9050919050565b6000602082019050818103600083015261408f81613bdd565b9050919050565b600060208201905081810360008301526140af81613c00565b9050919050565b600060208201905081810360008301526140cf81613c23565b9050919050565b600060208201905081810360008301526140ef81613c46565b9050919050565b6000602082019050818103600083015261410f81613c69565b9050919050565b6000602082019050818103600083015261412f81613c8c565b9050919050565b6000602082019050818103600083015261414f81613caf565b9050919050565b6000602082019050818103600083015261416f81613cd2565b9050919050565b6000602082019050818103600083015261418f81613cf5565b9050919050565b600060208201905081810360008301526141af81613d18565b9050919050565b600060208201905081810360008301526141cf81613d3b565b9050919050565b600060208201905081810360008301526141ef81613d5e565b9050919050565b6000602082019050818103600083015261420f81613d81565b9050919050565b6000602082019050818103600083015261422f81613da4565b9050919050565b6000602082019050818103600083015261424f81613dc7565b9050919050565b6000602082019050818103600083015261426f81613dea565b9050919050565b6000602082019050818103600083015261428f81613e0d565b9050919050565b600060208201905081810360008301526142af81613e30565b9050919050565b600060208201905081810360008301526142cf81613e53565b9050919050565b600060208201905081810360008301526142ef81613e76565b9050919050565b6000602082019050818103600083015261430f81613e99565b9050919050565b6000602082019050818103600083015261432f81613ebc565b9050919050565b6000602082019050818103600083015261434f81613edf565b9050919050565b6000602082019050818103600083015261436f81613f02565b9050919050565b600060208201905061438b6000830184613f34565b92915050565b600061439b6143ac565b90506143a782826146cb565b919050565b6000604051905090565b600067ffffffffffffffff8211156143d1576143d0614861565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143fd576143fc614861565b5b614406826148a9565b9050602081019050919050565b600067ffffffffffffffff82111561442e5761442d614861565b5b614437826148a9565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144cb8261464d565b91506144d68361464d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561450b5761450a614776565b5b828201905092915050565b60006145218261464d565b915061452c8361464d565b92508261453c5761453b6147a5565b5b828204905092915050565b60006145528261464d565b915061455d8361464d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561459657614595614776565b5b828202905092915050565b60006145ac8261464d565b91506145b78361464d565b9250828210156145ca576145c9614776565b5b828203905092915050565b60006145e08261462d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614684578082015181840152602081019050614669565b83811115614693576000848401525b50505050565b600060028204905060018216806146b157607f821691505b602082108114156146c5576146c46147d4565b5b50919050565b6146d4826148a9565b810181811067ffffffffffffffff821117156146f3576146f2614861565b5b80604052505050565b60006147078261464d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561473a57614739614776565b5b600182019050919050565b60006147508261464d565b915061475b8361464d565b92508261476b5761476a6147a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f203025000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f20372e352500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b614f96816145d5565b8114614fa157600080fd5b50565b614fad816145e7565b8114614fb857600080fd5b50565b614fc4816145f3565b8114614fcf57600080fd5b50565b614fdb8161461f565b8114614fe657600080fd5b50565b614ff28161464d565b8114614ffd57600080fd5b5056fea2646970667358221220e7ac73f18e10313412a908eb370a486c1f924095d15a68e3b5a073202cd5204a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c806354309fcf1161010d5780638da5cb5b116100a0578063b34fd42c1161006f578063b34fd42c14610701578063b88d4fde1461073e578063c87b56dd14610767578063e985e9c5146107a4578063f2fde38b146107e157610204565b80638da5cb5b1461065957806395d89b4114610684578063a22cb465146106af578063b344e8ca146106d857610204565b80636c0360eb116100dc5780636c0360eb146105c357806370a08231146105ee578063715018a61461062b5780638456cb591461064257610204565b806354309fcf1461050957806355f804b3146105325780635c975abb1461055b5780636352211e1461058657610204565b80632a55205a116101905780633f4ba83a1161015f5780633f4ba83a1461043a57806342031b7a1461045157806342842e0e1461047a57806342966c68146104a35780634f6ccce7146104cc57610204565b80632a55205a1461037f5780632f745c59146103bd57806336e79a5a146103fa5780633ccfd60b1461042357610204565b8063095ea7b3116101cc578063095ea7b3146102d757806318160ddd1461030057806323b872dd1461032b57806329ee566c1461035457610204565b806301ffc9a71461020957806306d254da1461024657806306fdde031461026f578063081812fc1461029a57610204565b3661020457005b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613868565b61080a565b60405161023d9190614019565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061361a565b610884565b005b34801561027b57600080fd5b50610284610944565b6040516102919190614034565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906139a7565b6109d6565b6040516102ce9190613f67565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f9919061379d565b610a5b565b005b34801561030c57600080fd5b50610315610b73565b6040516103229190614376565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190613687565b610b80565b005b34801561036057600080fd5b50610369610be0565b6040516103769190614376565b60405180910390f35b34801561038b57600080fd5b506103a660048036038101906103a19190613a43565b610be6565b6040516103b4929190613fce565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df919061379d565b610c32565b6040516103f19190614376565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c919061397a565b610cd7565b005b34801561042f57600080fd5b50610438610df2565b005b34801561044657600080fd5b5061044f610ebd565b005b34801561045d57600080fd5b50610478600480360381019061047391906137dd565b610f43565b005b34801561048657600080fd5b506104a1600480360381019061049c9190613687565b611009565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906139a7565b611029565b005b3480156104d857600080fd5b506104f360048036038101906104ee91906139a7565b611085565b6040516105009190614376565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b919061390b565b6110f6565b005b34801561053e57600080fd5b50610559600480360381019061055491906138c2565b6111a2565b005b34801561056757600080fd5b50610570611238565b60405161057d9190614019565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a891906139a7565b61124f565b6040516105ba9190613f67565b60405180910390f35b3480156105cf57600080fd5b506105d8611301565b6040516105e59190614034565b60405180910390f35b3480156105fa57600080fd5b506106156004803603810190610610919061361a565b61138f565b6040516106229190614376565b60405180910390f35b34801561063757600080fd5b50610640611447565b005b34801561064e57600080fd5b50610657611584565b005b34801561066557600080fd5b5061066e61160a565b60405161067b9190613f67565b60405180910390f35b34801561069057600080fd5b50610699611634565b6040516106a69190614034565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d1919061375d565b6116c6565b005b3480156106e457600080fd5b506106ff60048036038101906106fa91906139d4565b611847565b005b34801561070d57600080fd5b506107286004803603810190610723919061361a565b6118f1565b6040516107359190613ff7565b60405180910390f35b34801561074a57600080fd5b50610765600480360381019061076091906136da565b6119fb565b005b34801561077357600080fd5b5061078e600480360381019061078991906139a7565b611a5d565b60405161079b9190614034565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613647565b611a6f565b6040516107d89190614019565b60405180910390f35b3480156107ed57600080fd5b506108086004803603810190610803919061361a565b611b03565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087d575061087c82611caf565b5b9050919050565b61088c611d29565b73ffffffffffffffffffffffffffffffffffffffff166108aa61160a565b73ffffffffffffffffffffffffffffffffffffffff1614610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790614276565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000805461095390614699565b80601f016020809104026020016040519081016040528092919081815260200182805461097f90614699565b80156109cc5780601f106109a1576101008083540402835291602001916109cc565b820191906000526020600020905b8154815290600101906020018083116109af57829003601f168201915b5050505050905090565b60006109e182611d31565b610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1790614256565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a668261124f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ace906142d6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af6611d29565b73ffffffffffffffffffffffffffffffffffffffff161480610b255750610b2481610b1f611d29565b611a6f565b5b610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b90614176565b60405180910390fd5b610b6e8383611d9d565b505050565b6000600880549050905090565b610b91610b8b611d29565b82611e56565b610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc790614316565b60405180910390fd5b610bdb838383611f34565b505050565b600f5481565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600f5485610c1d9190614547565b610c279190614516565b915091509250929050565b6000610c3d8361138f565b8210610c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7590614076565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610cdf611d29565b73ffffffffffffffffffffffffffffffffffffffff16610cfd61160a565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614276565b60405180910390fd5b60008161ffff161015610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9290614196565b60405180910390fd5b6102ee8161ffff161115610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb906142f6565b60405180910390fd5b8061ffff16600f8190555050565b610dfa611d29565b73ffffffffffffffffffffffffffffffffffffffff16610e1861160a565b73ffffffffffffffffffffffffffffffffffffffff1614610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590614276565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610eb9573d6000803e3d6000fd5b5050565b610ec5611d29565b73ffffffffffffffffffffffffffffffffffffffff16610ee361160a565b73ffffffffffffffffffffffffffffffffffffffff1614610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3090614276565b60405180910390fd5b610f41612190565b565b610f4b611d29565b73ffffffffffffffffffffffffffffffffffffffff16610f6961160a565b73ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb690614276565b60405180910390fd5b60005b835181101561100357610ff083858381518110610fe257610fe1614832565b5b602002602001015184612232565b8080610ffb906146fc565b915050610fc2565b50505050565b611024838383604051806020016040528060008152506119fb565b505050565b61103a611034611d29565b82611e56565b611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090614356565b60405180910390fd5b61108281612260565b50565b600061108f610b73565b82106110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790614336565b60405180910390fd5b600882815481106110e4576110e3614832565b5b90600052602060002001549050919050565b6110fe611d29565b73ffffffffffffffffffffffffffffffffffffffff1661111c61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614276565b60405180910390fd5b60008290505b81811161119c57611189818561226c565b8080611194906146fc565b915050611178565b50505050565b6111aa611d29565b73ffffffffffffffffffffffffffffffffffffffff166111c861160a565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590614276565b60405180910390fd5b80600d908051906020019061123492919061333b565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef906141d6565b60405180910390fd5b80915050919050565b600d805461130e90614699565b80601f016020809104026020016040519081016040528092919081815260200182805461133a90614699565b80156113875780601f1061135c57610100808354040283529160200191611387565b820191906000526020600020905b81548152906001019060200180831161136a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f7906141b6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61144f611d29565b73ffffffffffffffffffffffffffffffffffffffff1661146d61160a565b73ffffffffffffffffffffffffffffffffffffffff16146114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61158c611d29565b73ffffffffffffffffffffffffffffffffffffffff166115aa61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790614276565b60405180910390fd5b6116086122e0565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461164390614699565b80601f016020809104026020016040519081016040528092919081815260200182805461166f90614699565b80156116bc5780601f10611691576101008083540402835291602001916116bc565b820191906000526020600020905b81548152906001019060200180831161169f57829003601f168201915b5050505050905090565b6116ce611d29565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173390614116565b60405180910390fd5b8060056000611749611d29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117f6611d29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161183b9190614019565b60405180910390a35050565b61184f611d29565b73ffffffffffffffffffffffffffffffffffffffff1661186d61160a565b73ffffffffffffffffffffffffffffffffffffffff16146118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ba90614276565b60405180910390fd5b60005b838110156118eb576118d88383612383565b80806118e3906146fc565b9150506118c6565b50505050565b606060006118fe8361138f565b9050600081141561195b57600067ffffffffffffffff81111561192457611923614861565b5b6040519080825280602002602001820160405280156119525781602001602082028036833780820191505090505b509150506119f6565b60008167ffffffffffffffff81111561197757611976614861565b5b6040519080825280602002602001820160405280156119a55781602001602082028036833780820191505090505b50905060005b828110156119ef576119bd8582610c32565b8282815181106119d0576119cf614832565b5b60200260200101818152505080806119e7906146fc565b9150506119ab565b8193505050505b919050565b611a0c611a06611d29565b83611e56565b611a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4290614316565b60405180910390fd5b611a57848484846123b7565b50505050565b6060611a6882612413565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b0b611d29565b73ffffffffffffffffffffffffffffffffffffffff16611b2961160a565b73ffffffffffffffffffffffffffffffffffffffff1614611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690614276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be6906140b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d225750611d2182612565565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e108361124f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e6182611d31565b611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9790614136565b60405180910390fd5b6000611eab8361124f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f1a57508373ffffffffffffffffffffffffffffffffffffffff16611f02846109d6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f2b5750611f2a8185611a6f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f548261124f565b73ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190614296565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561201a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612011906140f6565b60405180910390fd5b612025838383612647565b612030600082611d9d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461208091906145a1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120d791906144c0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612198611238565b6121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce90614056565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61221b611d29565b6040516122289190613f67565b60405180910390a1565b60005b8381101561225a576122478383612383565b8080612252906146fc565b915050612235565b50505050565b6122698161269f565b50565b61227582611d31565b6122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab906141f6565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906122db92919061333b565b505050565b6122e8611238565b15612328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231f90614156565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861236c611d29565b6040516123799190613f67565b60405180910390a1565b61239682612391600c6126f2565b612700565b6123a96123a3600c6126f2565b8261226c565b6123b3600c61271e565b5050565b6123c2848484611f34565b6123ce84848484612734565b61240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614096565b60405180910390fd5b50505050565b606061241e82611d31565b61245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245490614236565b60405180910390fd5b6000600a6000848152602001908152602001600020805461247d90614699565b80601f01602080910402602001604051908101604052809291908181526020018280546124a990614699565b80156124f65780601f106124cb576101008083540402835291602001916124f6565b820191906000526020600020905b8154815290600101906020018083116124d957829003601f168201915b5050505050905060006125076128cb565b905060008151141561251d578192505050612560565b60008251111561255257808260405160200161253a929190613f43565b60405160208183030381529060405292505050612560565b61255b8461295d565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612640575061263f82612a04565b5b9050919050565b61264f611238565b1561268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690614156565b60405180910390fd5b61269a838383612a6e565b505050565b6126a881612b82565b6000600a600083815260200190815260200160002080546126c890614699565b9050146126ef57600a600082815260200190815260200160002060006126ee91906133c1565b5b50565b600081600001549050919050565b61271a828260405180602001604052806000815250612c93565b5050565b6001816000016000828254019250508190555050565b60006127558473ffffffffffffffffffffffffffffffffffffffff16612cee565b156128be578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261277e611d29565b8786866040518563ffffffff1660e01b81526004016127a09493929190613f82565b602060405180830381600087803b1580156127ba57600080fd5b505af19250505080156127eb57506040513d601f19601f820116820180604052508101906127e89190613895565b60015b61286e573d806000811461281b576040519150601f19603f3d011682016040523d82523d6000602084013e612820565b606091505b50600081511415612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90614096565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128c3565b600190505b949350505050565b6060600d80546128da90614699565b80601f016020809104026020016040519081016040528092919081815260200182805461290690614699565b80156129535780601f1061292857610100808354040283529160200191612953565b820191906000526020600020905b81548152906001019060200180831161293657829003601f168201915b5050505050905090565b606061296882611d31565b6129a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299e906142b6565b60405180910390fd5b60006129b16128cb565b905060008151116129d157604051806020016040528060008152506129fc565b806129db84612d01565b6040516020016129ec929190613f43565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a79838383612e62565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612abc57612ab781612e67565b612afb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612afa57612af98382612eb0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b3e57612b398161301d565b612b7d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b7c57612b7b82826130ee565b5b5b505050565b6000612b8d8261124f565b9050612b9b81600084612647565b612ba6600083611d9d565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf691906145a1565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612c9d838361316d565b612caa6000848484612734565b612ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce090614096565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60606000821415612d49576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e5d565b600082905060005b60008214612d7b578080612d64906146fc565b915050600a82612d749190614516565b9150612d51565b60008167ffffffffffffffff811115612d9757612d96614861565b5b6040519080825280601f01601f191660200182016040528015612dc95781602001600182028036833780820191505090505b5090505b60008514612e5657600182612de291906145a1565b9150600a85612df19190614745565b6030612dfd91906144c0565b60f81b818381518110612e1357612e12614832565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e4f9190614516565b9450612dcd565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ebd8461138f565b612ec791906145a1565b9050600060076000848152602001908152602001600020549050818114612fac576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061303191906145a1565b905060006009600084815260200190815260200160002054905060006008838154811061306157613060614832565b5b90600052602060002001549050806008838154811061308357613082614832565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130d2576130d1614803565b5b6001900381819060005260206000200160009055905550505050565b60006130f98361138f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d490614216565b60405180910390fd5b6131e681611d31565b15613226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321d906140d6565b60405180910390fd5b61323260008383612647565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461328291906144c0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461334790614699565b90600052602060002090601f01602090048101928261336957600085556133b0565b82601f1061338257805160ff19168380011785556133b0565b828001600101855582156133b0579182015b828111156133af578251825591602001919060010190613394565b5b5090506133bd9190613401565b5090565b5080546133cd90614699565b6000825580601f106133df57506133fe565b601f0160209004906000526020600020908101906133fd9190613401565b5b50565b5b8082111561341a576000816000905550600101613402565b5090565b600061343161342c846143b6565b614391565b9050808382526020820190508285602086028201111561345457613453614895565b5b60005b85811015613484578161346a8882613512565b845260208401935060208301925050600181019050613457565b5050509392505050565b60006134a161349c846143e2565b614391565b9050828152602081018484840111156134bd576134bc61489a565b5b6134c8848285614657565b509392505050565b60006134e36134de84614413565b614391565b9050828152602081018484840111156134ff576134fe61489a565b5b61350a848285614657565b509392505050565b60008135905061352181614f8d565b92915050565b600082601f83011261353c5761353b614890565b5b813561354c84826020860161341e565b91505092915050565b60008135905061356481614fa4565b92915050565b60008135905061357981614fbb565b92915050565b60008151905061358e81614fbb565b92915050565b600082601f8301126135a9576135a8614890565b5b81356135b984826020860161348e565b91505092915050565b600082601f8301126135d7576135d6614890565b5b81356135e78482602086016134d0565b91505092915050565b6000813590506135ff81614fd2565b92915050565b60008135905061361481614fe9565b92915050565b6000602082840312156136305761362f6148a4565b5b600061363e84828501613512565b91505092915050565b6000806040838503121561365e5761365d6148a4565b5b600061366c85828601613512565b925050602061367d85828601613512565b9150509250929050565b6000806000606084860312156136a05761369f6148a4565b5b60006136ae86828701613512565b93505060206136bf86828701613512565b92505060406136d086828701613605565b9150509250925092565b600080600080608085870312156136f4576136f36148a4565b5b600061370287828801613512565b945050602061371387828801613512565b935050604061372487828801613605565b925050606085013567ffffffffffffffff8111156137455761374461489f565b5b61375187828801613594565b91505092959194509250565b60008060408385031215613774576137736148a4565b5b600061378285828601613512565b925050602061379385828601613555565b9150509250929050565b600080604083850312156137b4576137b36148a4565b5b60006137c285828601613512565b92505060206137d385828601613605565b9150509250929050565b6000806000606084860312156137f6576137f56148a4565b5b600084013567ffffffffffffffff8111156138145761381361489f565b5b61382086828701613527565b935050602061383186828701613605565b925050604084013567ffffffffffffffff8111156138525761385161489f565b5b61385e868287016135c2565b9150509250925092565b60006020828403121561387e5761387d6148a4565b5b600061388c8482850161356a565b91505092915050565b6000602082840312156138ab576138aa6148a4565b5b60006138b98482850161357f565b91505092915050565b6000602082840312156138d8576138d76148a4565b5b600082013567ffffffffffffffff8111156138f6576138f561489f565b5b613902848285016135c2565b91505092915050565b600080600060608486031215613924576139236148a4565b5b600084013567ffffffffffffffff8111156139425761394161489f565b5b61394e868287016135c2565b935050602061395f86828701613605565b925050604061397086828701613605565b9150509250925092565b6000602082840312156139905761398f6148a4565b5b600061399e848285016135f0565b91505092915050565b6000602082840312156139bd576139bc6148a4565b5b60006139cb84828501613605565b91505092915050565b6000806000606084860312156139ed576139ec6148a4565b5b60006139fb86828701613605565b9350506020613a0c86828701613512565b925050604084013567ffffffffffffffff811115613a2d57613a2c61489f565b5b613a39868287016135c2565b9150509250925092565b60008060408385031215613a5a57613a596148a4565b5b6000613a6885828601613605565b9250506020613a7985828601613605565b9150509250929050565b6000613a8f8383613f25565b60208301905092915050565b613aa4816145d5565b82525050565b6000613ab582614454565b613abf8185614482565b9350613aca83614444565b8060005b83811015613afb578151613ae28882613a83565b9750613aed83614475565b925050600181019050613ace565b5085935050505092915050565b613b11816145e7565b82525050565b6000613b228261445f565b613b2c8185614493565b9350613b3c818560208601614666565b613b45816148a9565b840191505092915050565b6000613b5b8261446a565b613b6581856144a4565b9350613b75818560208601614666565b613b7e816148a9565b840191505092915050565b6000613b948261446a565b613b9e81856144b5565b9350613bae818560208601614666565b80840191505092915050565b6000613bc76014836144a4565b9150613bd2826148ba565b602082019050919050565b6000613bea602b836144a4565b9150613bf5826148e3565b604082019050919050565b6000613c0d6032836144a4565b9150613c1882614932565b604082019050919050565b6000613c306026836144a4565b9150613c3b82614981565b604082019050919050565b6000613c53601c836144a4565b9150613c5e826149d0565b602082019050919050565b6000613c766024836144a4565b9150613c81826149f9565b604082019050919050565b6000613c996019836144a4565b9150613ca482614a48565b602082019050919050565b6000613cbc602c836144a4565b9150613cc782614a71565b604082019050919050565b6000613cdf6010836144a4565b9150613cea82614ac0565b602082019050919050565b6000613d026038836144a4565b9150613d0d82614ae9565b604082019050919050565b6000613d25602b836144a4565b9150613d3082614b38565b604082019050919050565b6000613d48602a836144a4565b9150613d5382614b87565b604082019050919050565b6000613d6b6029836144a4565b9150613d7682614bd6565b604082019050919050565b6000613d8e602e836144a4565b9150613d9982614c25565b604082019050919050565b6000613db16020836144a4565b9150613dbc82614c74565b602082019050919050565b6000613dd46031836144a4565b9150613ddf82614c9d565b604082019050919050565b6000613df7602c836144a4565b9150613e0282614cec565b604082019050919050565b6000613e1a6020836144a4565b9150613e2582614d3b565b602082019050919050565b6000613e3d6029836144a4565b9150613e4882614d64565b604082019050919050565b6000613e60602f836144a4565b9150613e6b82614db3565b604082019050919050565b6000613e836021836144a4565b9150613e8e82614e02565b604082019050919050565b6000613ea6602d836144a4565b9150613eb182614e51565b604082019050919050565b6000613ec96031836144a4565b9150613ed482614ea0565b604082019050919050565b6000613eec602c836144a4565b9150613ef782614eef565b604082019050919050565b6000613f0f6030836144a4565b9150613f1a82614f3e565b604082019050919050565b613f2e8161464d565b82525050565b613f3d8161464d565b82525050565b6000613f4f8285613b89565b9150613f5b8284613b89565b91508190509392505050565b6000602082019050613f7c6000830184613a9b565b92915050565b6000608082019050613f976000830187613a9b565b613fa46020830186613a9b565b613fb16040830185613f34565b8181036060830152613fc38184613b17565b905095945050505050565b6000604082019050613fe36000830185613a9b565b613ff06020830184613f34565b9392505050565b600060208201905081810360008301526140118184613aaa565b905092915050565b600060208201905061402e6000830184613b08565b92915050565b6000602082019050818103600083015261404e8184613b50565b905092915050565b6000602082019050818103600083015261406f81613bba565b9050919050565b6000602082019050818103600083015261408f81613bdd565b9050919050565b600060208201905081810360008301526140af81613c00565b9050919050565b600060208201905081810360008301526140cf81613c23565b9050919050565b600060208201905081810360008301526140ef81613c46565b9050919050565b6000602082019050818103600083015261410f81613c69565b9050919050565b6000602082019050818103600083015261412f81613c8c565b9050919050565b6000602082019050818103600083015261414f81613caf565b9050919050565b6000602082019050818103600083015261416f81613cd2565b9050919050565b6000602082019050818103600083015261418f81613cf5565b9050919050565b600060208201905081810360008301526141af81613d18565b9050919050565b600060208201905081810360008301526141cf81613d3b565b9050919050565b600060208201905081810360008301526141ef81613d5e565b9050919050565b6000602082019050818103600083015261420f81613d81565b9050919050565b6000602082019050818103600083015261422f81613da4565b9050919050565b6000602082019050818103600083015261424f81613dc7565b9050919050565b6000602082019050818103600083015261426f81613dea565b9050919050565b6000602082019050818103600083015261428f81613e0d565b9050919050565b600060208201905081810360008301526142af81613e30565b9050919050565b600060208201905081810360008301526142cf81613e53565b9050919050565b600060208201905081810360008301526142ef81613e76565b9050919050565b6000602082019050818103600083015261430f81613e99565b9050919050565b6000602082019050818103600083015261432f81613ebc565b9050919050565b6000602082019050818103600083015261434f81613edf565b9050919050565b6000602082019050818103600083015261436f81613f02565b9050919050565b600060208201905061438b6000830184613f34565b92915050565b600061439b6143ac565b90506143a782826146cb565b919050565b6000604051905090565b600067ffffffffffffffff8211156143d1576143d0614861565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143fd576143fc614861565b5b614406826148a9565b9050602081019050919050565b600067ffffffffffffffff82111561442e5761442d614861565b5b614437826148a9565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144cb8261464d565b91506144d68361464d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561450b5761450a614776565b5b828201905092915050565b60006145218261464d565b915061452c8361464d565b92508261453c5761453b6147a5565b5b828204905092915050565b60006145528261464d565b915061455d8361464d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561459657614595614776565b5b828202905092915050565b60006145ac8261464d565b91506145b78361464d565b9250828210156145ca576145c9614776565b5b828203905092915050565b60006145e08261462d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614684578082015181840152602081019050614669565b83811115614693576000848401525b50505050565b600060028204905060018216806146b157607f821691505b602082108114156146c5576146c46147d4565b5b50919050565b6146d4826148a9565b810181811067ffffffffffffffff821117156146f3576146f2614861565b5b80604052505050565b60006147078261464d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561473a57614739614776565b5b600182019050919050565b60006147508261464d565b915061475b8361464d565b92508261476b5761476a6147a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f203025000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f20372e352500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b614f96816145d5565b8114614fa157600080fd5b50565b614fad816145e7565b8114614fb857600080fd5b50565b614fc4816145f3565b8114614fcf57600080fd5b50565b614fdb8161461f565b8114614fe657600080fd5b50565b614ff28161464d565b8114614ffd57600080fd5b5056fea2646970667358221220e7ac73f18e10313412a908eb370a486c1f924095d15a68e3b5a073202cd5204a64736f6c63430008070033

Deployed Bytecode Sourcemap

52873:4241:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55680:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54660:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22839:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24421:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23944:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37505:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25480:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53228:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53642:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37086:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54352:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56918:140;;;;;;;;;;;;;:::i;:::-;;53963:65;;;;;;;;;;;;;:::i;:::-;;54997:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25927:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50262:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37695:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54150:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54036:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46259:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22446:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53120:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22089:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49216:148;;;;;;;;;;;;;:::i;:::-;;53894:61;;;;;;;;;;;;;:::i;:::-;;48565:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23008:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24801:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54794:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56225:533;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26183:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53438:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25199:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49519:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55680:292;55828:4;55885:26;55870:41;;;:11;:41;;;;:94;;;;55928:36;55952:11;55928:23;:36::i;:::-;55870:94;55850:114;;55680:292;;;:::o;54660:122::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54759:15:::1;54742:14;;:32;;;;;;;;;;;;;;;;;;54660:122:::0;:::o;22839:100::-;22893:13;22926:5;22919:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22839:100;:::o;24421:308::-;24542:7;24589:16;24597:7;24589;:16::i;:::-;24567:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24697:15;:24;24713:7;24697:24;;;;;;;;;;;;;;;;;;;;;24690:31;;24421:308;;;:::o;23944:411::-;24025:13;24041:23;24056:7;24041:14;:23::i;:::-;24025:39;;24089:5;24083:11;;:2;:11;;;;24075:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24183:5;24167:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24192:37;24209:5;24216:12;:10;:12::i;:::-;24192:16;:37::i;:::-;24167:62;24145:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24326:21;24335:2;24339:7;24326:8;:21::i;:::-;24014:341;23944:411;;:::o;37505:113::-;37566:7;37593:10;:17;;;;37586:24;;37505:113;:::o;25480:376::-;25689:41;25708:12;:10;:12::i;:::-;25722:7;25689:18;:41::i;:::-;25667:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;25820:28;25830:4;25836:2;25840:7;25820:9;:28::i;:::-;25480:376;;;:::o;53228:28::-;;;;:::o;53642:238::-;53760:16;53778:21;53825:14;;;;;;;;;;;53866:5;53855:7;;53842:10;:20;;;;:::i;:::-;53841:30;;;;:::i;:::-;53817:55;;;;53642:238;;;;;:::o;37086:343::-;37228:7;37283:23;37300:5;37283:16;:23::i;:::-;37275:5;:31;37253:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37395:12;:19;37408:5;37395:19;;;;;;;;;;;;;;;:26;37415:5;37395:26;;;;;;;;;;;;37388:33;;37086:343;;;;:::o;54352:296::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54439:1:::1;54427:8;:13;;;;54419:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54533:3;54521:8;:15;;;;54499:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;54632:8;54622:18;;:7;:18;;;;54352:296:::0;:::o;56918:140::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56965:14:::1;56981:21;56965:38;;57022:10;57014:28;;:36;57043:6;57014:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56954:104;56918:140::o:0;53963:65::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54010:10:::1;:8;:10::i;:::-;53963:65::o:0;54997:230::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55113:9:::1;55108:112;55132:5;:12;55128:1;:16;55108:112;;;55170:38;55188:6;55195:5;55201:1;55195:8;;;;;;;;:::i;:::-;;;;;;;;55204:3;55170:17;:38::i;:::-;55146:3;;;;;:::i;:::-;;;;55108:112;;;;54997:230:::0;;;:::o;25927:185::-;26065:39;26082:4;26088:2;26092:7;26065:39;;;;;;;;;;;;:16;:39::i;:::-;25927:185;;;:::o;50262:282::-;50394:41;50413:12;:10;:12::i;:::-;50427:7;50394:18;:41::i;:::-;50372:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;50522:14;50528:7;50522:5;:14::i;:::-;50262:282;:::o;37695:320::-;37815:7;37870:30;:28;:30::i;:::-;37862:5;:38;37840:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;37990:10;38001:5;37990:17;;;;;;;;:::i;:::-;;;;;;;;;;37983:24;;37695:320;;;:::o;54150:188::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54252:9:::1;54264:5;54252:17;;54247:84;54276:3;54271:1;:8;54247:84;;54298:21;54311:1;54314:4;54298:12;:21::i;:::-;54281:3;;;;;:::i;:::-;;;;54247:84;;;;54150:188:::0;;;:::o;54036:102::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54120:10:::1;54110:7;:20;;;;;;;;;;;;:::i;:::-;;54036:102:::0;:::o;46259:86::-;46306:4;46330:7;;;;;;;;;;;46323:14;;46259:86;:::o;22446:326::-;22563:7;22588:13;22604:7;:16;22612:7;22604:16;;;;;;;;;;;;;;;;;;;;;22588:32;;22670:1;22653:19;;:5;:19;;;;22631:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;22759:5;22752:12;;;22446:326;;;:::o;53120:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22089:295::-;22206:7;22270:1;22253:19;;:5;:19;;;;22231:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22360:9;:16;22370:5;22360:16;;;;;;;;;;;;;;;;22353:23;;22089:295;;;:::o;49216:148::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49323:1:::1;49286:40;;49307:6;;;;;;;;;;;49286:40;;;;;;;;;;;;49354:1;49337:6;;:19;;;;;;;;;;;;;;;;;;49216:148::o:0;53894:61::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53939:8:::1;:6;:8::i;:::-;53894:61::o:0;48565:87::-;48611:7;48638:6;;;;;;;;;;;48631:13;;48565:87;:::o;23008:104::-;23064:13;23097:7;23090:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23008:104;:::o;24801:327::-;24948:12;:10;:12::i;:::-;24936:24;;:8;:24;;;;24928:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25048:8;25003:18;:32;25022:12;:10;:12::i;:::-;25003:32;;;;;;;;;;;;;;;:42;25036:8;25003:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25101:8;25072:48;;25087:12;:10;:12::i;:::-;25072:48;;;25111:8;25072:48;;;;;;:::i;:::-;;;;;;;;24801:327;;:::o;54794:191::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54896:9:::1;54891:87;54915:6;54911:1;:10;54891:87;;;54943:23;54956:5;54962:3;54943:12;:23::i;:::-;54923:3;;;;;:::i;:::-;;;;54891:87;;;;54794:191:::0;;;:::o;56225:533::-;56313:16;56347:18;56368:17;56378:6;56368:9;:17::i;:::-;56347:38;;56414:1;56400:10;:15;56396:355;;;56453:1;56439:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56432:23;;;;;56396:355;56488:23;56528:10;56514:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56488:51;;56554:13;56582:130;56606:10;56598:5;:18;56582:130;;;56662:34;56682:6;56690:5;56662:19;:34::i;:::-;56646:6;56653:5;56646:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;56618:7;;;;;:::i;:::-;;;;56582:130;;;56733:6;56726:13;;;;;56225:533;;;;:::o;26183:365::-;26372:41;26391:12;:10;:12::i;:::-;26405:7;26372:18;:41::i;:::-;26350:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26501:39;26515:4;26521:2;26525:7;26534:5;26501:13;:39::i;:::-;26183:365;;;;:::o;53438:196::-;53565:13;53603:23;53618:7;53603:14;:23::i;:::-;53596:30;;53438:196;;;:::o;25199:214::-;25341:4;25370:18;:25;25389:5;25370:25;;;;;;;;;;;;;;;:35;25396:8;25370:35;;;;;;;;;;;;;;;;;;;;;;;;;25363:42;;25199:214;;;;:::o;49519:281::-;48796:12;:10;:12::i;:::-;48785:23;;:7;:5;:7::i;:::-;:23;;;48777:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49642:1:::1;49622:22;;:8;:22;;;;49600:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49755:8;49726:38;;49747:6;;;;;;;;;;;49726:38;;;;;;;;;;;;49784:8;49775:6;;:17;;;;;;;;;;;;;;;;;;49519:281:::0;:::o;36702:300::-;36849:4;36906:35;36891:50;;;:11;:50;;;;:103;;;;36958:36;36982:11;36958:23;:36::i;:::-;36891:103;36871:123;;36702:300;;;:::o;16894:98::-;16947:7;16974:10;16967:17;;16894:98;:::o;28095:127::-;28160:4;28212:1;28184:30;;:7;:16;28192:7;28184:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28177:37;;28095:127;;;:::o;32218:174::-;32320:2;32293:15;:24;32309:7;32293:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32376:7;32372:2;32338:46;;32347:23;32362:7;32347:14;:23::i;:::-;32338:46;;;;;;;;;;;;32218:174;;:::o;28389:452::-;28518:4;28562:16;28570:7;28562;:16::i;:::-;28540:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28661:13;28677:23;28692:7;28677:14;:23::i;:::-;28661:39;;28730:5;28719:16;;:7;:16;;;:64;;;;28776:7;28752:31;;:20;28764:7;28752:11;:20::i;:::-;:31;;;28719:64;:113;;;;28800:32;28817:5;28824:7;28800:16;:32::i;:::-;28719:113;28711:122;;;28389:452;;;;:::o;31485:615::-;31658:4;31631:31;;:23;31646:7;31631:14;:23::i;:::-;:31;;;31609:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;31764:1;31750:16;;:2;:16;;;;31742:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31820:39;31841:4;31847:2;31851:7;31820:20;:39::i;:::-;31924:29;31941:1;31945:7;31924:8;:29::i;:::-;31985:1;31966:9;:15;31976:4;31966:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32014:1;31997:9;:13;32007:2;31997:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32045:2;32026:7;:16;32034:7;32026:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32084:7;32080:2;32065:27;;32074:4;32065:27;;;;;;;;;;;;31485:615;;;:::o;47318:120::-;46862:8;:6;:8::i;:::-;46854:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;47387:5:::1;47377:7;;:15;;;;;;;;;;;;;;;;;;47408:22;47417:12;:10;:12::i;:::-;47408:22;;;;;;:::i;:::-;;;;;;;;47318:120::o:0;55239:191::-;55341:9;55336:87;55360:6;55356:1;:10;55336:87;;;55388:23;55401:5;55407:3;55388:12;:23::i;:::-;55368:3;;;;;:::i;:::-;;;;55336:87;;;;55239:191;;;:::o;56772:138::-;56882:20;56894:7;56882:11;:20::i;:::-;56772:138;:::o;44466:277::-;44603:16;44611:7;44603;:16::i;:::-;44581:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44726:9;44704:10;:19;44715:7;44704:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;44466:277;;:::o;47059:118::-;46585:8;:6;:8::i;:::-;46584:9;46576:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;47129:4:::1;47119:7;;:14;;;;;;;;;;;;;;;;;;47149:20;47156:12;:10;:12::i;:::-;47149:20;;;;;;:::i;:::-;;;;;;;;47059:118::o:0;55443:214::-;55515:40;55525:2;55529:25;:15;:23;:25::i;:::-;55515:9;:40::i;:::-;55567:44;55580:25;:15;:23;:25::i;:::-;55607:3;55567:12;:44::i;:::-;55622:27;:15;:25;:27::i;:::-;55443:214;;:::o;27430:352::-;27587:28;27597:4;27603:2;27607:7;27587:9;:28::i;:::-;27648:48;27671:4;27677:2;27681:7;27690:5;27648:22;:48::i;:::-;27626:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27430:352;;;;:::o;43544:766::-;43662:13;43715:16;43723:7;43715;:16::i;:::-;43693:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;43821:23;43847:10;:19;43858:7;43847:19;;;;;;;;;;;43821:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43877:18;43898:10;:8;:10::i;:::-;43877:31;;44006:1;43990:4;43984:18;:23;43980:72;;;44031:9;44024:16;;;;;;43980:72;44182:1;44162:9;44156:23;:27;44152:108;;;44231:4;44237:9;44214:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44200:48;;;;;;44152:108;44279:23;44294:7;44279:14;:23::i;:::-;44272:30;;;;43544:766;;;;:::o;21670:355::-;21817:4;21874:25;21859:40;;;:11;:40;;;;:105;;;;21931:33;21916:48;;;:11;:48;;;;21859:105;:158;;;;21981:36;22005:11;21981:23;:36::i;:::-;21859:158;21839:178;;21670:355;;;:::o;55984:229::-;46585:8;:6;:8::i;:::-;46584:9;46576:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56160:45:::1;56187:4;56193:2;56197:7;56160:26;:45::i;:::-;55984:229:::0;;;:::o;44972:206::-;45041:20;45053:7;45041:11;:20::i;:::-;45115:1;45084:10;:19;45095:7;45084:19;;;;;;;;;;;45078:33;;;;;:::i;:::-;;;:38;45074:97;;45140:10;:19;45151:7;45140:19;;;;;;;;;;;;45133:26;;;;:::i;:::-;45074:97;44972:206;:::o;51370:114::-;51435:7;51462;:14;;;51455:21;;51370:114;;;:::o;29183:110::-;29259:26;29269:2;29273:7;29259:26;;;;;;;;;;;;:9;:26::i;:::-;29183:110;;:::o;51492:127::-;51599:1;51581:7;:14;;;:19;;;;;;;;;;;51492:127;:::o;32957:1053::-;33112:4;33133:15;:2;:13;;;:15::i;:::-;33129:874;;;33202:2;33186:36;;;33245:12;:10;:12::i;:::-;33280:4;33307:7;33337:5;33186:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33165:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33565:1;33548:6;:13;:18;33544:389;;;33591:108;;;;;;;;;;:::i;:::-;;;;;;;;33544:389;33883:6;33877:13;33868:6;33864:2;33860:15;33853:38;33165:783;33435:45;;;33425:55;;;:6;:55;;;;33418:62;;;;;33129:874;33987:4;33980:11;;32957:1053;;;;;;;:::o;53328:100::-;53380:13;53413:7;53406:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53328:100;:::o;23183:468::-;23301:13;23354:16;23362:7;23354;:16::i;:::-;23332:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;23458:21;23482:10;:8;:10::i;:::-;23458:34;;23547:1;23529:7;23523:21;:25;:120;;;;;;;;;;;;;;;;;23592:7;23601:18;:7;:16;:18::i;:::-;23575:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23523:120;23503:140;;;23183:468;;;:::o;20136:207::-;20266:4;20310:25;20295:40;;;:11;:40;;;;20288:47;;20136:207;;;:::o;38628:589::-;38772:45;38799:4;38805:2;38809:7;38772:26;:45::i;:::-;38850:1;38834:18;;:4;:18;;;38830:187;;;38869:40;38901:7;38869:31;:40::i;:::-;38830:187;;;38939:2;38931:10;;:4;:10;;;38927:90;;38958:47;38991:4;38997:7;38958:32;:47::i;:::-;38927:90;38830:187;39045:1;39031:16;;:2;:16;;;39027:183;;;39064:45;39101:7;39064:36;:45::i;:::-;39027:183;;;39137:4;39131:10;;:2;:10;;;39127:83;;39158:40;39186:2;39190:7;39158:27;:40::i;:::-;39127:83;39027:183;38628:589;;;:::o;30788:360::-;30848:13;30864:23;30879:7;30864:14;:23::i;:::-;30848:39;;30900:48;30921:5;30936:1;30940:7;30900:20;:48::i;:::-;30989:29;31006:1;31010:7;30989:8;:29::i;:::-;31051:1;31031:9;:16;31041:5;31031:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31070:7;:16;31078:7;31070:16;;;;;;;;;;;;31063:23;;;;;;;;;;;31132:7;31128:1;31104:36;;31113:5;31104:36;;;;;;;;;;;;30837:311;30788:360;:::o;29520:321::-;29650:18;29656:2;29660:7;29650:5;:18::i;:::-;29701:54;29732:1;29736:2;29740:7;29749:5;29701:22;:54::i;:::-;29679:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29520:321;;;:::o;8308:444::-;8368:4;8576:12;8700:7;8688:20;8680:28;;8743:1;8736:4;:8;8729:15;;;8308:444;;;:::o;17551:723::-;17607:13;17837:1;17828:5;:10;17824:53;;;17855:10;;;;;;;;;;;;;;;;;;;;;17824:53;17887:12;17902:5;17887:20;;17918:14;17943:78;17958:1;17950:4;:9;17943:78;;17976:8;;;;;:::i;:::-;;;;18007:2;17999:10;;;;;:::i;:::-;;;17943:78;;;18031:19;18063:6;18053:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18031:39;;18081:154;18097:1;18088:5;:10;18081:154;;18125:1;18115:11;;;;;:::i;:::-;;;18192:2;18184:5;:10;;;;:::i;:::-;18171:2;:24;;;;:::i;:::-;18158:39;;18141:6;18148;18141:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18221:2;18212:11;;;;;:::i;:::-;;;18081:154;;;18259:6;18245:21;;;;;17551:723;;;;:::o;34623:126::-;;;;:::o;39940:164::-;40044:10;:17;;;;40017:15;:24;40033:7;40017:24;;;;;;;;;;;:44;;;;40072:10;40088:7;40072:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39940:164;:::o;40731:1002::-;41011:22;41061:1;41036:22;41053:4;41036:16;:22::i;:::-;:26;;;;:::i;:::-;41011:51;;41073:18;41094:17;:26;41112:7;41094:26;;;;;;;;;;;;41073:47;;41241:14;41227:10;:28;41223:328;;41272:19;41294:12;:18;41307:4;41294:18;;;;;;;;;;;;;;;:34;41313:14;41294:34;;;;;;;;;;;;41272:56;;41378:11;41345:12;:18;41358:4;41345:18;;;;;;;;;;;;;;;:30;41364:10;41345:30;;;;;;;;;;;:44;;;;41495:10;41462:17;:30;41480:11;41462:30;;;;;;;;;;;:43;;;;41257:294;41223:328;41647:17;:26;41665:7;41647:26;;;;;;;;;;;41640:33;;;41691:12;:18;41704:4;41691:18;;;;;;;;;;;;;;;:34;41710:14;41691:34;;;;;;;;;;;41684:41;;;40826:907;;40731:1002;;:::o;42028:1079::-;42281:22;42326:1;42306:10;:17;;;;:21;;;;:::i;:::-;42281:46;;42338:18;42359:15;:24;42375:7;42359:24;;;;;;;;;;;;42338:45;;42710:19;42732:10;42743:14;42732:26;;;;;;;;:::i;:::-;;;;;;;;;;42710:48;;42796:11;42771:10;42782;42771:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42907:10;42876:15;:28;42892:11;42876:28;;;;;;;;;;;:41;;;;43048:15;:24;43064:7;43048:24;;;;;;;;;;;43041:31;;;43083:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42099:1008;;;42028:1079;:::o;39518:221::-;39603:14;39620:20;39637:2;39620:16;:20::i;:::-;39603:37;;39678:7;39651:12;:16;39664:2;39651:16;;;;;;;;;;;;;;;:24;39668:6;39651:24;;;;;;;;;;;:34;;;;39725:6;39696:17;:26;39714:7;39696:26;;;;;;;;;;;:35;;;;39592:147;39518:221;;:::o;30177:382::-;30271:1;30257:16;;:2;:16;;;;30249:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30330:16;30338:7;30330;:16::i;:::-;30329:17;30321:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30392:45;30421:1;30425:2;30429:7;30392:20;:45::i;:::-;30467:1;30450:9;:13;30460:2;30450:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30498:2;30479:7;:16;30487:7;30479:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30543:7;30539:2;30518:33;;30535:1;30518:33;;;;;;;;;;;;30177:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:137::-;3315:5;3353:6;3340:20;3331:29;;3369:32;3395:5;3369:32;:::i;:::-;3270:137;;;;:::o;3413:139::-;3459:5;3497:6;3484:20;3475:29;;3513:33;3540:5;3513:33;:::i;:::-;3413:139;;;;:::o;3558:329::-;3617:6;3666:2;3654:9;3645:7;3641:23;3637:32;3634:119;;;3672:79;;:::i;:::-;3634:119;3792:1;3817:53;3862:7;3853:6;3842:9;3838:22;3817:53;:::i;:::-;3807:63;;3763:117;3558:329;;;;:::o;3893:474::-;3961:6;3969;4018:2;4006:9;3997:7;3993:23;3989:32;3986:119;;;4024:79;;:::i;:::-;3986:119;4144:1;4169:53;4214:7;4205:6;4194:9;4190:22;4169:53;:::i;:::-;4159:63;;4115:117;4271:2;4297:53;4342:7;4333:6;4322:9;4318:22;4297:53;:::i;:::-;4287:63;;4242:118;3893:474;;;;;:::o;4373:619::-;4450:6;4458;4466;4515:2;4503:9;4494:7;4490:23;4486:32;4483:119;;;4521:79;;:::i;:::-;4483:119;4641:1;4666:53;4711:7;4702:6;4691:9;4687:22;4666:53;:::i;:::-;4656:63;;4612:117;4768:2;4794:53;4839:7;4830:6;4819:9;4815:22;4794:53;:::i;:::-;4784:63;;4739:118;4896:2;4922:53;4967:7;4958:6;4947:9;4943:22;4922:53;:::i;:::-;4912:63;;4867:118;4373:619;;;;;:::o;4998:943::-;5093:6;5101;5109;5117;5166:3;5154:9;5145:7;5141:23;5137:33;5134:120;;;5173:79;;:::i;:::-;5134:120;5293:1;5318:53;5363:7;5354:6;5343:9;5339:22;5318:53;:::i;:::-;5308:63;;5264:117;5420:2;5446:53;5491:7;5482:6;5471:9;5467:22;5446:53;:::i;:::-;5436:63;;5391:118;5548:2;5574:53;5619:7;5610:6;5599:9;5595:22;5574:53;:::i;:::-;5564:63;;5519:118;5704:2;5693:9;5689:18;5676:32;5735:18;5727:6;5724:30;5721:117;;;5757:79;;:::i;:::-;5721:117;5862:62;5916:7;5907:6;5896:9;5892:22;5862:62;:::i;:::-;5852:72;;5647:287;4998:943;;;;;;;:::o;5947:468::-;6012:6;6020;6069:2;6057:9;6048:7;6044:23;6040:32;6037:119;;;6075:79;;:::i;:::-;6037:119;6195:1;6220:53;6265:7;6256:6;6245:9;6241:22;6220:53;:::i;:::-;6210:63;;6166:117;6322:2;6348:50;6390:7;6381:6;6370:9;6366:22;6348:50;:::i;:::-;6338:60;;6293:115;5947:468;;;;;:::o;6421:474::-;6489:6;6497;6546:2;6534:9;6525:7;6521:23;6517:32;6514:119;;;6552:79;;:::i;:::-;6514:119;6672:1;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6643:117;6799:2;6825:53;6870:7;6861:6;6850:9;6846:22;6825:53;:::i;:::-;6815:63;;6770:118;6421:474;;;;;:::o;6901:1009::-;7013:6;7021;7029;7078:2;7066:9;7057:7;7053:23;7049:32;7046:119;;;7084:79;;:::i;:::-;7046:119;7232:1;7221:9;7217:17;7204:31;7262:18;7254:6;7251:30;7248:117;;;7284:79;;:::i;:::-;7248:117;7389:78;7459:7;7450:6;7439:9;7435:22;7389:78;:::i;:::-;7379:88;;7175:302;7516:2;7542:53;7587:7;7578:6;7567:9;7563:22;7542:53;:::i;:::-;7532:63;;7487:118;7672:2;7661:9;7657:18;7644:32;7703:18;7695:6;7692:30;7689:117;;;7725:79;;:::i;:::-;7689:117;7830:63;7885:7;7876:6;7865:9;7861:22;7830:63;:::i;:::-;7820:73;;7615:288;6901:1009;;;;;:::o;7916:327::-;7974:6;8023:2;8011:9;8002:7;7998:23;7994:32;7991:119;;;8029:79;;:::i;:::-;7991:119;8149:1;8174:52;8218:7;8209:6;8198:9;8194:22;8174:52;:::i;:::-;8164:62;;8120:116;7916:327;;;;:::o;8249:349::-;8318:6;8367:2;8355:9;8346:7;8342:23;8338:32;8335:119;;;8373:79;;:::i;:::-;8335:119;8493:1;8518:63;8573:7;8564:6;8553:9;8549:22;8518:63;:::i;:::-;8508:73;;8464:127;8249:349;;;;:::o;8604:509::-;8673:6;8722:2;8710:9;8701:7;8697:23;8693:32;8690:119;;;8728:79;;:::i;:::-;8690:119;8876:1;8865:9;8861:17;8848:31;8906:18;8898:6;8895:30;8892:117;;;8928:79;;:::i;:::-;8892:117;9033:63;9088:7;9079:6;9068:9;9064:22;9033:63;:::i;:::-;9023:73;;8819:287;8604:509;;;;:::o;9119:799::-;9206:6;9214;9222;9271:2;9259:9;9250:7;9246:23;9242:32;9239:119;;;9277:79;;:::i;:::-;9239:119;9425:1;9414:9;9410:17;9397:31;9455:18;9447:6;9444:30;9441:117;;;9477:79;;:::i;:::-;9441:117;9582:63;9637:7;9628:6;9617:9;9613:22;9582:63;:::i;:::-;9572:73;;9368:287;9694:2;9720:53;9765:7;9756:6;9745:9;9741:22;9720:53;:::i;:::-;9710:63;;9665:118;9822:2;9848:53;9893:7;9884:6;9873:9;9869:22;9848:53;:::i;:::-;9838:63;;9793:118;9119:799;;;;;:::o;9924:327::-;9982:6;10031:2;10019:9;10010:7;10006:23;10002:32;9999:119;;;10037:79;;:::i;:::-;9999:119;10157:1;10182:52;10226:7;10217:6;10206:9;10202:22;10182:52;:::i;:::-;10172:62;;10128:116;9924:327;;;;:::o;10257:329::-;10316:6;10365:2;10353:9;10344:7;10340:23;10336:32;10333:119;;;10371:79;;:::i;:::-;10333:119;10491:1;10516:53;10561:7;10552:6;10541:9;10537:22;10516:53;:::i;:::-;10506:63;;10462:117;10257:329;;;;:::o;10592:799::-;10679:6;10687;10695;10744:2;10732:9;10723:7;10719:23;10715:32;10712:119;;;10750:79;;:::i;:::-;10712:119;10870:1;10895:53;10940:7;10931:6;10920:9;10916:22;10895:53;:::i;:::-;10885:63;;10841:117;10997:2;11023:53;11068:7;11059:6;11048:9;11044:22;11023:53;:::i;:::-;11013:63;;10968:118;11153:2;11142:9;11138:18;11125:32;11184:18;11176:6;11173:30;11170:117;;;11206:79;;:::i;:::-;11170:117;11311:63;11366:7;11357:6;11346:9;11342:22;11311:63;:::i;:::-;11301:73;;11096:288;10592:799;;;;;:::o;11397:474::-;11465:6;11473;11522:2;11510:9;11501:7;11497:23;11493:32;11490:119;;;11528:79;;:::i;:::-;11490:119;11648:1;11673:53;11718:7;11709:6;11698:9;11694:22;11673:53;:::i;:::-;11663:63;;11619:117;11775:2;11801:53;11846:7;11837:6;11826:9;11822:22;11801:53;:::i;:::-;11791:63;;11746:118;11397:474;;;;;:::o;11877:179::-;11946:10;11967:46;12009:3;12001:6;11967:46;:::i;:::-;12045:4;12040:3;12036:14;12022:28;;11877:179;;;;:::o;12062:118::-;12149:24;12167:5;12149:24;:::i;:::-;12144:3;12137:37;12062:118;;:::o;12216:732::-;12335:3;12364:54;12412:5;12364:54;:::i;:::-;12434:86;12513:6;12508:3;12434:86;:::i;:::-;12427:93;;12544:56;12594:5;12544:56;:::i;:::-;12623:7;12654:1;12639:284;12664:6;12661:1;12658:13;12639:284;;;12740:6;12734:13;12767:63;12826:3;12811:13;12767:63;:::i;:::-;12760:70;;12853:60;12906:6;12853:60;:::i;:::-;12843:70;;12699:224;12686:1;12683;12679:9;12674:14;;12639:284;;;12643:14;12939:3;12932:10;;12340:608;;;12216:732;;;;:::o;12954:109::-;13035:21;13050:5;13035:21;:::i;:::-;13030:3;13023:34;12954:109;;:::o;13069:360::-;13155:3;13183:38;13215:5;13183:38;:::i;:::-;13237:70;13300:6;13295:3;13237:70;:::i;:::-;13230:77;;13316:52;13361:6;13356:3;13349:4;13342:5;13338:16;13316:52;:::i;:::-;13393:29;13415:6;13393:29;:::i;:::-;13388:3;13384:39;13377:46;;13159:270;13069:360;;;;:::o;13435:364::-;13523:3;13551:39;13584:5;13551:39;:::i;:::-;13606:71;13670:6;13665:3;13606:71;:::i;:::-;13599:78;;13686:52;13731:6;13726:3;13719:4;13712:5;13708:16;13686:52;:::i;:::-;13763:29;13785:6;13763:29;:::i;:::-;13758:3;13754:39;13747:46;;13527:272;13435:364;;;;:::o;13805:377::-;13911:3;13939:39;13972:5;13939:39;:::i;:::-;13994:89;14076:6;14071:3;13994:89;:::i;:::-;13987:96;;14092:52;14137:6;14132:3;14125:4;14118:5;14114:16;14092:52;:::i;:::-;14169:6;14164:3;14160:16;14153:23;;13915:267;13805:377;;;;:::o;14188:366::-;14330:3;14351:67;14415:2;14410:3;14351:67;:::i;:::-;14344:74;;14427:93;14516:3;14427:93;:::i;:::-;14545:2;14540:3;14536:12;14529:19;;14188:366;;;:::o;14560:::-;14702:3;14723:67;14787:2;14782:3;14723:67;:::i;:::-;14716:74;;14799:93;14888:3;14799:93;:::i;:::-;14917:2;14912:3;14908:12;14901:19;;14560:366;;;:::o;14932:::-;15074:3;15095:67;15159:2;15154:3;15095:67;:::i;:::-;15088:74;;15171:93;15260:3;15171:93;:::i;:::-;15289:2;15284:3;15280:12;15273:19;;14932:366;;;:::o;15304:::-;15446:3;15467:67;15531:2;15526:3;15467:67;:::i;:::-;15460:74;;15543:93;15632:3;15543:93;:::i;:::-;15661:2;15656:3;15652:12;15645:19;;15304:366;;;:::o;15676:::-;15818:3;15839:67;15903:2;15898:3;15839:67;:::i;:::-;15832:74;;15915:93;16004:3;15915:93;:::i;:::-;16033:2;16028:3;16024:12;16017:19;;15676:366;;;:::o;16048:::-;16190:3;16211:67;16275:2;16270:3;16211:67;:::i;:::-;16204:74;;16287:93;16376:3;16287:93;:::i;:::-;16405:2;16400:3;16396:12;16389:19;;16048:366;;;:::o;16420:::-;16562:3;16583:67;16647:2;16642:3;16583:67;:::i;:::-;16576:74;;16659:93;16748:3;16659:93;:::i;:::-;16777:2;16772:3;16768:12;16761:19;;16420:366;;;:::o;16792:::-;16934:3;16955:67;17019:2;17014:3;16955:67;:::i;:::-;16948:74;;17031:93;17120:3;17031:93;:::i;:::-;17149:2;17144:3;17140:12;17133:19;;16792:366;;;:::o;17164:::-;17306:3;17327:67;17391:2;17386:3;17327:67;:::i;:::-;17320:74;;17403:93;17492:3;17403:93;:::i;:::-;17521:2;17516:3;17512:12;17505:19;;17164:366;;;:::o;17536:::-;17678:3;17699:67;17763:2;17758:3;17699:67;:::i;:::-;17692:74;;17775:93;17864:3;17775:93;:::i;:::-;17893:2;17888:3;17884:12;17877:19;;17536:366;;;:::o;17908:::-;18050:3;18071:67;18135:2;18130:3;18071:67;:::i;:::-;18064:74;;18147:93;18236:3;18147:93;:::i;:::-;18265:2;18260:3;18256:12;18249:19;;17908:366;;;:::o;18280:::-;18422:3;18443:67;18507:2;18502:3;18443:67;:::i;:::-;18436:74;;18519:93;18608:3;18519:93;:::i;:::-;18637:2;18632:3;18628:12;18621:19;;18280:366;;;:::o;18652:::-;18794:3;18815:67;18879:2;18874:3;18815:67;:::i;:::-;18808:74;;18891:93;18980:3;18891:93;:::i;:::-;19009:2;19004:3;19000:12;18993:19;;18652:366;;;:::o;19024:::-;19166:3;19187:67;19251:2;19246:3;19187:67;:::i;:::-;19180:74;;19263:93;19352:3;19263:93;:::i;:::-;19381:2;19376:3;19372:12;19365:19;;19024:366;;;:::o;19396:::-;19538:3;19559:67;19623:2;19618:3;19559:67;:::i;:::-;19552:74;;19635:93;19724:3;19635:93;:::i;:::-;19753:2;19748:3;19744:12;19737:19;;19396:366;;;:::o;19768:::-;19910:3;19931:67;19995:2;19990:3;19931:67;:::i;:::-;19924:74;;20007:93;20096:3;20007:93;:::i;:::-;20125:2;20120:3;20116:12;20109:19;;19768:366;;;:::o;20140:::-;20282:3;20303:67;20367:2;20362:3;20303:67;:::i;:::-;20296:74;;20379:93;20468:3;20379:93;:::i;:::-;20497:2;20492:3;20488:12;20481:19;;20140:366;;;:::o;20512:::-;20654:3;20675:67;20739:2;20734:3;20675:67;:::i;:::-;20668:74;;20751:93;20840:3;20751:93;:::i;:::-;20869:2;20864:3;20860:12;20853:19;;20512:366;;;:::o;20884:::-;21026:3;21047:67;21111:2;21106:3;21047:67;:::i;:::-;21040:74;;21123:93;21212:3;21123:93;:::i;:::-;21241:2;21236:3;21232:12;21225:19;;20884:366;;;:::o;21256:::-;21398:3;21419:67;21483:2;21478:3;21419:67;:::i;:::-;21412:74;;21495:93;21584:3;21495:93;:::i;:::-;21613:2;21608:3;21604:12;21597:19;;21256:366;;;:::o;21628:::-;21770:3;21791:67;21855:2;21850:3;21791:67;:::i;:::-;21784:74;;21867:93;21956:3;21867:93;:::i;:::-;21985:2;21980:3;21976:12;21969:19;;21628:366;;;:::o;22000:::-;22142:3;22163:67;22227:2;22222:3;22163:67;:::i;:::-;22156:74;;22239:93;22328:3;22239:93;:::i;:::-;22357:2;22352:3;22348:12;22341:19;;22000:366;;;:::o;22372:::-;22514:3;22535:67;22599:2;22594:3;22535:67;:::i;:::-;22528:74;;22611:93;22700:3;22611:93;:::i;:::-;22729:2;22724:3;22720:12;22713:19;;22372:366;;;:::o;22744:::-;22886:3;22907:67;22971:2;22966:3;22907:67;:::i;:::-;22900:74;;22983:93;23072:3;22983:93;:::i;:::-;23101:2;23096:3;23092:12;23085:19;;22744:366;;;:::o;23116:::-;23258:3;23279:67;23343:2;23338:3;23279:67;:::i;:::-;23272:74;;23355:93;23444:3;23355:93;:::i;:::-;23473:2;23468:3;23464:12;23457:19;;23116:366;;;:::o;23488:108::-;23565:24;23583:5;23565:24;:::i;:::-;23560:3;23553:37;23488:108;;:::o;23602:118::-;23689:24;23707:5;23689:24;:::i;:::-;23684:3;23677:37;23602:118;;:::o;23726:435::-;23906:3;23928:95;24019:3;24010:6;23928:95;:::i;:::-;23921:102;;24040:95;24131:3;24122:6;24040:95;:::i;:::-;24033:102;;24152:3;24145:10;;23726:435;;;;;:::o;24167:222::-;24260:4;24298:2;24287:9;24283:18;24275:26;;24311:71;24379:1;24368:9;24364:17;24355:6;24311:71;:::i;:::-;24167:222;;;;:::o;24395:640::-;24590:4;24628:3;24617:9;24613:19;24605:27;;24642:71;24710:1;24699:9;24695:17;24686:6;24642:71;:::i;:::-;24723:72;24791:2;24780:9;24776:18;24767:6;24723:72;:::i;:::-;24805;24873:2;24862:9;24858:18;24849:6;24805:72;:::i;:::-;24924:9;24918:4;24914:20;24909:2;24898:9;24894:18;24887:48;24952:76;25023:4;25014:6;24952:76;:::i;:::-;24944:84;;24395:640;;;;;;;:::o;25041:332::-;25162:4;25200:2;25189:9;25185:18;25177:26;;25213:71;25281:1;25270:9;25266:17;25257:6;25213:71;:::i;:::-;25294:72;25362:2;25351:9;25347:18;25338:6;25294:72;:::i;:::-;25041:332;;;;;:::o;25379:373::-;25522:4;25560:2;25549:9;25545:18;25537:26;;25609:9;25603:4;25599:20;25595:1;25584:9;25580:17;25573:47;25637:108;25740:4;25731:6;25637:108;:::i;:::-;25629:116;;25379:373;;;;:::o;25758:210::-;25845:4;25883:2;25872:9;25868:18;25860:26;;25896:65;25958:1;25947:9;25943:17;25934:6;25896:65;:::i;:::-;25758:210;;;;:::o;25974:313::-;26087:4;26125:2;26114:9;26110:18;26102:26;;26174:9;26168:4;26164:20;26160:1;26149:9;26145:17;26138:47;26202:78;26275:4;26266:6;26202:78;:::i;:::-;26194:86;;25974:313;;;;:::o;26293:419::-;26459:4;26497:2;26486:9;26482:18;26474:26;;26546:9;26540:4;26536:20;26532:1;26521:9;26517:17;26510:47;26574:131;26700:4;26574:131;:::i;:::-;26566:139;;26293:419;;;:::o;26718:::-;26884:4;26922:2;26911:9;26907:18;26899:26;;26971:9;26965:4;26961:20;26957:1;26946:9;26942:17;26935:47;26999:131;27125:4;26999:131;:::i;:::-;26991:139;;26718:419;;;:::o;27143:::-;27309:4;27347:2;27336:9;27332:18;27324:26;;27396:9;27390:4;27386:20;27382:1;27371:9;27367:17;27360:47;27424:131;27550:4;27424:131;:::i;:::-;27416:139;;27143:419;;;:::o;27568:::-;27734:4;27772:2;27761:9;27757:18;27749:26;;27821:9;27815:4;27811:20;27807:1;27796:9;27792:17;27785:47;27849:131;27975:4;27849:131;:::i;:::-;27841:139;;27568:419;;;:::o;27993:::-;28159:4;28197:2;28186:9;28182:18;28174:26;;28246:9;28240:4;28236:20;28232:1;28221:9;28217:17;28210:47;28274:131;28400:4;28274:131;:::i;:::-;28266:139;;27993:419;;;:::o;28418:::-;28584:4;28622:2;28611:9;28607:18;28599:26;;28671:9;28665:4;28661:20;28657:1;28646:9;28642:17;28635:47;28699:131;28825:4;28699:131;:::i;:::-;28691:139;;28418:419;;;:::o;28843:::-;29009:4;29047:2;29036:9;29032:18;29024:26;;29096:9;29090:4;29086:20;29082:1;29071:9;29067:17;29060:47;29124:131;29250:4;29124:131;:::i;:::-;29116:139;;28843:419;;;:::o;29268:::-;29434:4;29472:2;29461:9;29457:18;29449:26;;29521:9;29515:4;29511:20;29507:1;29496:9;29492:17;29485:47;29549:131;29675:4;29549:131;:::i;:::-;29541:139;;29268:419;;;:::o;29693:::-;29859:4;29897:2;29886:9;29882:18;29874:26;;29946:9;29940:4;29936:20;29932:1;29921:9;29917:17;29910:47;29974:131;30100:4;29974:131;:::i;:::-;29966:139;;29693:419;;;:::o;30118:::-;30284:4;30322:2;30311:9;30307:18;30299:26;;30371:9;30365:4;30361:20;30357:1;30346:9;30342:17;30335:47;30399:131;30525:4;30399:131;:::i;:::-;30391:139;;30118:419;;;:::o;30543:::-;30709:4;30747:2;30736:9;30732:18;30724:26;;30796:9;30790:4;30786:20;30782:1;30771:9;30767:17;30760:47;30824:131;30950:4;30824:131;:::i;:::-;30816:139;;30543:419;;;:::o;30968:::-;31134:4;31172:2;31161:9;31157:18;31149:26;;31221:9;31215:4;31211:20;31207:1;31196:9;31192:17;31185:47;31249:131;31375:4;31249:131;:::i;:::-;31241:139;;30968:419;;;:::o;31393:::-;31559:4;31597:2;31586:9;31582:18;31574:26;;31646:9;31640:4;31636:20;31632:1;31621:9;31617:17;31610:47;31674:131;31800:4;31674:131;:::i;:::-;31666:139;;31393:419;;;:::o;31818:::-;31984:4;32022:2;32011:9;32007:18;31999:26;;32071:9;32065:4;32061:20;32057:1;32046:9;32042:17;32035:47;32099:131;32225:4;32099:131;:::i;:::-;32091:139;;31818:419;;;:::o;32243:::-;32409:4;32447:2;32436:9;32432:18;32424:26;;32496:9;32490:4;32486:20;32482:1;32471:9;32467:17;32460:47;32524:131;32650:4;32524:131;:::i;:::-;32516:139;;32243:419;;;:::o;32668:::-;32834:4;32872:2;32861:9;32857:18;32849:26;;32921:9;32915:4;32911:20;32907:1;32896:9;32892:17;32885:47;32949:131;33075:4;32949:131;:::i;:::-;32941:139;;32668:419;;;:::o;33093:::-;33259:4;33297:2;33286:9;33282:18;33274:26;;33346:9;33340:4;33336:20;33332:1;33321:9;33317:17;33310:47;33374:131;33500:4;33374:131;:::i;:::-;33366:139;;33093:419;;;:::o;33518:::-;33684:4;33722:2;33711:9;33707:18;33699:26;;33771:9;33765:4;33761:20;33757:1;33746:9;33742:17;33735:47;33799:131;33925:4;33799:131;:::i;:::-;33791:139;;33518:419;;;:::o;33943:::-;34109:4;34147:2;34136:9;34132:18;34124:26;;34196:9;34190:4;34186:20;34182:1;34171:9;34167:17;34160:47;34224:131;34350:4;34224:131;:::i;:::-;34216:139;;33943:419;;;:::o;34368:::-;34534:4;34572:2;34561:9;34557:18;34549:26;;34621:9;34615:4;34611:20;34607:1;34596:9;34592:17;34585:47;34649:131;34775:4;34649:131;:::i;:::-;34641:139;;34368:419;;;:::o;34793:::-;34959:4;34997:2;34986:9;34982:18;34974:26;;35046:9;35040:4;35036:20;35032:1;35021:9;35017:17;35010:47;35074:131;35200:4;35074:131;:::i;:::-;35066:139;;34793:419;;;:::o;35218:::-;35384:4;35422:2;35411:9;35407:18;35399:26;;35471:9;35465:4;35461:20;35457:1;35446:9;35442:17;35435:47;35499:131;35625:4;35499:131;:::i;:::-;35491:139;;35218:419;;;:::o;35643:::-;35809:4;35847:2;35836:9;35832:18;35824:26;;35896:9;35890:4;35886:20;35882:1;35871:9;35867:17;35860:47;35924:131;36050:4;35924:131;:::i;:::-;35916:139;;35643:419;;;:::o;36068:::-;36234:4;36272:2;36261:9;36257:18;36249:26;;36321:9;36315:4;36311:20;36307:1;36296:9;36292:17;36285:47;36349:131;36475:4;36349:131;:::i;:::-;36341:139;;36068:419;;;:::o;36493:::-;36659:4;36697:2;36686:9;36682:18;36674:26;;36746:9;36740:4;36736:20;36732:1;36721:9;36717:17;36710:47;36774:131;36900:4;36774:131;:::i;:::-;36766:139;;36493:419;;;:::o;36918:222::-;37011:4;37049:2;37038:9;37034:18;37026:26;;37062:71;37130:1;37119:9;37115:17;37106:6;37062:71;:::i;:::-;36918:222;;;;:::o;37146:129::-;37180:6;37207:20;;:::i;:::-;37197:30;;37236:33;37264:4;37256:6;37236:33;:::i;:::-;37146:129;;;:::o;37281:75::-;37314:6;37347:2;37341:9;37331:19;;37281:75;:::o;37362:311::-;37439:4;37529:18;37521:6;37518:30;37515:56;;;37551:18;;:::i;:::-;37515:56;37601:4;37593:6;37589:17;37581:25;;37661:4;37655;37651:15;37643:23;;37362:311;;;:::o;37679:307::-;37740:4;37830:18;37822:6;37819:30;37816:56;;;37852:18;;:::i;:::-;37816:56;37890:29;37912:6;37890:29;:::i;:::-;37882:37;;37974:4;37968;37964:15;37956:23;;37679:307;;;:::o;37992:308::-;38054:4;38144:18;38136:6;38133:30;38130:56;;;38166:18;;:::i;:::-;38130:56;38204:29;38226:6;38204:29;:::i;:::-;38196:37;;38288:4;38282;38278:15;38270:23;;37992:308;;;:::o;38306:132::-;38373:4;38396:3;38388:11;;38426:4;38421:3;38417:14;38409:22;;38306:132;;;:::o;38444:114::-;38511:6;38545:5;38539:12;38529:22;;38444:114;;;:::o;38564:98::-;38615:6;38649:5;38643:12;38633:22;;38564:98;;;:::o;38668:99::-;38720:6;38754:5;38748:12;38738:22;;38668:99;;;:::o;38773:113::-;38843:4;38875;38870:3;38866:14;38858:22;;38773:113;;;:::o;38892:184::-;38991:11;39025:6;39020:3;39013:19;39065:4;39060:3;39056:14;39041:29;;38892:184;;;;:::o;39082:168::-;39165:11;39199:6;39194:3;39187:19;39239:4;39234:3;39230:14;39215:29;;39082:168;;;;:::o;39256:169::-;39340:11;39374:6;39369:3;39362:19;39414:4;39409:3;39405:14;39390:29;;39256:169;;;;:::o;39431:148::-;39533:11;39570:3;39555:18;;39431:148;;;;:::o;39585:305::-;39625:3;39644:20;39662:1;39644:20;:::i;:::-;39639:25;;39678:20;39696:1;39678:20;:::i;:::-;39673:25;;39832:1;39764:66;39760:74;39757:1;39754:81;39751:107;;;39838:18;;:::i;:::-;39751:107;39882:1;39879;39875:9;39868:16;;39585:305;;;;:::o;39896:185::-;39936:1;39953:20;39971:1;39953:20;:::i;:::-;39948:25;;39987:20;40005:1;39987:20;:::i;:::-;39982:25;;40026:1;40016:35;;40031:18;;:::i;:::-;40016:35;40073:1;40070;40066:9;40061:14;;39896:185;;;;:::o;40087:348::-;40127:7;40150:20;40168:1;40150:20;:::i;:::-;40145:25;;40184:20;40202:1;40184:20;:::i;:::-;40179:25;;40372:1;40304:66;40300:74;40297:1;40294:81;40289:1;40282:9;40275:17;40271:105;40268:131;;;40379:18;;:::i;:::-;40268:131;40427:1;40424;40420:9;40409:20;;40087:348;;;;:::o;40441:191::-;40481:4;40501:20;40519:1;40501:20;:::i;:::-;40496:25;;40535:20;40553:1;40535:20;:::i;:::-;40530:25;;40574:1;40571;40568:8;40565:34;;;40579:18;;:::i;:::-;40565:34;40624:1;40621;40617:9;40609:17;;40441:191;;;;:::o;40638:96::-;40675:7;40704:24;40722:5;40704:24;:::i;:::-;40693:35;;40638:96;;;:::o;40740:90::-;40774:7;40817:5;40810:13;40803:21;40792:32;;40740:90;;;:::o;40836:149::-;40872:7;40912:66;40905:5;40901:78;40890:89;;40836:149;;;:::o;40991:89::-;41027:7;41067:6;41060:5;41056:18;41045:29;;40991:89;;;:::o;41086:126::-;41123:7;41163:42;41156:5;41152:54;41141:65;;41086:126;;;:::o;41218:77::-;41255:7;41284:5;41273:16;;41218:77;;;:::o;41301:154::-;41385:6;41380:3;41375;41362:30;41447:1;41438:6;41433:3;41429:16;41422:27;41301:154;;;:::o;41461:307::-;41529:1;41539:113;41553:6;41550:1;41547:13;41539:113;;;41638:1;41633:3;41629:11;41623:18;41619:1;41614:3;41610:11;41603:39;41575:2;41572:1;41568:10;41563:15;;41539:113;;;41670:6;41667:1;41664:13;41661:101;;;41750:1;41741:6;41736:3;41732:16;41725:27;41661:101;41510:258;41461:307;;;:::o;41774:320::-;41818:6;41855:1;41849:4;41845:12;41835:22;;41902:1;41896:4;41892:12;41923:18;41913:81;;41979:4;41971:6;41967:17;41957:27;;41913:81;42041:2;42033:6;42030:14;42010:18;42007:38;42004:84;;;42060:18;;:::i;:::-;42004:84;41825:269;41774:320;;;:::o;42100:281::-;42183:27;42205:4;42183:27;:::i;:::-;42175:6;42171:40;42313:6;42301:10;42298:22;42277:18;42265:10;42262:34;42259:62;42256:88;;;42324:18;;:::i;:::-;42256:88;42364:10;42360:2;42353:22;42143:238;42100:281;;:::o;42387:233::-;42426:3;42449:24;42467:5;42449:24;:::i;:::-;42440:33;;42495:66;42488:5;42485:77;42482:103;;;42565:18;;:::i;:::-;42482:103;42612:1;42605:5;42601:13;42594:20;;42387:233;;;:::o;42626:176::-;42658:1;42675:20;42693:1;42675:20;:::i;:::-;42670:25;;42709:20;42727:1;42709:20;:::i;:::-;42704:25;;42748:1;42738:35;;42753:18;;:::i;:::-;42738:35;42794:1;42791;42787:9;42782:14;;42626:176;;;;:::o;42808:180::-;42856:77;42853:1;42846:88;42953:4;42950:1;42943:15;42977:4;42974:1;42967:15;42994:180;43042:77;43039:1;43032:88;43139:4;43136:1;43129:15;43163:4;43160:1;43153:15;43180:180;43228:77;43225:1;43218:88;43325:4;43322:1;43315:15;43349:4;43346:1;43339:15;43366:180;43414:77;43411:1;43404:88;43511:4;43508:1;43501:15;43535:4;43532:1;43525:15;43552:180;43600:77;43597:1;43590:88;43697:4;43694:1;43687:15;43721:4;43718:1;43711:15;43738:180;43786:77;43783:1;43776:88;43883:4;43880:1;43873:15;43907:4;43904:1;43897:15;43924:117;44033:1;44030;44023:12;44047:117;44156:1;44153;44146:12;44170:117;44279:1;44276;44269:12;44293:117;44402:1;44399;44392:12;44416:117;44525:1;44522;44515:12;44539:102;44580:6;44631:2;44627:7;44622:2;44615:5;44611:14;44607:28;44597:38;;44539:102;;;:::o;44647:170::-;44787:22;44783:1;44775:6;44771:14;44764:46;44647:170;:::o;44823:230::-;44963:34;44959:1;44951:6;44947:14;44940:58;45032:13;45027:2;45019:6;45015:15;45008:38;44823:230;:::o;45059:237::-;45199:34;45195:1;45187:6;45183:14;45176:58;45268:20;45263:2;45255:6;45251:15;45244:45;45059:237;:::o;45302:225::-;45442:34;45438:1;45430:6;45426:14;45419:58;45511:8;45506:2;45498:6;45494:15;45487:33;45302:225;:::o;45533:178::-;45673:30;45669:1;45661:6;45657:14;45650:54;45533:178;:::o;45717:223::-;45857:34;45853:1;45845:6;45841:14;45834:58;45926:6;45921:2;45913:6;45909:15;45902:31;45717:223;:::o;45946:175::-;46086:27;46082:1;46074:6;46070:14;46063:51;45946:175;:::o;46127:231::-;46267:34;46263:1;46255:6;46251:14;46244:58;46336:14;46331:2;46323:6;46319:15;46312:39;46127:231;:::o;46364:166::-;46504:18;46500:1;46492:6;46488:14;46481:42;46364:166;:::o;46536:243::-;46676:34;46672:1;46664:6;46660:14;46653:58;46745:26;46740:2;46732:6;46728:15;46721:51;46536:243;:::o;46785:230::-;46925:34;46921:1;46913:6;46909:14;46902:58;46994:13;46989:2;46981:6;46977:15;46970:38;46785:230;:::o;47021:229::-;47161:34;47157:1;47149:6;47145:14;47138:58;47230:12;47225:2;47217:6;47213:15;47206:37;47021:229;:::o;47256:228::-;47396:34;47392:1;47384:6;47380:14;47373:58;47465:11;47460:2;47452:6;47448:15;47441:36;47256:228;:::o;47490:233::-;47630:34;47626:1;47618:6;47614:14;47607:58;47699:16;47694:2;47686:6;47682:15;47675:41;47490:233;:::o;47729:182::-;47869:34;47865:1;47857:6;47853:14;47846:58;47729:182;:::o;47917:236::-;48057:34;48053:1;48045:6;48041:14;48034:58;48126:19;48121:2;48113:6;48109:15;48102:44;47917:236;:::o;48159:231::-;48299:34;48295:1;48287:6;48283:14;48276:58;48368:14;48363:2;48355:6;48351:15;48344:39;48159:231;:::o;48396:182::-;48536:34;48532:1;48524:6;48520:14;48513:58;48396:182;:::o;48584:228::-;48724:34;48720:1;48712:6;48708:14;48701:58;48793:11;48788:2;48780:6;48776:15;48769:36;48584:228;:::o;48818:234::-;48958:34;48954:1;48946:6;48942:14;48935:58;49027:17;49022:2;49014:6;49010:15;49003:42;48818:234;:::o;49058:220::-;49198:34;49194:1;49186:6;49182:14;49175:58;49267:3;49262:2;49254:6;49250:15;49243:28;49058:220;:::o;49284:232::-;49424:34;49420:1;49412:6;49408:14;49401:58;49493:15;49488:2;49480:6;49476:15;49469:40;49284:232;:::o;49522:236::-;49662:34;49658:1;49650:6;49646:14;49639:58;49731:19;49726:2;49718:6;49714:15;49707:44;49522:236;:::o;49764:231::-;49904:34;49900:1;49892:6;49888:14;49881:58;49973:14;49968:2;49960:6;49956:15;49949:39;49764:231;:::o;50001:235::-;50141:34;50137:1;50129:6;50125:14;50118:58;50210:18;50205:2;50197:6;50193:15;50186:43;50001:235;:::o;50242:122::-;50315:24;50333:5;50315:24;:::i;:::-;50308:5;50305:35;50295:63;;50354:1;50351;50344:12;50295:63;50242:122;:::o;50370:116::-;50440:21;50455:5;50440:21;:::i;:::-;50433:5;50430:32;50420:60;;50476:1;50473;50466:12;50420:60;50370:116;:::o;50492:120::-;50564:23;50581:5;50564:23;:::i;:::-;50557:5;50554:34;50544:62;;50602:1;50599;50592:12;50544:62;50492:120;:::o;50618:::-;50690:23;50707:5;50690:23;:::i;:::-;50683:5;50680:34;50670:62;;50728:1;50725;50718:12;50670:62;50618:120;:::o;50744:122::-;50817:24;50835:5;50817:24;:::i;:::-;50810:5;50807:35;50797:63;;50856:1;50853;50846:12;50797:63;50744:122;:::o

Swarm Source

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