ETH Price: $3,440.45 (-1.32%)

Token

Scary monsters ()
 

Overview

Max Total Supply

3,565 Scary monsters

Holders

253

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 Scary monsters
0x286a614351188704046901b5a56af5fab82d3825
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ScaryMonsters

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

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/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

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/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

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/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev 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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


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

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) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/ScaryMonsters.sol


pragma solidity ^0.8.0;










interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

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

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

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

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

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

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

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

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

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

error InvalidQueryRange();

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId)
        public
        view
        returns (TokenOwnership memory)
    {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _currentIndex) {
            return ownership;
        }
        ownership = _ownerships[tokenId];
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds)
        external
        view
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](
                tokenIdsLength
            );
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _currentIndex;
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, _currentIndex)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (
                uint256 i = start;
                i != stop && tokenIdsIdx != tokenIdsMaxLength;
                ++i
            ) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner)
        external
        view
        returns (uint256[] memory)
    {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (
                uint256 i = _startTokenId();
                tokenIdsIdx != tokenIdsLength;
                ++i
            ) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

contract ScaryMonsters is  Ownable, ERC721AQueryable {
    using Strings for uint256;

    IERC1155 private Jerky;
    uint256 public JerkyId = 1;
    address private Jerkyaddress =  0xa755c08a422434C480076c80692d9aEe67bCea2B;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;

    bool public isActive = true; 
    bool public revealed = false;

    string baseURI; 
    string public notRevealedUri = "https://cdn.monstercave.wtf/ipfs/blindbox/monster.json";
    string public baseExtension = ".json"; 

    mapping(uint256 => string) private _tokenURIs;

    constructor() 
        ERC721A("Scary monsters", "")
    {
        Jerky = IERC1155(Jerkyaddress);
        setNotRevealedURI(notRevealedUri);
    } 

    function mintMonster(uint256 tokenQuantity) public payable{
        require(
            isActive,
            "Mint must be active"
        );

        require(
            tokenQuantity > 0,
            "Exchanged monster must be greater than 0"
        );

        require(
            tokenQuantity <= Jerky.balanceOf(msg.sender, JerkyId),
            "Not enough Jerky sent"
        );

        require(
            Jerky.isApprovedForAll(msg.sender, address(this)), 
            "Approved required"
        );

        Jerky.safeTransferFrom(msg.sender, DEAD, JerkyId, tokenQuantity, "0x00");

        _safeMint(msg.sender, tokenQuantity);
    }

    function mintByOwner(address to, uint256 tokenQuantity) public payable onlyOwner{
        require(
            tokenQuantity > 0,
            "Exchanged monster must be greater than 0"
        );

        _safeMint(to, tokenQuantity);
    }


    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
       
        if (revealed == false) {
            return notRevealedUri;
        }

        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));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return
            string(abi.encodePacked(base, tokenId.toString(), baseExtension));
    }

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

    function flipActive() public onlyOwner {
        isActive = !isActive;
    }
    
    function flipReveal() public onlyOwner {
        revealed = !revealed;
    }

    
    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
   
    function setBaseExtension(string memory _newBaseExtension) public onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setJerkyContract(address _address) public onlyOwner {
        Jerky = IERC1155(_address);
    }
   

    function setJerkyId(uint256 _id) public onlyOwner {
        JerkyId = _id;
    }

    

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"JerkyId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipReveal","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":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mintMonster","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setJerkyContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setJerkyId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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"}]

60806040526001600a5573a755c08a422434c480076c80692d9aee67bcea2b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60146101000a81548160ff0219169083151502179055506000600b60156101000a81548160ff02191690831515021790555060405180606001604052806036815260200162004f3360369139600d9080519060200190620000c592919062000483565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200011392919062000483565b503480156200012157600080fd5b506040518060400160405280600e81526020017f5363617279206d6f6e737465727300000000000000000000000000000000000081525060405180602001604052806000815250620001886200017c620002de60201b60201c565b620002e660201b60201c565b8160039080519060200190620001a092919062000483565b508060049080519060200190620001b992919062000483565b50620001ca620003aa60201b60201c565b6001819055505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002d8600d805462000248906200058d565b80601f016020809104026020016040519081016040528092919081815260200182805462000276906200058d565b8015620002c75780601f106200029b57610100808354040283529160200191620002c7565b820191906000526020600020905b815481529060010190602001808311620002a957829003601f168201915b5050505050620003af60201b60201c565b6200061b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b620003bf620002de60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003e56200045a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200043e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000435906200055a565b60405180910390fd5b80600d90805190602001906200045692919062000483565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000491906200058d565b90600052602060002090601f016020900481019282620004b5576000855562000501565b82601f10620004d057805160ff191683800117855562000501565b8280016001018555821562000501579182015b8281111562000500578251825591602001919060010190620004e3565b5b50905062000510919062000514565b5090565b5b808211156200052f57600081600090555060010162000515565b5090565b6000620005426020836200057c565b91506200054f82620005f2565b602082019050919050565b60006020820190508181036000830152620005758162000533565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620005a657607f821691505b60208210811415620005bd57620005bc620005c3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614908806200062b6000396000f3fe6080604052600436106102045760003560e01c80635bbb217711610118578063b88d4fde116100a0578063da3ef23f1161006f578063da3ef23f1461074b578063e985e9c514610774578063eb204be9146107b1578063f2c4ce1e146107dc578063f2fde38b1461080557610204565b8063b88d4fde1461067d578063c23dc68f146106a6578063c6682862146106e3578063c87b56dd1461070e57610204565b80638462151c116100e75780638462151c146105845780638da5cb5b146105c157806395d89b41146105ec57806399a2557a14610617578063a22cb4651461065457610204565b80635bbb2177146104b65780636352211e146104f357806370a0823114610530578063715018a61461056d57610204565b806323b872dd1161019b5780633b94c1f91161016a5780633b94c1f9146103f957806342842e0e14610422578063518302271461044b57806352d939e31461047657806355f804b31461048d57610204565b806323b872dd146103745780633542aee21461039d5780633560f55d146103b95780633b84d9c6146103e257610204565b8063095ea7b3116101d7578063095ea7b3146102d95780630d5fc95c1461030257806318160ddd1461031e57806322f3e2d41461034957610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063081c8c44146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906139bb565b61082e565b60405161023d9190614075565b60405180910390f35b34801561025257600080fd5b5061025b610910565b6040516102689190614090565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613a5e565b6109a2565b6040516102a59190613f20565b60405180910390f35b3480156102ba57600080fd5b506102c3610a1e565b6040516102d09190614090565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb91906138b2565b610aac565b005b61031c60048036038101906103179190613a5e565b610bb1565b005b34801561032a57600080fd5b50610333610ec3565b60405161034091906141ad565b60405180910390f35b34801561035557600080fd5b5061035e610eda565b60405161036b9190614075565b60405180910390f35b34801561038057600080fd5b5061039b6004803603810190610396919061379c565b610eed565b005b6103b760048036038101906103b291906138b2565b610efd565b005b3480156103c557600080fd5b506103e060048036038101906103db919061372f565b610fca565b005b3480156103ee57600080fd5b506103f761108a565b005b34801561040557600080fd5b50610420600480360381019061041b9190613a5e565b611132565b005b34801561042e57600080fd5b506104496004803603810190610444919061379c565b6111b8565b005b34801561045757600080fd5b506104606111d8565b60405161046d9190614075565b60405180910390f35b34801561048257600080fd5b5061048b6111eb565b005b34801561049957600080fd5b506104b460048036038101906104af9190613a15565b611293565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613945565b611329565b6040516104ea9190614031565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613a5e565b6113ea565b6040516105279190613f20565b60405180910390f35b34801561053c57600080fd5b506105576004803603810190610552919061372f565b611400565b60405161056491906141ad565b60405180910390f35b34801561057957600080fd5b506105826114d0565b005b34801561059057600080fd5b506105ab60048036038101906105a6919061372f565b611558565b6040516105b89190614053565b60405180910390f35b3480156105cd57600080fd5b506105d661175a565b6040516105e39190613f20565b60405180910390f35b3480156105f857600080fd5b50610601611783565b60405161060e9190614090565b60405180910390f35b34801561062357600080fd5b5061063e600480360381019061063991906138f2565b611815565b60405161064b9190614053565b60405180910390f35b34801561066057600080fd5b5061067b60048036038101906106769190613872565b611adc565b005b34801561068957600080fd5b506106a4600480360381019061069f91906137ef565b611c54565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190613a5e565b611ccc565b6040516106da9190614192565b60405180910390f35b3480156106ef57600080fd5b506106f8611de9565b6040516107059190614090565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613a5e565b611e77565b6040516107429190614090565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190613a15565b61209b565b005b34801561078057600080fd5b5061079b6004803603810190610796919061375c565b612131565b6040516107a89190614075565b60405180910390f35b3480156107bd57600080fd5b506107c66121c5565b6040516107d391906141ad565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe9190613a15565b6121cb565b005b34801561081157600080fd5b5061082c6004803603810190610827919061372f565b612261565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610909575061090882612359565b5b9050919050565b60606003805461091f906144ca565b80601f016020809104026020016040519081016040528092919081815260200182805461094b906144ca565b80156109985780601f1061096d57610100808354040283529160200191610998565b820191906000526020600020905b81548152906001019060200180831161097b57829003601f168201915b5050505050905090565b60006109ad826123c3565b6109e3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610a2b906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610a57906144ca565b8015610aa45780601f10610a7957610100808354040283529160200191610aa4565b820191906000526020600020905b815481529060010190602001808311610a8757829003601f168201915b505050505081565b6000610ab7826113ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b1f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b3e612411565b73ffffffffffffffffffffffffffffffffffffffff1614610ba157610b6a81610b65612411565b612131565b610ba0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610bac838383612419565b505050565b600b60149054906101000a900460ff16610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf7906140b2565b60405180910390fd5b60008111610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90614152565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e33600a546040518363ffffffff1660e01b8152600401610ca1929190614008565b60206040518083038186803b158015610cb957600080fd5b505afa158015610ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf19190613a8b565b811115610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614172565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610d90929190613f3b565b60206040518083038186803b158015610da857600080fd5b505afa158015610dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de0919061398e565b610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e16906140f2565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a3361dead600a54856040518563ffffffff1660e01b8152600401610e849493929190613fb0565b600060405180830381600087803b158015610e9e57600080fd5b505af1158015610eb2573d6000803e3d6000fd5b50505050610ec033826124cb565b50565b6000610ecd6124e9565b6002546001540303905090565b600b60149054906101000a900460ff1681565b610ef88383836124ee565b505050565b610f05612411565b73ffffffffffffffffffffffffffffffffffffffff16610f2361175a565b73ffffffffffffffffffffffffffffffffffffffff1614610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090614112565b60405180910390fd5b60008111610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390614152565b60405180910390fd5b610fc682826124cb565b5050565b610fd2612411565b73ffffffffffffffffffffffffffffffffffffffff16610ff061175a565b73ffffffffffffffffffffffffffffffffffffffff1614611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d90614112565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611092612411565b73ffffffffffffffffffffffffffffffffffffffff166110b061175a565b73ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90614112565b60405180910390fd5b600b60159054906101000a900460ff1615600b60156101000a81548160ff021916908315150217905550565b61113a612411565b73ffffffffffffffffffffffffffffffffffffffff1661115861175a565b73ffffffffffffffffffffffffffffffffffffffff16146111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a590614112565b60405180910390fd5b80600a8190555050565b6111d383838360405180602001604052806000815250611c54565b505050565b600b60159054906101000a900460ff1681565b6111f3612411565b73ffffffffffffffffffffffffffffffffffffffff1661121161175a565b73ffffffffffffffffffffffffffffffffffffffff1614611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90614112565b60405180910390fd5b600b60149054906101000a900460ff1615600b60146101000a81548160ff021916908315150217905550565b61129b612411565b73ffffffffffffffffffffffffffffffffffffffff166112b961175a565b73ffffffffffffffffffffffffffffffffffffffff161461130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690614112565b60405180910390fd5b80600c9080519060200190611325929190613438565b5050565b606060008251905060008167ffffffffffffffff81111561134d5761134c614663565b5b60405190808252806020026020018201604052801561138657816020015b6113736134be565b81526020019060019003908161136b5790505b50905060005b8281146113df576113b68582815181106113a9576113a8614634565b5b6020026020010151611ccc565b8282815181106113c9576113c8614634565b5b602002602001018190525080600101905061138c565b508092505050919050565b60006113f5826129a4565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611468576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114d8612411565b73ffffffffffffffffffffffffffffffffffffffff166114f661175a565b73ffffffffffffffffffffffffffffffffffffffff161461154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390614112565b60405180910390fd5b6115566000612c2f565b565b6060600080600061156885611400565b905060008167ffffffffffffffff81111561158657611585614663565b5b6040519080825280602002602001820160405280156115b45781602001602082028036833780820191505090505b5090506115bf6134be565b60006115c96124e9565b90505b83861461174c57600560008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505091508160400151156116a557611741565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116e557816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611740578083878060010198508151811061173357611732614634565b5b6020026020010181815250505b5b8060010190506115cc565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611792906144ca565b80601f01602080910402602001604051908101604052809291908181526020018280546117be906144ca565b801561180b5780601f106117e05761010080835404028352916020019161180b565b820191906000526020600020905b8154815290600101906020018083116117ee57829003601f168201915b5050505050905090565b6060818310611850576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060015490506118606124e9565b8510156118725761186f6124e9565b94505b8084111561187e578093505b600061188987611400565b9050848610156118ac5760008686039050818110156118a6578091505b506118b1565b600090505b60008167ffffffffffffffff8111156118cd576118cc614663565b5b6040519080825280602002602001820160405280156118fb5781602001602082028036833780820191505090505b50905060008214156119135780945050505050611ad5565b600061191e88611ccc565b90506000816040015161193357816000015190505b60008990505b8881141580156119495750848714155b15611ac757600560008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015115611a2057611abc565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a6057826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611abb5780848880600101995081518110611aae57611aad614634565b5b6020026020010181815250505b5b806001019050611939565b508583528296505050505050505b9392505050565b611ae4612411565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b49576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611b56612411565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c03612411565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c489190614075565b60405180910390a35050565b611c5f8484846124ee565b611c7e8373ffffffffffffffffffffffffffffffffffffffff16612cf3565b15611cc657611c8f84848484612d16565b611cc5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611cd46134be565b611cdc6134be565b611ce46124e9565b831080611cf357506001548310155b15611d015780915050611de4565b600560008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611dd75780915050611de4565b611de0836129a4565b9150505b919050565b600e8054611df6906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611e22906144ca565b8015611e6f5780601f10611e4457610100808354040283529160200191611e6f565b820191906000526020600020905b815481529060010190602001808311611e5257829003601f168201915b505050505081565b6060611e82826123c3565b611ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb890614132565b60405180910390fd5b60001515600b60159054906101000a900460ff1615151415611f6f57600d8054611eea906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611f16906144ca565b8015611f635780601f10611f3857610100808354040283529160200191611f63565b820191906000526020600020905b815481529060010190602001808311611f4657829003601f168201915b50505050509050612096565b6000600f60008481526020019081526020016000208054611f8f906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611fbb906144ca565b80156120085780601f10611fdd57610100808354040283529160200191612008565b820191906000526020600020905b815481529060010190602001808311611feb57829003601f168201915b505050505090506000612019612e76565b905060008151141561202f578192505050612096565b60008251111561206457808260405160200161204c929190613ecb565b60405160208183030381529060405292505050612096565b8061206e85612f08565b600e60405160200161208293929190613eef565b604051602081830303815290604052925050505b919050565b6120a3612411565b73ffffffffffffffffffffffffffffffffffffffff166120c161175a565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e90614112565b60405180910390fd5b80600e908051906020019061212d929190613438565b5050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a5481565b6121d3612411565b73ffffffffffffffffffffffffffffffffffffffff166121f161175a565b73ffffffffffffffffffffffffffffffffffffffff1614612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90614112565b60405180910390fd5b80600d908051906020019061225d929190613438565b5050565b612269612411565b73ffffffffffffffffffffffffffffffffffffffff1661228761175a565b73ffffffffffffffffffffffffffffffffffffffff16146122dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d490614112565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561234d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612344906140d2565b60405180910390fd5b61235681612c2f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816123ce6124e9565b111580156123dd575060015482105b801561240a575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6124e5828260405180602001604052806000815250613069565b5050565b600090565b60006124f9826129a4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612564576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612585612411565b73ffffffffffffffffffffffffffffffffffffffff1614806125b457506125b3856125ae612411565b612131565b5b806125f957506125c2612411565b73ffffffffffffffffffffffffffffffffffffffff166125e1846109a2565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612632576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612699576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126a6858585600161342c565b6126b260008487612419565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561293257600154821461293157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461299d8585856001613432565b5050505050565b6129ac6134be565b6000829050806129ba6124e9565b11612bf857600154811015612bf7576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612bf557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ad9578092505050612c2a565b5b600115612bf457818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bef578092505050612c2a565b612ada565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d3c612411565b8786866040518563ffffffff1660e01b8152600401612d5e9493929190613f64565b602060405180830381600087803b158015612d7857600080fd5b505af1925050508015612da957506040513d601f19601f82011682018060405250810190612da691906139e8565b60015b612e23573d8060008114612dd9576040519150601f19603f3d011682016040523d82523d6000602084013e612dde565b606091505b50600081511415612e1b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612e85906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612eb1906144ca565b8015612efe5780601f10612ed357610100808354040283529160200191612efe565b820191906000526020600020905b815481529060010190602001808311612ee157829003601f168201915b5050505050905090565b60606000821415612f50576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613064565b600082905060005b60008214612f82578080612f6b9061452d565b915050600a82612f7b919061439b565b9150612f58565b60008167ffffffffffffffff811115612f9e57612f9d614663565b5b6040519080825280601f01601f191660200182016040528015612fd05781602001600182028036833780820191505090505b5090505b6000851461305d57600182612fe991906143cc565b9150600a85612ff89190614576565b60306130049190614345565b60f81b81838151811061301a57613019614634565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613056919061439b565b9450612fd4565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130d7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613112576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61311f600085838661342c565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506132e08673ffffffffffffffffffffffffffffffffffffffff16612cf3565b156133a5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133556000878480600101955087612d16565b61338b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106132e65782600154146133a057600080fd5b613410565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106133a6575b8160018190555050506134266000858386613432565b50505050565b50505050565b50505050565b828054613444906144ca565b90600052602060002090601f01602090048101928261346657600085556134ad565b82601f1061347f57805160ff19168380011785556134ad565b828001600101855582156134ad579182015b828111156134ac578251825591602001919060010190613491565b5b5090506134ba9190613501565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561351a576000816000905550600101613502565b5090565b600061353161352c846141ed565b6141c8565b9050808382526020820190508285602086028201111561355457613553614697565b5b60005b85811015613584578161356a8882613705565b845260208401935060208301925050600181019050613557565b5050509392505050565b60006135a161359c84614219565b6141c8565b9050828152602081018484840111156135bd576135bc61469c565b5b6135c8848285614488565b509392505050565b60006135e36135de8461424a565b6141c8565b9050828152602081018484840111156135ff576135fe61469c565b5b61360a848285614488565b509392505050565b60008135905061362181614876565b92915050565b600082601f83011261363c5761363b614692565b5b813561364c84826020860161351e565b91505092915050565b6000813590506136648161488d565b92915050565b6000815190506136798161488d565b92915050565b60008135905061368e816148a4565b92915050565b6000815190506136a3816148a4565b92915050565b600082601f8301126136be576136bd614692565b5b81356136ce84826020860161358e565b91505092915050565b600082601f8301126136ec576136eb614692565b5b81356136fc8482602086016135d0565b91505092915050565b600081359050613714816148bb565b92915050565b600081519050613729816148bb565b92915050565b600060208284031215613745576137446146a6565b5b600061375384828501613612565b91505092915050565b60008060408385031215613773576137726146a6565b5b600061378185828601613612565b925050602061379285828601613612565b9150509250929050565b6000806000606084860312156137b5576137b46146a6565b5b60006137c386828701613612565b93505060206137d486828701613612565b92505060406137e586828701613705565b9150509250925092565b60008060008060808587031215613809576138086146a6565b5b600061381787828801613612565b945050602061382887828801613612565b935050604061383987828801613705565b925050606085013567ffffffffffffffff81111561385a576138596146a1565b5b613866878288016136a9565b91505092959194509250565b60008060408385031215613889576138886146a6565b5b600061389785828601613612565b92505060206138a885828601613655565b9150509250929050565b600080604083850312156138c9576138c86146a6565b5b60006138d785828601613612565b92505060206138e885828601613705565b9150509250929050565b60008060006060848603121561390b5761390a6146a6565b5b600061391986828701613612565b935050602061392a86828701613705565b925050604061393b86828701613705565b9150509250925092565b60006020828403121561395b5761395a6146a6565b5b600082013567ffffffffffffffff811115613979576139786146a1565b5b61398584828501613627565b91505092915050565b6000602082840312156139a4576139a36146a6565b5b60006139b28482850161366a565b91505092915050565b6000602082840312156139d1576139d06146a6565b5b60006139df8482850161367f565b91505092915050565b6000602082840312156139fe576139fd6146a6565b5b6000613a0c84828501613694565b91505092915050565b600060208284031215613a2b57613a2a6146a6565b5b600082013567ffffffffffffffff811115613a4957613a486146a1565b5b613a55848285016136d7565b91505092915050565b600060208284031215613a7457613a736146a6565b5b6000613a8284828501613705565b91505092915050565b600060208284031215613aa157613aa06146a6565b5b6000613aaf8482850161371a565b91505092915050565b6000613ac48383613e1a565b60608301905092915050565b6000613adc8383613e9e565b60208301905092915050565b613af181614400565b82525050565b613b0081614400565b82525050565b6000613b11826142b0565b613b1b81856142f6565b9350613b268361427b565b8060005b83811015613b57578151613b3e8882613ab8565b9750613b49836142dc565b925050600181019050613b2a565b5085935050505092915050565b6000613b6f826142bb565b613b798185614307565b9350613b848361428b565b8060005b83811015613bb5578151613b9c8882613ad0565b9750613ba7836142e9565b925050600181019050613b88565b5085935050505092915050565b613bcb81614412565b82525050565b613bda81614412565b82525050565b6000613beb826142c6565b613bf58185614318565b9350613c05818560208601614497565b613c0e816146ab565b840191505092915050565b6000613c24826142d1565b613c2e8185614329565b9350613c3e818560208601614497565b613c47816146ab565b840191505092915050565b6000613c5d826142d1565b613c67818561433a565b9350613c77818560208601614497565b80840191505092915050565b60008154613c90816144ca565b613c9a818661433a565b94506001821660008114613cb55760018114613cc657613cf9565b60ff19831686528186019350613cf9565b613ccf8561429b565b60005b83811015613cf157815481890152600182019150602081019050613cd2565b838801955050505b50505092915050565b6000613d0f601383614329565b9150613d1a826146bc565b602082019050919050565b6000613d32602683614329565b9150613d3d826146e5565b604082019050919050565b6000613d55600483614318565b9150613d6082614734565b602082019050919050565b6000613d78601183614329565b9150613d838261475d565b602082019050919050565b6000613d9b602083614329565b9150613da682614786565b602082019050919050565b6000613dbe602f83614329565b9150613dc9826147af565b604082019050919050565b6000613de1602883614329565b9150613dec826147fe565b604082019050919050565b6000613e04601583614329565b9150613e0f8261484d565b602082019050919050565b606082016000820151613e306000850182613ae8565b506020820151613e436020850182613ebc565b506040820151613e566040850182613bc2565b50505050565b606082016000820151613e726000850182613ae8565b506020820151613e856020850182613ebc565b506040820151613e986040850182613bc2565b50505050565b613ea78161446a565b82525050565b613eb68161446a565b82525050565b613ec581614474565b82525050565b6000613ed78285613c52565b9150613ee38284613c52565b91508190509392505050565b6000613efb8286613c52565b9150613f078285613c52565b9150613f138284613c83565b9150819050949350505050565b6000602082019050613f356000830184613af7565b92915050565b6000604082019050613f506000830185613af7565b613f5d6020830184613af7565b9392505050565b6000608082019050613f796000830187613af7565b613f866020830186613af7565b613f936040830185613ead565b8181036060830152613fa58184613be0565b905095945050505050565b600060a082019050613fc56000830187613af7565b613fd26020830186613af7565b613fdf6040830185613ead565b613fec6060830184613ead565b8181036080830152613ffd81613d48565b905095945050505050565b600060408201905061401d6000830185613af7565b61402a6020830184613ead565b9392505050565b6000602082019050818103600083015261404b8184613b06565b905092915050565b6000602082019050818103600083015261406d8184613b64565b905092915050565b600060208201905061408a6000830184613bd1565b92915050565b600060208201905081810360008301526140aa8184613c19565b905092915050565b600060208201905081810360008301526140cb81613d02565b9050919050565b600060208201905081810360008301526140eb81613d25565b9050919050565b6000602082019050818103600083015261410b81613d6b565b9050919050565b6000602082019050818103600083015261412b81613d8e565b9050919050565b6000602082019050818103600083015261414b81613db1565b9050919050565b6000602082019050818103600083015261416b81613dd4565b9050919050565b6000602082019050818103600083015261418b81613df7565b9050919050565b60006060820190506141a76000830184613e5c565b92915050565b60006020820190506141c26000830184613ead565b92915050565b60006141d26141e3565b90506141de82826144fc565b919050565b6000604051905090565b600067ffffffffffffffff82111561420857614207614663565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561423457614233614663565b5b61423d826146ab565b9050602081019050919050565b600067ffffffffffffffff82111561426557614264614663565b5b61426e826146ab565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143508261446a565b915061435b8361446a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143905761438f6145a7565b5b828201905092915050565b60006143a68261446a565b91506143b18361446a565b9250826143c1576143c06145d6565b5b828204905092915050565b60006143d78261446a565b91506143e28361446a565b9250828210156143f5576143f46145a7565b5b828203905092915050565b600061440b8261444a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156144b557808201518184015260208101905061449a565b838111156144c4576000848401525b50505050565b600060028204905060018216806144e257607f821691505b602082108114156144f6576144f5614605565b5b50919050565b614505826146ab565b810181811067ffffffffffffffff8211171561452457614523614663565b5b80604052505050565b60006145388261446a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561456b5761456a6145a7565b5b600182019050919050565b60006145818261446a565b915061458c8361446a565b92508261459c5761459b6145d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74206d7573742062652061637469766500000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f3078303000000000000000000000000000000000000000000000000000000000600082015250565b7f417070726f766564207265717569726564000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786368616e676564206d6f6e73746572206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204a65726b792073656e740000000000000000000000600082015250565b61487f81614400565b811461488a57600080fd5b50565b61489681614412565b81146148a157600080fd5b50565b6148ad8161441e565b81146148b857600080fd5b50565b6148c48161446a565b81146148cf57600080fd5b5056fea26469706673582212205a307daeb559b33f94d9df76b80e961c611e3798c5759b4f88935b037475f56764736f6c6343000807003368747470733a2f2f63646e2e6d6f6e73746572636176652e7774662f697066732f626c696e64626f782f6d6f6e737465722e6a736f6e

Deployed Bytecode

0x6080604052600436106102045760003560e01c80635bbb217711610118578063b88d4fde116100a0578063da3ef23f1161006f578063da3ef23f1461074b578063e985e9c514610774578063eb204be9146107b1578063f2c4ce1e146107dc578063f2fde38b1461080557610204565b8063b88d4fde1461067d578063c23dc68f146106a6578063c6682862146106e3578063c87b56dd1461070e57610204565b80638462151c116100e75780638462151c146105845780638da5cb5b146105c157806395d89b41146105ec57806399a2557a14610617578063a22cb4651461065457610204565b80635bbb2177146104b65780636352211e146104f357806370a0823114610530578063715018a61461056d57610204565b806323b872dd1161019b5780633b94c1f91161016a5780633b94c1f9146103f957806342842e0e14610422578063518302271461044b57806352d939e31461047657806355f804b31461048d57610204565b806323b872dd146103745780633542aee21461039d5780633560f55d146103b95780633b84d9c6146103e257610204565b8063095ea7b3116101d7578063095ea7b3146102d95780630d5fc95c1461030257806318160ddd1461031e57806322f3e2d41461034957610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063081c8c44146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906139bb565b61082e565b60405161023d9190614075565b60405180910390f35b34801561025257600080fd5b5061025b610910565b6040516102689190614090565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613a5e565b6109a2565b6040516102a59190613f20565b60405180910390f35b3480156102ba57600080fd5b506102c3610a1e565b6040516102d09190614090565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb91906138b2565b610aac565b005b61031c60048036038101906103179190613a5e565b610bb1565b005b34801561032a57600080fd5b50610333610ec3565b60405161034091906141ad565b60405180910390f35b34801561035557600080fd5b5061035e610eda565b60405161036b9190614075565b60405180910390f35b34801561038057600080fd5b5061039b6004803603810190610396919061379c565b610eed565b005b6103b760048036038101906103b291906138b2565b610efd565b005b3480156103c557600080fd5b506103e060048036038101906103db919061372f565b610fca565b005b3480156103ee57600080fd5b506103f761108a565b005b34801561040557600080fd5b50610420600480360381019061041b9190613a5e565b611132565b005b34801561042e57600080fd5b506104496004803603810190610444919061379c565b6111b8565b005b34801561045757600080fd5b506104606111d8565b60405161046d9190614075565b60405180910390f35b34801561048257600080fd5b5061048b6111eb565b005b34801561049957600080fd5b506104b460048036038101906104af9190613a15565b611293565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613945565b611329565b6040516104ea9190614031565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613a5e565b6113ea565b6040516105279190613f20565b60405180910390f35b34801561053c57600080fd5b506105576004803603810190610552919061372f565b611400565b60405161056491906141ad565b60405180910390f35b34801561057957600080fd5b506105826114d0565b005b34801561059057600080fd5b506105ab60048036038101906105a6919061372f565b611558565b6040516105b89190614053565b60405180910390f35b3480156105cd57600080fd5b506105d661175a565b6040516105e39190613f20565b60405180910390f35b3480156105f857600080fd5b50610601611783565b60405161060e9190614090565b60405180910390f35b34801561062357600080fd5b5061063e600480360381019061063991906138f2565b611815565b60405161064b9190614053565b60405180910390f35b34801561066057600080fd5b5061067b60048036038101906106769190613872565b611adc565b005b34801561068957600080fd5b506106a4600480360381019061069f91906137ef565b611c54565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190613a5e565b611ccc565b6040516106da9190614192565b60405180910390f35b3480156106ef57600080fd5b506106f8611de9565b6040516107059190614090565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613a5e565b611e77565b6040516107429190614090565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190613a15565b61209b565b005b34801561078057600080fd5b5061079b6004803603810190610796919061375c565b612131565b6040516107a89190614075565b60405180910390f35b3480156107bd57600080fd5b506107c66121c5565b6040516107d391906141ad565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe9190613a15565b6121cb565b005b34801561081157600080fd5b5061082c6004803603810190610827919061372f565b612261565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610909575061090882612359565b5b9050919050565b60606003805461091f906144ca565b80601f016020809104026020016040519081016040528092919081815260200182805461094b906144ca565b80156109985780601f1061096d57610100808354040283529160200191610998565b820191906000526020600020905b81548152906001019060200180831161097b57829003601f168201915b5050505050905090565b60006109ad826123c3565b6109e3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610a2b906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610a57906144ca565b8015610aa45780601f10610a7957610100808354040283529160200191610aa4565b820191906000526020600020905b815481529060010190602001808311610a8757829003601f168201915b505050505081565b6000610ab7826113ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b1f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b3e612411565b73ffffffffffffffffffffffffffffffffffffffff1614610ba157610b6a81610b65612411565b612131565b610ba0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610bac838383612419565b505050565b600b60149054906101000a900460ff16610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf7906140b2565b60405180910390fd5b60008111610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90614152565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e33600a546040518363ffffffff1660e01b8152600401610ca1929190614008565b60206040518083038186803b158015610cb957600080fd5b505afa158015610ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf19190613a8b565b811115610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614172565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610d90929190613f3b565b60206040518083038186803b158015610da857600080fd5b505afa158015610dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de0919061398e565b610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e16906140f2565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a3361dead600a54856040518563ffffffff1660e01b8152600401610e849493929190613fb0565b600060405180830381600087803b158015610e9e57600080fd5b505af1158015610eb2573d6000803e3d6000fd5b50505050610ec033826124cb565b50565b6000610ecd6124e9565b6002546001540303905090565b600b60149054906101000a900460ff1681565b610ef88383836124ee565b505050565b610f05612411565b73ffffffffffffffffffffffffffffffffffffffff16610f2361175a565b73ffffffffffffffffffffffffffffffffffffffff1614610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090614112565b60405180910390fd5b60008111610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390614152565b60405180910390fd5b610fc682826124cb565b5050565b610fd2612411565b73ffffffffffffffffffffffffffffffffffffffff16610ff061175a565b73ffffffffffffffffffffffffffffffffffffffff1614611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d90614112565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611092612411565b73ffffffffffffffffffffffffffffffffffffffff166110b061175a565b73ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90614112565b60405180910390fd5b600b60159054906101000a900460ff1615600b60156101000a81548160ff021916908315150217905550565b61113a612411565b73ffffffffffffffffffffffffffffffffffffffff1661115861175a565b73ffffffffffffffffffffffffffffffffffffffff16146111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a590614112565b60405180910390fd5b80600a8190555050565b6111d383838360405180602001604052806000815250611c54565b505050565b600b60159054906101000a900460ff1681565b6111f3612411565b73ffffffffffffffffffffffffffffffffffffffff1661121161175a565b73ffffffffffffffffffffffffffffffffffffffff1614611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90614112565b60405180910390fd5b600b60149054906101000a900460ff1615600b60146101000a81548160ff021916908315150217905550565b61129b612411565b73ffffffffffffffffffffffffffffffffffffffff166112b961175a565b73ffffffffffffffffffffffffffffffffffffffff161461130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690614112565b60405180910390fd5b80600c9080519060200190611325929190613438565b5050565b606060008251905060008167ffffffffffffffff81111561134d5761134c614663565b5b60405190808252806020026020018201604052801561138657816020015b6113736134be565b81526020019060019003908161136b5790505b50905060005b8281146113df576113b68582815181106113a9576113a8614634565b5b6020026020010151611ccc565b8282815181106113c9576113c8614634565b5b602002602001018190525080600101905061138c565b508092505050919050565b60006113f5826129a4565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611468576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114d8612411565b73ffffffffffffffffffffffffffffffffffffffff166114f661175a565b73ffffffffffffffffffffffffffffffffffffffff161461154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390614112565b60405180910390fd5b6115566000612c2f565b565b6060600080600061156885611400565b905060008167ffffffffffffffff81111561158657611585614663565b5b6040519080825280602002602001820160405280156115b45781602001602082028036833780820191505090505b5090506115bf6134be565b60006115c96124e9565b90505b83861461174c57600560008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505091508160400151156116a557611741565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116e557816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611740578083878060010198508151811061173357611732614634565b5b6020026020010181815250505b5b8060010190506115cc565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611792906144ca565b80601f01602080910402602001604051908101604052809291908181526020018280546117be906144ca565b801561180b5780601f106117e05761010080835404028352916020019161180b565b820191906000526020600020905b8154815290600101906020018083116117ee57829003601f168201915b5050505050905090565b6060818310611850576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060015490506118606124e9565b8510156118725761186f6124e9565b94505b8084111561187e578093505b600061188987611400565b9050848610156118ac5760008686039050818110156118a6578091505b506118b1565b600090505b60008167ffffffffffffffff8111156118cd576118cc614663565b5b6040519080825280602002602001820160405280156118fb5781602001602082028036833780820191505090505b50905060008214156119135780945050505050611ad5565b600061191e88611ccc565b90506000816040015161193357816000015190505b60008990505b8881141580156119495750848714155b15611ac757600560008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015115611a2057611abc565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a6057826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611abb5780848880600101995081518110611aae57611aad614634565b5b6020026020010181815250505b5b806001019050611939565b508583528296505050505050505b9392505050565b611ae4612411565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b49576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611b56612411565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c03612411565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c489190614075565b60405180910390a35050565b611c5f8484846124ee565b611c7e8373ffffffffffffffffffffffffffffffffffffffff16612cf3565b15611cc657611c8f84848484612d16565b611cc5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611cd46134be565b611cdc6134be565b611ce46124e9565b831080611cf357506001548310155b15611d015780915050611de4565b600560008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611dd75780915050611de4565b611de0836129a4565b9150505b919050565b600e8054611df6906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611e22906144ca565b8015611e6f5780601f10611e4457610100808354040283529160200191611e6f565b820191906000526020600020905b815481529060010190602001808311611e5257829003601f168201915b505050505081565b6060611e82826123c3565b611ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb890614132565b60405180910390fd5b60001515600b60159054906101000a900460ff1615151415611f6f57600d8054611eea906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611f16906144ca565b8015611f635780601f10611f3857610100808354040283529160200191611f63565b820191906000526020600020905b815481529060010190602001808311611f4657829003601f168201915b50505050509050612096565b6000600f60008481526020019081526020016000208054611f8f906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611fbb906144ca565b80156120085780601f10611fdd57610100808354040283529160200191612008565b820191906000526020600020905b815481529060010190602001808311611feb57829003601f168201915b505050505090506000612019612e76565b905060008151141561202f578192505050612096565b60008251111561206457808260405160200161204c929190613ecb565b60405160208183030381529060405292505050612096565b8061206e85612f08565b600e60405160200161208293929190613eef565b604051602081830303815290604052925050505b919050565b6120a3612411565b73ffffffffffffffffffffffffffffffffffffffff166120c161175a565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e90614112565b60405180910390fd5b80600e908051906020019061212d929190613438565b5050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a5481565b6121d3612411565b73ffffffffffffffffffffffffffffffffffffffff166121f161175a565b73ffffffffffffffffffffffffffffffffffffffff1614612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90614112565b60405180910390fd5b80600d908051906020019061225d929190613438565b5050565b612269612411565b73ffffffffffffffffffffffffffffffffffffffff1661228761175a565b73ffffffffffffffffffffffffffffffffffffffff16146122dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d490614112565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561234d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612344906140d2565b60405180910390fd5b61235681612c2f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816123ce6124e9565b111580156123dd575060015482105b801561240a575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6124e5828260405180602001604052806000815250613069565b5050565b600090565b60006124f9826129a4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612564576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612585612411565b73ffffffffffffffffffffffffffffffffffffffff1614806125b457506125b3856125ae612411565b612131565b5b806125f957506125c2612411565b73ffffffffffffffffffffffffffffffffffffffff166125e1846109a2565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612632576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612699576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126a6858585600161342c565b6126b260008487612419565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561293257600154821461293157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461299d8585856001613432565b5050505050565b6129ac6134be565b6000829050806129ba6124e9565b11612bf857600154811015612bf7576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612bf557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ad9578092505050612c2a565b5b600115612bf457818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bef578092505050612c2a565b612ada565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d3c612411565b8786866040518563ffffffff1660e01b8152600401612d5e9493929190613f64565b602060405180830381600087803b158015612d7857600080fd5b505af1925050508015612da957506040513d601f19601f82011682018060405250810190612da691906139e8565b60015b612e23573d8060008114612dd9576040519150601f19603f3d011682016040523d82523d6000602084013e612dde565b606091505b50600081511415612e1b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612e85906144ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612eb1906144ca565b8015612efe5780601f10612ed357610100808354040283529160200191612efe565b820191906000526020600020905b815481529060010190602001808311612ee157829003601f168201915b5050505050905090565b60606000821415612f50576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613064565b600082905060005b60008214612f82578080612f6b9061452d565b915050600a82612f7b919061439b565b9150612f58565b60008167ffffffffffffffff811115612f9e57612f9d614663565b5b6040519080825280601f01601f191660200182016040528015612fd05781602001600182028036833780820191505090505b5090505b6000851461305d57600182612fe991906143cc565b9150600a85612ff89190614576565b60306130049190614345565b60f81b81838151811061301a57613019614634565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613056919061439b565b9450612fd4565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130d7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613112576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61311f600085838661342c565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506132e08673ffffffffffffffffffffffffffffffffffffffff16612cf3565b156133a5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133556000878480600101955087612d16565b61338b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106132e65782600154146133a057600080fd5b613410565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106133a6575b8160018190555050506134266000858386613432565b50505050565b50505050565b50505050565b828054613444906144ca565b90600052602060002090601f01602090048101928261346657600085556134ad565b82601f1061347f57805160ff19168380011785556134ad565b828001600101855582156134ad579182015b828111156134ac578251825591602001919060010190613491565b5b5090506134ba9190613501565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561351a576000816000905550600101613502565b5090565b600061353161352c846141ed565b6141c8565b9050808382526020820190508285602086028201111561355457613553614697565b5b60005b85811015613584578161356a8882613705565b845260208401935060208301925050600181019050613557565b5050509392505050565b60006135a161359c84614219565b6141c8565b9050828152602081018484840111156135bd576135bc61469c565b5b6135c8848285614488565b509392505050565b60006135e36135de8461424a565b6141c8565b9050828152602081018484840111156135ff576135fe61469c565b5b61360a848285614488565b509392505050565b60008135905061362181614876565b92915050565b600082601f83011261363c5761363b614692565b5b813561364c84826020860161351e565b91505092915050565b6000813590506136648161488d565b92915050565b6000815190506136798161488d565b92915050565b60008135905061368e816148a4565b92915050565b6000815190506136a3816148a4565b92915050565b600082601f8301126136be576136bd614692565b5b81356136ce84826020860161358e565b91505092915050565b600082601f8301126136ec576136eb614692565b5b81356136fc8482602086016135d0565b91505092915050565b600081359050613714816148bb565b92915050565b600081519050613729816148bb565b92915050565b600060208284031215613745576137446146a6565b5b600061375384828501613612565b91505092915050565b60008060408385031215613773576137726146a6565b5b600061378185828601613612565b925050602061379285828601613612565b9150509250929050565b6000806000606084860312156137b5576137b46146a6565b5b60006137c386828701613612565b93505060206137d486828701613612565b92505060406137e586828701613705565b9150509250925092565b60008060008060808587031215613809576138086146a6565b5b600061381787828801613612565b945050602061382887828801613612565b935050604061383987828801613705565b925050606085013567ffffffffffffffff81111561385a576138596146a1565b5b613866878288016136a9565b91505092959194509250565b60008060408385031215613889576138886146a6565b5b600061389785828601613612565b92505060206138a885828601613655565b9150509250929050565b600080604083850312156138c9576138c86146a6565b5b60006138d785828601613612565b92505060206138e885828601613705565b9150509250929050565b60008060006060848603121561390b5761390a6146a6565b5b600061391986828701613612565b935050602061392a86828701613705565b925050604061393b86828701613705565b9150509250925092565b60006020828403121561395b5761395a6146a6565b5b600082013567ffffffffffffffff811115613979576139786146a1565b5b61398584828501613627565b91505092915050565b6000602082840312156139a4576139a36146a6565b5b60006139b28482850161366a565b91505092915050565b6000602082840312156139d1576139d06146a6565b5b60006139df8482850161367f565b91505092915050565b6000602082840312156139fe576139fd6146a6565b5b6000613a0c84828501613694565b91505092915050565b600060208284031215613a2b57613a2a6146a6565b5b600082013567ffffffffffffffff811115613a4957613a486146a1565b5b613a55848285016136d7565b91505092915050565b600060208284031215613a7457613a736146a6565b5b6000613a8284828501613705565b91505092915050565b600060208284031215613aa157613aa06146a6565b5b6000613aaf8482850161371a565b91505092915050565b6000613ac48383613e1a565b60608301905092915050565b6000613adc8383613e9e565b60208301905092915050565b613af181614400565b82525050565b613b0081614400565b82525050565b6000613b11826142b0565b613b1b81856142f6565b9350613b268361427b565b8060005b83811015613b57578151613b3e8882613ab8565b9750613b49836142dc565b925050600181019050613b2a565b5085935050505092915050565b6000613b6f826142bb565b613b798185614307565b9350613b848361428b565b8060005b83811015613bb5578151613b9c8882613ad0565b9750613ba7836142e9565b925050600181019050613b88565b5085935050505092915050565b613bcb81614412565b82525050565b613bda81614412565b82525050565b6000613beb826142c6565b613bf58185614318565b9350613c05818560208601614497565b613c0e816146ab565b840191505092915050565b6000613c24826142d1565b613c2e8185614329565b9350613c3e818560208601614497565b613c47816146ab565b840191505092915050565b6000613c5d826142d1565b613c67818561433a565b9350613c77818560208601614497565b80840191505092915050565b60008154613c90816144ca565b613c9a818661433a565b94506001821660008114613cb55760018114613cc657613cf9565b60ff19831686528186019350613cf9565b613ccf8561429b565b60005b83811015613cf157815481890152600182019150602081019050613cd2565b838801955050505b50505092915050565b6000613d0f601383614329565b9150613d1a826146bc565b602082019050919050565b6000613d32602683614329565b9150613d3d826146e5565b604082019050919050565b6000613d55600483614318565b9150613d6082614734565b602082019050919050565b6000613d78601183614329565b9150613d838261475d565b602082019050919050565b6000613d9b602083614329565b9150613da682614786565b602082019050919050565b6000613dbe602f83614329565b9150613dc9826147af565b604082019050919050565b6000613de1602883614329565b9150613dec826147fe565b604082019050919050565b6000613e04601583614329565b9150613e0f8261484d565b602082019050919050565b606082016000820151613e306000850182613ae8565b506020820151613e436020850182613ebc565b506040820151613e566040850182613bc2565b50505050565b606082016000820151613e726000850182613ae8565b506020820151613e856020850182613ebc565b506040820151613e986040850182613bc2565b50505050565b613ea78161446a565b82525050565b613eb68161446a565b82525050565b613ec581614474565b82525050565b6000613ed78285613c52565b9150613ee38284613c52565b91508190509392505050565b6000613efb8286613c52565b9150613f078285613c52565b9150613f138284613c83565b9150819050949350505050565b6000602082019050613f356000830184613af7565b92915050565b6000604082019050613f506000830185613af7565b613f5d6020830184613af7565b9392505050565b6000608082019050613f796000830187613af7565b613f866020830186613af7565b613f936040830185613ead565b8181036060830152613fa58184613be0565b905095945050505050565b600060a082019050613fc56000830187613af7565b613fd26020830186613af7565b613fdf6040830185613ead565b613fec6060830184613ead565b8181036080830152613ffd81613d48565b905095945050505050565b600060408201905061401d6000830185613af7565b61402a6020830184613ead565b9392505050565b6000602082019050818103600083015261404b8184613b06565b905092915050565b6000602082019050818103600083015261406d8184613b64565b905092915050565b600060208201905061408a6000830184613bd1565b92915050565b600060208201905081810360008301526140aa8184613c19565b905092915050565b600060208201905081810360008301526140cb81613d02565b9050919050565b600060208201905081810360008301526140eb81613d25565b9050919050565b6000602082019050818103600083015261410b81613d6b565b9050919050565b6000602082019050818103600083015261412b81613d8e565b9050919050565b6000602082019050818103600083015261414b81613db1565b9050919050565b6000602082019050818103600083015261416b81613dd4565b9050919050565b6000602082019050818103600083015261418b81613df7565b9050919050565b60006060820190506141a76000830184613e5c565b92915050565b60006020820190506141c26000830184613ead565b92915050565b60006141d26141e3565b90506141de82826144fc565b919050565b6000604051905090565b600067ffffffffffffffff82111561420857614207614663565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561423457614233614663565b5b61423d826146ab565b9050602081019050919050565b600067ffffffffffffffff82111561426557614264614663565b5b61426e826146ab565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143508261446a565b915061435b8361446a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143905761438f6145a7565b5b828201905092915050565b60006143a68261446a565b91506143b18361446a565b9250826143c1576143c06145d6565b5b828204905092915050565b60006143d78261446a565b91506143e28361446a565b9250828210156143f5576143f46145a7565b5b828203905092915050565b600061440b8261444a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156144b557808201518184015260208101905061449a565b838111156144c4576000848401525b50505050565b600060028204905060018216806144e257607f821691505b602082108114156144f6576144f5614605565b5b50919050565b614505826146ab565b810181811067ffffffffffffffff8211171561452457614523614663565b5b80604052505050565b60006145388261446a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561456b5761456a6145a7565b5b600182019050919050565b60006145818261446a565b915061458c8361446a565b92508261459c5761459b6145d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74206d7573742062652061637469766500000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f3078303000000000000000000000000000000000000000000000000000000000600082015250565b7f417070726f766564207265717569726564000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786368616e676564206d6f6e73746572206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204a65726b792073656e740000000000000000000000600082015250565b61487f81614400565b811461488a57600080fd5b50565b61489681614412565b81146148a157600080fd5b50565b6148ad8161441e565b81146148b857600080fd5b50565b6148c48161446a565b81146148cf57600080fd5b5056fea26469706673582212205a307daeb559b33f94d9df76b80e961c611e3798c5759b4f88935b037475f56764736f6c63430008070033

Deployed Bytecode Sourcemap

56990:3578:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31859:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34974:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36478:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57398:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36040:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57754:675;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31099:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57304:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37343:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58437:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60354:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59866:78;;;;;;;;;;;;;:::i;:::-;;60473:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37584:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57339:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59776:78;;;;;;;;;;;;;:::i;:::-;;60098:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52077:523;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34782:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32228:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17480:103;;;;;;;;;;;;;:::i;:::-;;56003:980;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16829:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35143:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52990:2564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36754:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37840:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51477:441;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57492:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58694:953;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60213:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37112:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57113:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59958:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17738:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31859:305;31961:4;32013:25;31998:40;;;:11;:40;;;;:105;;;;32070:33;32055:48;;;:11;:48;;;;31998:105;:158;;;;32120:36;32144:11;32120:23;:36::i;:::-;31998:158;31978:178;;31859:305;;;:::o;34974:100::-;35028:13;35061:5;35054:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34974:100;:::o;36478:204::-;36546:7;36571:16;36579:7;36571;:16::i;:::-;36566:64;;36596:34;;;;;;;;;;;;;;36566:64;36650:15;:24;36666:7;36650:24;;;;;;;;;;;;;;;;;;;;;36643:31;;36478:204;;;:::o;57398:87::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36040:372::-;36113:13;36129:24;36145:7;36129:15;:24::i;:::-;36113:40;;36174:5;36168:11;;:2;:11;;;36164:48;;;36188:24;;;;;;;;;;;;;;36164:48;36245:5;36229:21;;:12;:10;:12::i;:::-;:21;;;36225:139;;36256:37;36273:5;36280:12;:10;:12::i;:::-;36256:16;:37::i;:::-;36252:112;;36317:35;;;;;;;;;;;;;;36252:112;36225:139;36376:28;36385:2;36389:7;36398:5;36376:8;:28::i;:::-;36102:310;36040:372;;:::o;57754:675::-;57845:8;;;;;;;;;;;57823:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57951:1;57935:13;:17;57913:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;58072:5;;;;;;;;;;;:15;;;58088:10;58100:7;;58072:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58055:13;:53;;58033:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;58192:5;;;;;;;;;;;:22;;;58215:10;58235:4;58192:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58170:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58300:5;;;;;;;;;;;:22;;;58323:10;57253:42;58341:7;;58350:13;58300:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58385:36;58395:10;58407:13;58385:9;:36::i;:::-;57754:675;:::o;31099:312::-;31152:7;31377:15;:13;:15::i;:::-;31362:12;;31346:13;;:28;:46;31339:53;;31099:312;:::o;57304:27::-;;;;;;;;;;;;;:::o;37343:170::-;37477:28;37487:4;37493:2;37497:7;37477:9;:28::i;:::-;37343:170;;;:::o;58437:247::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58566:1:::1;58550:13;:17;58528:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;58648:28;58658:2;58662:13;58648:9;:28::i;:::-;58437:247:::0;;:::o;60354:106::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60443:8:::1;60426:5;;:26;;;;;;;;;;;;;;;;;;60354:106:::0;:::o;59866:78::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59928:8:::1;;;;;;;;;;;59927:9;59916:8;;:20;;;;;;;;;;;;;;;;;;59866:78::o:0;60473:82::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60544:3:::1;60534:7;:13;;;;60473:82:::0;:::o;37584:185::-;37722:39;37739:4;37745:2;37749:7;37722:39;;;;;;;;;;;;:16;:39::i;:::-;37584:185;;;:::o;57339:28::-;;;;;;;;;;;;;:::o;59776:78::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59838:8:::1;;;;;;;;;;;59837:9;59826:8;;:20;;;;;;;;;;;;;;;;;;59776:78::o:0;60098:104::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60183:11:::1;60173:7;:21;;;;;;;;;;;;:::i;:::-;;60098:104:::0;:::o;52077:523::-;52184:23;52250:22;52275:8;:15;52250:40;;52305:34;52381:14;52342:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52305:105;;52430:9;52425:125;52446:14;52441:1;:19;52425:125;;52502:32;52522:8;52531:1;52522:11;;;;;;;;:::i;:::-;;;;;;;;52502:19;:32::i;:::-;52486:10;52497:1;52486:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;52462:3;;;;;52425:125;;;;52571:10;52564:17;;;;52077:523;;;:::o;34782:125::-;34846:7;34873:21;34886:7;34873:12;:21::i;:::-;:26;;;34866:33;;34782:125;;;:::o;32228:206::-;32292:7;32333:1;32316:19;;:5;:19;;;32312:60;;;32344:28;;;;;;;;;;;;;;32312:60;32398:12;:19;32411:5;32398:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32390:36;;32383:43;;32228:206;;;:::o;17480:103::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17545:30:::1;17572:1;17545:18;:30::i;:::-;17480:103::o:0;56003:980::-;56091:16;56150:19;56184:25;56224:22;56249:16;56259:5;56249:9;:16::i;:::-;56224:41;;56280:25;56322:14;56308:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56280:57;;56352:31;;:::i;:::-;56421:9;56433:15;:13;:15::i;:::-;56421:27;;56398:537;56482:14;56467:11;:29;56398:537;;56565:11;:14;56577:1;56565:14;;;;;;;;;;;56553:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56602:9;:16;;;56598:73;;;56643:8;;56598:73;56719:1;56693:28;;:9;:14;;;:28;;;56689:111;;56766:9;:14;;;56746:34;;56689:111;56843:5;56822:26;;:17;:26;;;56818:102;;;56899:1;56873:8;56882:13;;;;;;56873:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;56818:102;56398:537;56515:3;;;;;56398:537;;;;56956:8;56949:15;;;;;;;56003:980;;;:::o;16829:87::-;16875:7;16902:6;;;;;;;;;;;16895:13;;16829:87;:::o;35143:104::-;35199:13;35232:7;35225:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35143:104;:::o;52990:2564::-;53116:16;53183:4;53174:5;:13;53170:45;;53196:19;;;;;;;;;;;;;;53170:45;53230:19;53264:17;53284:13;;53264:33;;53383:15;:13;:15::i;:::-;53375:5;:23;53371:87;;;53427:15;:13;:15::i;:::-;53419:23;;53371:87;53538:9;53531:4;:16;53527:73;;;53575:9;53568:16;;53527:73;53614:25;53642:16;53652:5;53642:9;:16::i;:::-;53614:44;;53836:4;53828:5;:12;53824:278;;;53861:19;53890:5;53883:4;:12;53861:34;;53932:17;53918:11;:31;53914:111;;;53994:11;53974:31;;53914:111;53842:198;53824:278;;;54085:1;54065:21;;53824:278;54116:25;54158:17;54144:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54116:60;;54216:1;54195:17;:22;54191:78;;;54245:8;54238:15;;;;;;;;54191:78;54413:31;54447:26;54467:5;54447:19;:26::i;:::-;54413:60;;54488:25;54733:9;:16;;;54728:92;;54790:9;:14;;;54770:34;;54728:92;54857:9;54869:5;54857:17;;54834:543;54898:4;54893:1;:9;;:45;;;;;54921:17;54906:11;:32;;54893:45;54834:543;;;55007:11;:14;55019:1;55007:14;;;;;;;;;;;54995:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55044:9;:16;;;55040:73;;;55085:8;;55040:73;55161:1;55135:28;;:9;:14;;;:28;;;55131:111;;55208:9;:14;;;55188:34;;55131:111;55285:5;55264:26;;:17;:26;;;55260:102;;;55341:1;55315:8;55324:13;;;;;;55315:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;55260:102;54834:543;54957:3;;;;;54834:543;;;;55479:11;55469:8;55462:29;55527:8;55520:15;;;;;;;;52990:2564;;;;;;:::o;36754:287::-;36865:12;:10;:12::i;:::-;36853:24;;:8;:24;;;36849:54;;;36886:17;;;;;;;;;;;;;;36849:54;36961:8;36916:18;:32;36935:12;:10;:12::i;:::-;36916:32;;;;;;;;;;;;;;;:42;36949:8;36916:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37014:8;36985:48;;37000:12;:10;:12::i;:::-;36985:48;;;37024:8;36985:48;;;;;;:::i;:::-;;;;;;;;36754:287;;:::o;37840:370::-;38007:28;38017:4;38023:2;38027:7;38007:9;:28::i;:::-;38050:15;:2;:13;;;:15::i;:::-;38046:157;;;38071:56;38102:4;38108:2;38112:7;38121:5;38071:30;:56::i;:::-;38067:136;;38151:40;;;;;;;;;;;;;;38067:136;38046:157;37840:370;;;;:::o;51477:441::-;51571:21;;:::i;:::-;51610:31;;:::i;:::-;51666:15;:13;:15::i;:::-;51656:7;:25;:53;;;;51696:13;;51685:7;:24;;51656:53;51652:102;;;51733:9;51726:16;;;;;51652:102;51776:11;:20;51788:7;51776:20;;;;;;;;;;;51764:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51811:9;:16;;;51807:65;;;51851:9;51844:16;;;;;51807:65;51889:21;51902:7;51889:12;:21::i;:::-;51882:28;;;51477:441;;;;:::o;57492:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58694:953::-;58767:13;58820:16;58828:7;58820;:16::i;:::-;58798:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;58947:5;58935:17;;:8;;;;;;;;;;;:17;;;58931:71;;;58976:14;58969:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58931:71;59014:23;59040:10;:19;59051:7;59040:19;;;;;;;;;;;59014:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59070:18;59091:10;:8;:10::i;:::-;59070:31;;59199:1;59183:4;59177:18;:23;59173:72;;;59224:9;59217:16;;;;;;59173:72;59375:1;59355:9;59349:23;:27;59345:108;;;59424:4;59430:9;59407:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59393:48;;;;;;59345:108;59598:4;59604:18;:7;:16;:18::i;:::-;59624:13;59581:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59554:85;;;;58694:953;;;;:::o;60213:133::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60321:17:::1;60305:13;:33;;;;;;;;;;;;:::i;:::-;;60213:133:::0;:::o;37112:164::-;37209:4;37233:18;:25;37252:5;37233:25;;;;;;;;;;;;;;;:35;37259:8;37233:35;;;;;;;;;;;;;;;;;;;;;;;;;37226:42;;37112:164;;;;:::o;57113:26::-;;;;:::o;59958:126::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60061:15:::1;60044:14;:32;;;;;;;;;;;;:::i;:::-;;59958:126:::0;:::o;17738:201::-;17060:12;:10;:12::i;:::-;17049:23;;:7;:5;:7::i;:::-;:23;;;17041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17847:1:::1;17827:22;;:8;:22;;;;17819:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17903:28;17922:8;17903:18;:28::i;:::-;17738:201:::0;:::o;6896:157::-;6981:4;7020:25;7005:40;;;:11;:40;;;;6998:47;;6896:157;;;:::o;38465:174::-;38522:4;38565:7;38546:15;:13;:15::i;:::-;:26;;:53;;;;;38586:13;;38576:7;:23;38546:53;:85;;;;;38604:11;:20;38616:7;38604:20;;;;;;;;;;;:27;;;;;;;;;;;;38603:28;38546:85;38539:92;;38465:174;;;:::o;15553:98::-;15606:7;15633:10;15626:17;;15553:98;:::o;47687:196::-;47829:2;47802:15;:24;47818:7;47802:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47867:7;47863:2;47847:28;;47856:5;47847:28;;;;;;;;;;;;47687:196;;;:::o;38723:104::-;38792:27;38802:2;38806:8;38792:27;;;;;;;;;;;;:9;:27::i;:::-;38723:104;;:::o;30873:92::-;30929:7;30873:92;:::o;42635:2130::-;42750:35;42788:21;42801:7;42788:12;:21::i;:::-;42750:59;;42848:4;42826:26;;:13;:18;;;:26;;;42822:67;;42861:28;;;;;;;;;;;;;;42822:67;42902:22;42944:4;42928:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;42965:36;42982:4;42988:12;:10;:12::i;:::-;42965:16;:36::i;:::-;42928:73;:126;;;;43042:12;:10;:12::i;:::-;43018:36;;:20;43030:7;43018:11;:20::i;:::-;:36;;;42928:126;42902:153;;43073:17;43068:66;;43099:35;;;;;;;;;;;;;;43068:66;43163:1;43149:16;;:2;:16;;;43145:52;;;43174:23;;;;;;;;;;;;;;43145:52;43210:43;43232:4;43238:2;43242:7;43251:1;43210:21;:43::i;:::-;43318:35;43335:1;43339:7;43348:4;43318:8;:35::i;:::-;43679:1;43649:12;:18;43662:4;43649:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43723:1;43695:12;:16;43708:2;43695:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43741:31;43775:11;:20;43787:7;43775:20;;;;;;;;;;;43741:54;;43826:2;43810:8;:13;;;:18;;;;;;;;;;;;;;;;;;43876:15;43843:8;:23;;;:49;;;;;;;;;;;;;;;;;;44144:19;44176:1;44166:7;:11;44144:33;;44192:31;44226:11;:24;44238:11;44226:24;;;;;;;;;;;44192:58;;44294:1;44269:27;;:8;:13;;;;;;;;;;;;:27;;;44265:384;;;44479:13;;44464:11;:28;44460:174;;44533:4;44517:8;:13;;;:20;;;;;;;;;;;;;;;;;;44586:13;:28;;;44560:8;:23;;;:54;;;;;;;;;;;;;;;;;;44460:174;44265:384;43624:1036;;;44696:7;44692:2;44677:27;;44686:4;44677:27;;;;;;;;;;;;44715:42;44736:4;44742:2;44746:7;44755:1;44715:20;:42::i;:::-;42739:2026;;42635:2130;;;:::o;33609:1111::-;33671:21;;:::i;:::-;33705:12;33720:7;33705:22;;33788:4;33769:15;:13;:15::i;:::-;:23;33765:888;;33805:13;;33798:4;:20;33794:859;;;33839:31;33873:11;:17;33885:4;33873:17;;;;;;;;;;;33839:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33914:9;:16;;;33909:729;;33985:1;33959:28;;:9;:14;;;:28;;;33955:101;;34023:9;34016:16;;;;;;33955:101;34358:261;34365:4;34358:261;;;34398:6;;;;;;;;34443:11;:17;34455:4;34443:17;;;;;;;;;;;34431:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34517:1;34491:28;;:9;:14;;;:28;;;34487:109;;34559:9;34552:16;;;;;;34487:109;34358:261;;;33909:729;33820:833;33794:859;33765:888;34681:31;;;;;;;;;;;;;;33609:1111;;;;:::o;18099:191::-;18173:16;18192:6;;;;;;;;;;;18173:25;;18218:8;18209:6;;:17;;;;;;;;;;;;;;;;;;18273:8;18242:40;;18263:8;18242:40;;;;;;;;;;;;18162:128;18099:191;:::o;19530:326::-;19590:4;19847:1;19825:7;:19;;;:23;19818:30;;19530:326;;;:::o;48375:667::-;48538:4;48575:2;48559:36;;;48596:12;:10;:12::i;:::-;48610:4;48616:7;48625:5;48559:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48555:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48810:1;48793:6;:13;:18;48789:235;;;48839:40;;;;;;;;;;;;;;48789:235;48982:6;48976:13;48967:6;48963:2;48959:15;48952:38;48555:480;48688:45;;;48678:55;;;:6;:55;;;;48671:62;;;48375:667;;;;;;:::o;59660:108::-;59720:13;59753:7;59746:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59660:108;:::o;13115:723::-;13171:13;13401:1;13392:5;:10;13388:53;;;13419:10;;;;;;;;;;;;;;;;;;;;;13388:53;13451:12;13466:5;13451:20;;13482:14;13507:78;13522:1;13514:4;:9;13507:78;;13540:8;;;;;:::i;:::-;;;;13571:2;13563:10;;;;;:::i;:::-;;;13507:78;;;13595:19;13627:6;13617:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13595:39;;13645:154;13661:1;13652:5;:10;13645:154;;13689:1;13679:11;;;;;:::i;:::-;;;13756:2;13748:5;:10;;;;:::i;:::-;13735:2;:24;;;;:::i;:::-;13722:39;;13705:6;13712;13705:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13785:2;13776:11;;;;;:::i;:::-;;;13645:154;;;13823:6;13809:21;;;;;13115:723;;;;:::o;39200:1749::-;39323:20;39346:13;;39323:36;;39388:1;39374:16;;:2;:16;;;39370:48;;;39399:19;;;;;;;;;;;;;;39370:48;39445:1;39433:8;:13;39429:44;;;39455:18;;;;;;;;;;;;;;39429:44;39486:61;39516:1;39520:2;39524:12;39538:8;39486:21;:61::i;:::-;39859:8;39824:12;:16;39837:2;39824:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39923:8;39883:12;:16;39896:2;39883:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39982:2;39949:11;:25;39961:12;39949:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40049:15;39999:11;:25;40011:12;39999:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40082:20;40105:12;40082:35;;40132:11;40161:8;40146:12;:23;40132:37;;40190:15;:2;:13;;;:15::i;:::-;40186:631;;;40226:313;40282:12;40278:2;40257:38;;40274:1;40257:38;;;;;;;;;;;;40323:69;40362:1;40366:2;40370:14;;;;;;40386:5;40323:30;:69::i;:::-;40318:174;;40428:40;;;;;;;;;;;;;;40318:174;40534:3;40519:12;:18;40226:313;;40620:12;40603:13;;:29;40599:43;;40634:8;;;40599:43;40186:631;;;40683:119;40739:14;;;;;;40735:2;40714:40;;40731:1;40714:40;;;;;;;;;;;;40797:3;40782:12;:18;40683:119;;40186:631;40847:12;40831:13;:28;;;;39799:1072;;40881:60;40910:1;40914:2;40918:12;40932:8;40881:20;:60::i;:::-;39312:1637;39200:1749;;;:::o;49690:159::-;;;;;:::o;50508:158::-;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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::-;2317:5;2348:6;2342:13;2333:22;;2364:30;2388:5;2364:30;:::i;:::-;2263:137;;;;:::o;2406:::-;2451:5;2489:6;2476:20;2467:29;;2505:32;2531:5;2505:32;:::i;:::-;2406:137;;;;:::o;2549:141::-;2605:5;2636:6;2630:13;2621:22;;2652:32;2678:5;2652:32;:::i;:::-;2549:141;;;;:::o;2709:338::-;2764:5;2813:3;2806:4;2798:6;2794:17;2790:27;2780:122;;2821:79;;:::i;:::-;2780:122;2938:6;2925:20;2963:78;3037:3;3029:6;3022:4;3014:6;3010:17;2963:78;:::i;:::-;2954:87;;2770:277;2709:338;;;;:::o;3067:340::-;3123:5;3172:3;3165:4;3157:6;3153:17;3149:27;3139:122;;3180:79;;:::i;:::-;3139:122;3297:6;3284:20;3322:79;3397:3;3389:6;3382:4;3374:6;3370:17;3322:79;:::i;:::-;3313:88;;3129:278;3067:340;;;;:::o;3413:139::-;3459:5;3497:6;3484:20;3475:29;;3513:33;3540:5;3513:33;:::i;:::-;3413:139;;;;:::o;3558:143::-;3615:5;3646:6;3640:13;3631:22;;3662:33;3689:5;3662:33;:::i;:::-;3558:143;;;;:::o;3707:329::-;3766:6;3815:2;3803:9;3794:7;3790:23;3786:32;3783:119;;;3821:79;;:::i;:::-;3783:119;3941:1;3966:53;4011:7;4002:6;3991:9;3987:22;3966:53;:::i;:::-;3956:63;;3912:117;3707:329;;;;:::o;4042:474::-;4110:6;4118;4167:2;4155:9;4146:7;4142:23;4138:32;4135:119;;;4173:79;;:::i;:::-;4135:119;4293:1;4318:53;4363:7;4354:6;4343:9;4339:22;4318:53;:::i;:::-;4308:63;;4264:117;4420:2;4446:53;4491:7;4482:6;4471:9;4467:22;4446:53;:::i;:::-;4436:63;;4391:118;4042:474;;;;;:::o;4522:619::-;4599:6;4607;4615;4664:2;4652:9;4643:7;4639:23;4635:32;4632:119;;;4670:79;;:::i;:::-;4632:119;4790:1;4815:53;4860:7;4851:6;4840:9;4836:22;4815:53;:::i;:::-;4805:63;;4761:117;4917:2;4943:53;4988:7;4979:6;4968:9;4964:22;4943:53;:::i;:::-;4933:63;;4888:118;5045:2;5071:53;5116:7;5107:6;5096:9;5092:22;5071:53;:::i;:::-;5061:63;;5016:118;4522:619;;;;;:::o;5147:943::-;5242:6;5250;5258;5266;5315:3;5303:9;5294:7;5290:23;5286:33;5283:120;;;5322:79;;:::i;:::-;5283:120;5442:1;5467:53;5512:7;5503:6;5492:9;5488:22;5467:53;:::i;:::-;5457:63;;5413:117;5569:2;5595:53;5640:7;5631:6;5620:9;5616:22;5595:53;:::i;:::-;5585:63;;5540:118;5697:2;5723:53;5768:7;5759:6;5748:9;5744:22;5723:53;:::i;:::-;5713:63;;5668:118;5853:2;5842:9;5838:18;5825:32;5884:18;5876:6;5873:30;5870:117;;;5906:79;;:::i;:::-;5870:117;6011:62;6065:7;6056:6;6045:9;6041:22;6011:62;:::i;:::-;6001:72;;5796:287;5147:943;;;;;;;:::o;6096:468::-;6161:6;6169;6218:2;6206:9;6197:7;6193:23;6189:32;6186:119;;;6224:79;;:::i;:::-;6186:119;6344:1;6369:53;6414:7;6405:6;6394:9;6390:22;6369:53;:::i;:::-;6359:63;;6315:117;6471:2;6497:50;6539:7;6530:6;6519:9;6515:22;6497:50;:::i;:::-;6487:60;;6442:115;6096:468;;;;;:::o;6570:474::-;6638:6;6646;6695:2;6683:9;6674:7;6670:23;6666:32;6663:119;;;6701:79;;:::i;:::-;6663:119;6821:1;6846:53;6891:7;6882:6;6871:9;6867:22;6846:53;:::i;:::-;6836:63;;6792:117;6948:2;6974:53;7019:7;7010:6;6999:9;6995:22;6974:53;:::i;:::-;6964:63;;6919:118;6570:474;;;;;:::o;7050:619::-;7127:6;7135;7143;7192:2;7180:9;7171:7;7167:23;7163:32;7160:119;;;7198:79;;:::i;:::-;7160:119;7318:1;7343:53;7388:7;7379:6;7368:9;7364:22;7343:53;:::i;:::-;7333:63;;7289:117;7445:2;7471:53;7516:7;7507:6;7496:9;7492:22;7471:53;:::i;:::-;7461:63;;7416:118;7573:2;7599:53;7644:7;7635:6;7624:9;7620:22;7599:53;:::i;:::-;7589:63;;7544:118;7050:619;;;;;:::o;7675:539::-;7759:6;7808:2;7796:9;7787:7;7783:23;7779:32;7776:119;;;7814:79;;:::i;:::-;7776:119;7962:1;7951:9;7947:17;7934:31;7992:18;7984:6;7981:30;7978:117;;;8014:79;;:::i;:::-;7978:117;8119:78;8189:7;8180:6;8169:9;8165:22;8119:78;:::i;:::-;8109:88;;7905:302;7675:539;;;;:::o;8220:345::-;8287:6;8336:2;8324:9;8315:7;8311:23;8307:32;8304:119;;;8342:79;;:::i;:::-;8304:119;8462:1;8487:61;8540:7;8531:6;8520:9;8516:22;8487:61;:::i;:::-;8477:71;;8433:125;8220:345;;;;:::o;8571:327::-;8629:6;8678:2;8666:9;8657:7;8653:23;8649:32;8646:119;;;8684:79;;:::i;:::-;8646:119;8804:1;8829:52;8873:7;8864:6;8853:9;8849:22;8829:52;:::i;:::-;8819:62;;8775:116;8571:327;;;;:::o;8904:349::-;8973:6;9022:2;9010:9;9001:7;8997:23;8993:32;8990:119;;;9028:79;;:::i;:::-;8990:119;9148:1;9173:63;9228:7;9219:6;9208:9;9204:22;9173:63;:::i;:::-;9163:73;;9119:127;8904:349;;;;:::o;9259:509::-;9328:6;9377:2;9365:9;9356:7;9352:23;9348:32;9345:119;;;9383:79;;:::i;:::-;9345:119;9531:1;9520:9;9516:17;9503:31;9561:18;9553:6;9550:30;9547:117;;;9583:79;;:::i;:::-;9547:117;9688:63;9743:7;9734:6;9723:9;9719:22;9688:63;:::i;:::-;9678:73;;9474:287;9259:509;;;;:::o;9774:329::-;9833:6;9882:2;9870:9;9861:7;9857:23;9853:32;9850:119;;;9888:79;;:::i;:::-;9850:119;10008:1;10033:53;10078:7;10069:6;10058:9;10054:22;10033:53;:::i;:::-;10023:63;;9979:117;9774:329;;;;:::o;10109:351::-;10179:6;10228:2;10216:9;10207:7;10203:23;10199:32;10196:119;;;10234:79;;:::i;:::-;10196:119;10354:1;10379:64;10435:7;10426:6;10415:9;10411:22;10379:64;:::i;:::-;10369:74;;10325:128;10109:351;;;;:::o;10466:303::-;10597:10;10618:108;10722:3;10714:6;10618:108;:::i;:::-;10758:4;10753:3;10749:14;10735:28;;10466:303;;;;:::o;10775:179::-;10844:10;10865:46;10907:3;10899:6;10865:46;:::i;:::-;10943:4;10938:3;10934:14;10920:28;;10775:179;;;;:::o;10960:108::-;11037:24;11055:5;11037:24;:::i;:::-;11032:3;11025:37;10960:108;;:::o;11074:118::-;11161:24;11179:5;11161:24;:::i;:::-;11156:3;11149:37;11074:118;;:::o;11274:980::-;11455:3;11484:85;11563:5;11484:85;:::i;:::-;11585:117;11695:6;11690:3;11585:117;:::i;:::-;11578:124;;11726:87;11807:5;11726:87;:::i;:::-;11836:7;11867:1;11852:377;11877:6;11874:1;11871:13;11852:377;;;11953:6;11947:13;11980:125;12101:3;12086:13;11980:125;:::i;:::-;11973:132;;12128:91;12212:6;12128:91;:::i;:::-;12118:101;;11912:317;11899:1;11896;11892:9;11887:14;;11852:377;;;11856:14;12245:3;12238:10;;11460:794;;;11274:980;;;;:::o;12290:732::-;12409:3;12438:54;12486:5;12438:54;:::i;:::-;12508:86;12587:6;12582:3;12508:86;:::i;:::-;12501:93;;12618:56;12668:5;12618:56;:::i;:::-;12697:7;12728:1;12713:284;12738:6;12735:1;12732:13;12713:284;;;12814:6;12808:13;12841:63;12900:3;12885:13;12841:63;:::i;:::-;12834:70;;12927:60;12980:6;12927:60;:::i;:::-;12917:70;;12773:224;12760:1;12757;12753:9;12748:14;;12713:284;;;12717:14;13013:3;13006:10;;12414:608;;;12290:732;;;;:::o;13028:99::-;13099:21;13114:5;13099:21;:::i;:::-;13094:3;13087:34;13028:99;;:::o;13133:109::-;13214:21;13229:5;13214:21;:::i;:::-;13209:3;13202:34;13133:109;;:::o;13248:360::-;13334:3;13362:38;13394:5;13362:38;:::i;:::-;13416:70;13479:6;13474:3;13416:70;:::i;:::-;13409:77;;13495:52;13540:6;13535:3;13528:4;13521:5;13517:16;13495:52;:::i;:::-;13572:29;13594:6;13572:29;:::i;:::-;13567:3;13563:39;13556:46;;13338:270;13248:360;;;;:::o;13614:364::-;13702:3;13730:39;13763:5;13730:39;:::i;:::-;13785:71;13849:6;13844:3;13785:71;:::i;:::-;13778:78;;13865:52;13910:6;13905:3;13898:4;13891:5;13887:16;13865:52;:::i;:::-;13942:29;13964:6;13942:29;:::i;:::-;13937:3;13933:39;13926:46;;13706:272;13614:364;;;;:::o;13984:377::-;14090:3;14118:39;14151:5;14118:39;:::i;:::-;14173:89;14255:6;14250:3;14173:89;:::i;:::-;14166:96;;14271:52;14316:6;14311:3;14304:4;14297:5;14293:16;14271:52;:::i;:::-;14348:6;14343:3;14339:16;14332:23;;14094:267;13984:377;;;;:::o;14391:845::-;14494:3;14531:5;14525:12;14560:36;14586:9;14560:36;:::i;:::-;14612:89;14694:6;14689:3;14612:89;:::i;:::-;14605:96;;14732:1;14721:9;14717:17;14748:1;14743:137;;;;14894:1;14889:341;;;;14710:520;;14743:137;14827:4;14823:9;14812;14808:25;14803:3;14796:38;14863:6;14858:3;14854:16;14847:23;;14743:137;;14889:341;14956:38;14988:5;14956:38;:::i;:::-;15016:1;15030:154;15044:6;15041:1;15038:13;15030:154;;;15118:7;15112:14;15108:1;15103:3;15099:11;15092:35;15168:1;15159:7;15155:15;15144:26;;15066:4;15063:1;15059:12;15054:17;;15030:154;;;15213:6;15208:3;15204:16;15197:23;;14896:334;;14710:520;;14498:738;;14391:845;;;;:::o;15242:366::-;15384:3;15405:67;15469:2;15464:3;15405:67;:::i;:::-;15398:74;;15481:93;15570:3;15481:93;:::i;:::-;15599:2;15594:3;15590:12;15583:19;;15242:366;;;:::o;15614:::-;15756:3;15777:67;15841:2;15836:3;15777:67;:::i;:::-;15770:74;;15853:93;15942:3;15853:93;:::i;:::-;15971:2;15966:3;15962:12;15955:19;;15614:366;;;:::o;15986:363::-;16127:3;16148:65;16211:1;16206:3;16148:65;:::i;:::-;16141:72;;16222:93;16311:3;16222:93;:::i;:::-;16340:2;16335:3;16331:12;16324:19;;15986:363;;;:::o;16355:366::-;16497:3;16518:67;16582:2;16577:3;16518:67;:::i;:::-;16511:74;;16594:93;16683:3;16594:93;:::i;:::-;16712:2;16707:3;16703:12;16696:19;;16355:366;;;:::o;16727:::-;16869:3;16890:67;16954:2;16949:3;16890:67;:::i;:::-;16883:74;;16966:93;17055:3;16966:93;:::i;:::-;17084:2;17079:3;17075:12;17068:19;;16727:366;;;:::o;17099:::-;17241:3;17262:67;17326:2;17321:3;17262:67;:::i;:::-;17255:74;;17338:93;17427:3;17338:93;:::i;:::-;17456:2;17451:3;17447:12;17440:19;;17099:366;;;:::o;17471:::-;17613:3;17634:67;17698:2;17693:3;17634:67;:::i;:::-;17627:74;;17710:93;17799:3;17710:93;:::i;:::-;17828:2;17823:3;17819:12;17812:19;;17471:366;;;:::o;17843:::-;17985:3;18006:67;18070:2;18065:3;18006:67;:::i;:::-;17999:74;;18082:93;18171:3;18082:93;:::i;:::-;18200:2;18195:3;18191:12;18184:19;;17843:366;;;:::o;18287:687::-;18436:4;18431:3;18427:14;18523:4;18516:5;18512:16;18506:23;18542:63;18599:4;18594:3;18590:14;18576:12;18542:63;:::i;:::-;18451:164;18707:4;18700:5;18696:16;18690:23;18726:61;18781:4;18776:3;18772:14;18758:12;18726:61;:::i;:::-;18625:172;18881:4;18874:5;18870:16;18864:23;18900:57;18951:4;18946:3;18942:14;18928:12;18900:57;:::i;:::-;18807:160;18405:569;18287:687;;:::o;19052:697::-;19211:4;19206:3;19202:14;19298:4;19291:5;19287:16;19281:23;19317:63;19374:4;19369:3;19365:14;19351:12;19317:63;:::i;:::-;19226:164;19482:4;19475:5;19471:16;19465:23;19501:61;19556:4;19551:3;19547:14;19533:12;19501:61;:::i;:::-;19400:172;19656:4;19649:5;19645:16;19639:23;19675:57;19726:4;19721:3;19717:14;19703:12;19675:57;:::i;:::-;19582:160;19180:569;19052:697;;:::o;19755:108::-;19832:24;19850:5;19832:24;:::i;:::-;19827:3;19820:37;19755:108;;:::o;19869:118::-;19956:24;19974:5;19956:24;:::i;:::-;19951:3;19944:37;19869:118;;:::o;19993:105::-;20068:23;20085:5;20068:23;:::i;:::-;20063:3;20056:36;19993:105;;:::o;20104:435::-;20284:3;20306:95;20397:3;20388:6;20306:95;:::i;:::-;20299:102;;20418:95;20509:3;20500:6;20418:95;:::i;:::-;20411:102;;20530:3;20523:10;;20104:435;;;;;:::o;20545:589::-;20770:3;20792:95;20883:3;20874:6;20792:95;:::i;:::-;20785:102;;20904:95;20995:3;20986:6;20904:95;:::i;:::-;20897:102;;21016:92;21104:3;21095:6;21016:92;:::i;:::-;21009:99;;21125:3;21118:10;;20545:589;;;;;;:::o;21140:222::-;21233:4;21271:2;21260:9;21256:18;21248:26;;21284:71;21352:1;21341:9;21337:17;21328:6;21284:71;:::i;:::-;21140:222;;;;:::o;21368:332::-;21489:4;21527:2;21516:9;21512:18;21504:26;;21540:71;21608:1;21597:9;21593:17;21584:6;21540:71;:::i;:::-;21621:72;21689:2;21678:9;21674:18;21665:6;21621:72;:::i;:::-;21368:332;;;;;:::o;21706:640::-;21901:4;21939:3;21928:9;21924:19;21916:27;;21953:71;22021:1;22010:9;22006:17;21997:6;21953:71;:::i;:::-;22034:72;22102:2;22091:9;22087:18;22078:6;22034:72;:::i;:::-;22116;22184:2;22173:9;22169:18;22160:6;22116:72;:::i;:::-;22235:9;22229:4;22225:20;22220:2;22209:9;22205:18;22198:48;22263:76;22334:4;22325:6;22263:76;:::i;:::-;22255:84;;21706:640;;;;;;;:::o;22352:859::-;22629:4;22667:3;22656:9;22652:19;22644:27;;22681:71;22749:1;22738:9;22734:17;22725:6;22681:71;:::i;:::-;22762:72;22830:2;22819:9;22815:18;22806:6;22762:72;:::i;:::-;22844;22912:2;22901:9;22897:18;22888:6;22844:72;:::i;:::-;22926;22994:2;22983:9;22979:18;22970:6;22926:72;:::i;:::-;23046:9;23040:4;23036:20;23030:3;23019:9;23015:19;23008:49;23074:130;23199:4;23074:130;:::i;:::-;23066:138;;22352:859;;;;;;;:::o;23217:332::-;23338:4;23376:2;23365:9;23361:18;23353:26;;23389:71;23457:1;23446:9;23442:17;23433:6;23389:71;:::i;:::-;23470:72;23538:2;23527:9;23523:18;23514:6;23470:72;:::i;:::-;23217:332;;;;;:::o;23555:497::-;23760:4;23798:2;23787:9;23783:18;23775:26;;23847:9;23841:4;23837:20;23833:1;23822:9;23818:17;23811:47;23875:170;24040:4;24031:6;23875:170;:::i;:::-;23867:178;;23555:497;;;;:::o;24058:373::-;24201:4;24239:2;24228:9;24224:18;24216:26;;24288:9;24282:4;24278:20;24274:1;24263:9;24259:17;24252:47;24316:108;24419:4;24410:6;24316:108;:::i;:::-;24308:116;;24058:373;;;;:::o;24437:210::-;24524:4;24562:2;24551:9;24547:18;24539:26;;24575:65;24637:1;24626:9;24622:17;24613:6;24575:65;:::i;:::-;24437:210;;;;:::o;24653:313::-;24766:4;24804:2;24793:9;24789:18;24781:26;;24853:9;24847:4;24843:20;24839:1;24828:9;24824:17;24817:47;24881:78;24954:4;24945:6;24881:78;:::i;:::-;24873:86;;24653:313;;;;:::o;24972:419::-;25138:4;25176:2;25165:9;25161:18;25153:26;;25225:9;25219:4;25215:20;25211:1;25200:9;25196:17;25189:47;25253:131;25379:4;25253:131;:::i;:::-;25245:139;;24972:419;;;:::o;25397:::-;25563:4;25601:2;25590:9;25586:18;25578:26;;25650:9;25644:4;25640:20;25636:1;25625:9;25621:17;25614:47;25678:131;25804:4;25678:131;:::i;:::-;25670:139;;25397:419;;;:::o;25822:::-;25988:4;26026:2;26015:9;26011:18;26003:26;;26075:9;26069:4;26065:20;26061:1;26050:9;26046:17;26039:47;26103:131;26229:4;26103:131;:::i;:::-;26095:139;;25822:419;;;:::o;26247:::-;26413:4;26451:2;26440:9;26436:18;26428:26;;26500:9;26494:4;26490:20;26486:1;26475:9;26471:17;26464:47;26528:131;26654:4;26528:131;:::i;:::-;26520:139;;26247:419;;;:::o;26672:::-;26838:4;26876:2;26865:9;26861:18;26853:26;;26925:9;26919:4;26915:20;26911:1;26900:9;26896:17;26889:47;26953:131;27079:4;26953:131;:::i;:::-;26945:139;;26672:419;;;:::o;27097:::-;27263:4;27301:2;27290:9;27286:18;27278:26;;27350:9;27344:4;27340:20;27336:1;27325:9;27321:17;27314:47;27378:131;27504:4;27378:131;:::i;:::-;27370:139;;27097:419;;;:::o;27522:::-;27688:4;27726:2;27715:9;27711:18;27703:26;;27775:9;27769:4;27765:20;27761:1;27750:9;27746:17;27739:47;27803:131;27929:4;27803:131;:::i;:::-;27795:139;;27522:419;;;:::o;27947:346::-;28102:4;28140:2;28129:9;28125:18;28117:26;;28153:133;28283:1;28272:9;28268:17;28259:6;28153:133;:::i;:::-;27947:346;;;;:::o;28299:222::-;28392:4;28430:2;28419:9;28415:18;28407:26;;28443:71;28511:1;28500:9;28496:17;28487:6;28443:71;:::i;:::-;28299:222;;;;:::o;28527:129::-;28561:6;28588:20;;:::i;:::-;28578:30;;28617:33;28645:4;28637:6;28617:33;:::i;:::-;28527:129;;;:::o;28662:75::-;28695:6;28728:2;28722:9;28712:19;;28662:75;:::o;28743:311::-;28820:4;28910:18;28902:6;28899:30;28896:56;;;28932:18;;:::i;:::-;28896:56;28982:4;28974:6;28970:17;28962:25;;29042:4;29036;29032:15;29024:23;;28743:311;;;:::o;29060:307::-;29121:4;29211:18;29203:6;29200:30;29197:56;;;29233:18;;:::i;:::-;29197:56;29271:29;29293:6;29271:29;:::i;:::-;29263:37;;29355:4;29349;29345:15;29337:23;;29060:307;;;:::o;29373:308::-;29435:4;29525:18;29517:6;29514:30;29511:56;;;29547:18;;:::i;:::-;29511:56;29585:29;29607:6;29585:29;:::i;:::-;29577:37;;29669:4;29663;29659:15;29651:23;;29373:308;;;:::o;29687:163::-;29785:4;29808:3;29800:11;;29838:4;29833:3;29829:14;29821:22;;29687:163;;;:::o;29856:132::-;29923:4;29946:3;29938:11;;29976:4;29971:3;29967:14;29959:22;;29856:132;;;:::o;29994:141::-;30043:4;30066:3;30058:11;;30089:3;30086:1;30079:14;30123:4;30120:1;30110:18;30102:26;;29994:141;;;:::o;30141:145::-;30239:6;30273:5;30267:12;30257:22;;30141:145;;;:::o;30292:114::-;30359:6;30393:5;30387:12;30377:22;;30292:114;;;:::o;30412:98::-;30463:6;30497:5;30491:12;30481:22;;30412:98;;;:::o;30516:99::-;30568:6;30602:5;30596:12;30586:22;;30516:99;;;:::o;30621:144::-;30722:4;30754;30749:3;30745:14;30737:22;;30621:144;;;:::o;30771:113::-;30841:4;30873;30868:3;30864:14;30856:22;;30771:113;;;:::o;30890:215::-;31020:11;31054:6;31049:3;31042:19;31094:4;31089:3;31085:14;31070:29;;30890:215;;;;:::o;31111:184::-;31210:11;31244:6;31239:3;31232:19;31284:4;31279:3;31275:14;31260:29;;31111:184;;;;:::o;31301:168::-;31384:11;31418:6;31413:3;31406:19;31458:4;31453:3;31449:14;31434:29;;31301:168;;;;:::o;31475:169::-;31559:11;31593:6;31588:3;31581:19;31633:4;31628:3;31624:14;31609:29;;31475:169;;;;:::o;31650:148::-;31752:11;31789:3;31774:18;;31650:148;;;;:::o;31804:305::-;31844:3;31863:20;31881:1;31863:20;:::i;:::-;31858:25;;31897:20;31915:1;31897:20;:::i;:::-;31892:25;;32051:1;31983:66;31979:74;31976:1;31973:81;31970:107;;;32057:18;;:::i;:::-;31970:107;32101:1;32098;32094:9;32087:16;;31804:305;;;;:::o;32115:185::-;32155:1;32172:20;32190:1;32172:20;:::i;:::-;32167:25;;32206:20;32224:1;32206:20;:::i;:::-;32201:25;;32245:1;32235:35;;32250:18;;:::i;:::-;32235:35;32292:1;32289;32285:9;32280:14;;32115:185;;;;:::o;32306:191::-;32346:4;32366:20;32384:1;32366:20;:::i;:::-;32361:25;;32400:20;32418:1;32400:20;:::i;:::-;32395:25;;32439:1;32436;32433:8;32430:34;;;32444:18;;:::i;:::-;32430:34;32489:1;32486;32482:9;32474:17;;32306:191;;;;:::o;32503:96::-;32540:7;32569:24;32587:5;32569:24;:::i;:::-;32558:35;;32503:96;;;:::o;32605:90::-;32639:7;32682:5;32675:13;32668:21;32657:32;;32605:90;;;:::o;32701:149::-;32737:7;32777:66;32770:5;32766:78;32755:89;;32701:149;;;:::o;32856:126::-;32893:7;32933:42;32926:5;32922:54;32911:65;;32856:126;;;:::o;32988:77::-;33025:7;33054:5;33043:16;;32988:77;;;:::o;33071:101::-;33107:7;33147:18;33140:5;33136:30;33125:41;;33071:101;;;:::o;33178:154::-;33262:6;33257:3;33252;33239:30;33324:1;33315:6;33310:3;33306:16;33299:27;33178:154;;;:::o;33338:307::-;33406:1;33416:113;33430:6;33427:1;33424:13;33416:113;;;33515:1;33510:3;33506:11;33500:18;33496:1;33491:3;33487:11;33480:39;33452:2;33449:1;33445:10;33440:15;;33416:113;;;33547:6;33544:1;33541:13;33538:101;;;33627:1;33618:6;33613:3;33609:16;33602:27;33538:101;33387:258;33338:307;;;:::o;33651:320::-;33695:6;33732:1;33726:4;33722:12;33712:22;;33779:1;33773:4;33769:12;33800:18;33790:81;;33856:4;33848:6;33844:17;33834:27;;33790:81;33918:2;33910:6;33907:14;33887:18;33884:38;33881:84;;;33937:18;;:::i;:::-;33881:84;33702:269;33651:320;;;:::o;33977:281::-;34060:27;34082:4;34060:27;:::i;:::-;34052:6;34048:40;34190:6;34178:10;34175:22;34154:18;34142:10;34139:34;34136:62;34133:88;;;34201:18;;:::i;:::-;34133:88;34241:10;34237:2;34230:22;34020:238;33977:281;;:::o;34264:233::-;34303:3;34326:24;34344:5;34326:24;:::i;:::-;34317:33;;34372:66;34365:5;34362:77;34359:103;;;34442:18;;:::i;:::-;34359:103;34489:1;34482:5;34478:13;34471:20;;34264:233;;;:::o;34503:176::-;34535:1;34552:20;34570:1;34552:20;:::i;:::-;34547:25;;34586:20;34604:1;34586:20;:::i;:::-;34581:25;;34625:1;34615:35;;34630:18;;:::i;:::-;34615:35;34671:1;34668;34664:9;34659:14;;34503:176;;;;:::o;34685:180::-;34733:77;34730:1;34723:88;34830:4;34827:1;34820:15;34854:4;34851:1;34844:15;34871:180;34919:77;34916:1;34909:88;35016:4;35013:1;35006:15;35040:4;35037:1;35030:15;35057:180;35105:77;35102:1;35095:88;35202:4;35199:1;35192:15;35226:4;35223:1;35216:15;35243:180;35291:77;35288:1;35281:88;35388:4;35385:1;35378:15;35412:4;35409:1;35402:15;35429:180;35477:77;35474:1;35467:88;35574:4;35571:1;35564:15;35598:4;35595:1;35588:15;35615:117;35724:1;35721;35714:12;35738:117;35847:1;35844;35837:12;35861:117;35970:1;35967;35960:12;35984:117;36093:1;36090;36083:12;36107:117;36216:1;36213;36206:12;36230:102;36271:6;36322:2;36318:7;36313:2;36306:5;36302:14;36298:28;36288:38;;36230:102;;;:::o;36338:169::-;36478:21;36474:1;36466:6;36462:14;36455:45;36338:169;:::o;36513:225::-;36653:34;36649:1;36641:6;36637:14;36630:58;36722:8;36717:2;36709:6;36705:15;36698:33;36513:225;:::o;36744:154::-;36884:6;36880:1;36872:6;36868:14;36861:30;36744:154;:::o;36904:167::-;37044:19;37040:1;37032:6;37028:14;37021:43;36904:167;:::o;37077:182::-;37217:34;37213:1;37205:6;37201:14;37194:58;37077:182;:::o;37265:234::-;37405:34;37401:1;37393:6;37389:14;37382:58;37474:17;37469:2;37461:6;37457:15;37450:42;37265:234;:::o;37505:227::-;37645:34;37641:1;37633:6;37629:14;37622:58;37714:10;37709:2;37701:6;37697:15;37690:35;37505:227;:::o;37738:171::-;37878:23;37874:1;37866:6;37862:14;37855:47;37738:171;:::o;37915:122::-;37988:24;38006:5;37988:24;:::i;:::-;37981:5;37978:35;37968:63;;38027:1;38024;38017:12;37968:63;37915:122;:::o;38043:116::-;38113:21;38128:5;38113:21;:::i;:::-;38106:5;38103:32;38093:60;;38149:1;38146;38139:12;38093:60;38043:116;:::o;38165:120::-;38237:23;38254:5;38237:23;:::i;:::-;38230:5;38227:34;38217:62;;38275:1;38272;38265:12;38217:62;38165:120;:::o;38291:122::-;38364:24;38382:5;38364:24;:::i;:::-;38357:5;38354:35;38344:63;;38403:1;38400;38393:12;38344:63;38291:122;:::o

Swarm Source

ipfs://5a307daeb559b33f94d9df76b80e961c611e3798c5759b4f88935b037475f567
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.