ETH Price: $3,136.73 (+3.63%)

Token

Planktoons (PLANKTOONS)
 

Overview

Max Total Supply

4,444 PLANKTOONS

Holders

1,918

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PLANKTOONS
0xa0a8c5a88e74e2e95f0cfdcdcf143c60801844ad
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:
Planktoons

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-02-12
*/

// SPDX-License-Identifier: MIT
// 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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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: contracts/ERC721A2.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;









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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert("ERC721A: unable to get token of owner by index");
    }

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

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

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

    /**
     * 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)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public 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 override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

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

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

    /**
     * @dev 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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(quantity != 0, "ERC721A: quantity must be greater than 0");

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

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

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

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

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

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

// File: @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: contracts/Planktoons/Planktoons.sol


pragma solidity ^0.8.0;




contract Planktoons is ERC721A, Ownable {
    uint256 public constant PRESALE_SUPPLY = 4066;
    uint256 public constant RESERVED_SUPPLY = 33;
    uint256 public constant FREE_SUPPLY = 33;
    uint256 public constant MAX_SUPPLY = 4444;

    uint256 public PRICE = 0.0444 ether;

    uint256 public constant PRESALE_LIMIT = 2;
    uint256 public constant MINT_LIMIT = 4;

    bool public isPublicSaleActive = false;
    bool public isPreSaleActive = false;
    bool _revealed = false;

    string private baseURI = "";
    bytes32 presaleRoot;
    bytes32 freemintRoot;

    address public constant ADDRESS_1 =
        0x49B65ec0Be783CA6BBB7eD65dCB2C0a617Ae423F; //A+T
    address public constant ADDRESS_2 =
        0x5B6785402F3321E43BA4E624afb9aC80A902bd41; //R+C
    address public constant ADDRESS_3 =
        0x66691AD9065EF35AB1c70A9C99fE1d4Da9C9451A; //M

    mapping(address => bool) public freeMints;
    uint256 public freeMintCount = 0;
    uint256 public presaleMintCount = 0;

    constructor() ERC721A("Planktoons", "PLANKTOONS") {}

    //Essential
    function mint(uint256 numberOfTokens) external payable {
        require(msg.sender == tx.origin, "No contracts allowed");
        require(
            numberOfTokens + totalSupply() <= MAX_SUPPLY,
            "Not enough supply"
        );
        require(
            numberMinted(msg.sender) + numberOfTokens <= MINT_LIMIT,
            "Exceeding max mint limit"
        );
        require(isPublicSaleActive, "Public sale not active");
        require(msg.value >= PRICE * numberOfTokens, "Not enough ETH");
        _safeMint(msg.sender, numberOfTokens);
    }

    function presaleMint(uint256 numberOfTokens, bytes32[] memory proof)
        external
        payable
    {
        require(msg.sender == tx.origin, "No contracts allowed");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            verify(leaf, proof, presaleRoot),
            "Address is not in presale list"
        );
        require(
            numberOfTokens + totalSupply() <= MAX_SUPPLY,
            "Not enough supply"
        );
        require(
            numberOfTokens + presaleMintCount <= PRESALE_SUPPLY,
            "Not enough presale supply"
        );
        if (freeMints[msg.sender]) {
            require(
                numberMinted(msg.sender) + numberOfTokens <= PRESALE_LIMIT + 1,
                "Exceeding max presale limit"
            );
        } else {
            require(
                numberMinted(msg.sender) + numberOfTokens <= PRESALE_LIMIT,
                "Exceeding max presale limit"
            );
        }
        require(msg.value >= PRICE * numberOfTokens, "Not enough ETH");
        require(isPreSaleActive, "Presale not active");
        presaleMintCount += numberOfTokens;
        _safeMint(msg.sender, numberOfTokens);
    }

    function freeMint(bytes32[] memory proof) external {
        require(msg.sender == tx.origin, "No contracts allowed");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            verify(leaf, proof, freemintRoot),
            "Address is not in free sale list"
        );
        require(1 + totalSupply() <= MAX_SUPPLY, "Not enough supply");
        require(1 + freeMintCount <= FREE_SUPPLY, "Not enough free supply");
        require(
            !freeMints[msg.sender],
            "Address already minted their free mint"
        );
        require(isPreSaleActive, "Presale not active");
        freeMints[msg.sender] = true;
        freeMintCount += 1;
        _safeMint(msg.sender, 1);
    }

    function devMint(uint256 numberOfTokens) external onlyOwner {
        require(
            numberOfTokens + totalSupply() <= MAX_SUPPLY,
            "Not enough supply"
        );
        require(
            numberOfTokens + numberMinted((msg.sender)) <= RESERVED_SUPPLY,
            "Not enough reserved supply"
        );
        _safeMint(msg.sender, numberOfTokens);
    }

    //Essential
    function setBaseURI(string calldata URI) external onlyOwner {
        baseURI = URI;
    }

    function reveal(bool revealed, string calldata _baseURI) public onlyOwner {
        _revealed = revealed;
        baseURI = _baseURI;
    }

    //Essential
    function setPublicSaleStatus() external onlyOwner {
        isPublicSaleActive = !isPublicSaleActive;
    }

    function setPreSaleStatus() external onlyOwner {
        isPreSaleActive = !isPreSaleActive;
    }

    //Essential

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(ADDRESS_1).transfer((balance * 4800) / 10000);
        payable(ADDRESS_2).transfer((balance * 3050) / 10000);
        payable(ADDRESS_3).transfer((balance * 400) / 10000);
        payable(msg.sender).transfer(address(this).balance);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (_revealed) {
            return string(abi.encodePacked(baseURI, Strings.toString(tokenId)));
        } else {
            return string(abi.encodePacked(baseURI));
        }
    }

    function tokensOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

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

    function verify(
        bytes32 leaf,
        bytes32[] memory proof,
        bytes32 root
    ) public pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }
        return computedHash == root;
    }

    function setPreSaleRoot(bytes32 _presaleRoot) external onlyOwner {
        presaleRoot = _presaleRoot;
    }

    function setFreeMintRoot(bytes32 _freemintRoot) external onlyOwner {
        freemintRoot = _freemintRoot;
    }

    function isPresaleListed(bytes32 leaf, bytes32[] memory proof)
        external
        view
        returns (bool)
    {
        return verify(leaf, proof, presaleRoot);
    }

    function isFreeListed(bytes32 leaf, bytes32[] memory proof)
        external
        view
        returns (bool)
    {
        return verify(leaf, proof, freemintRoot);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADDRESS_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMints","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isFreeListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isPresaleListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_freemintRoot","type":"bytes32"}],"name":"setFreeMintRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_presaleRoot","type":"bytes32"}],"name":"setPreSaleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPreSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","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"},{"inputs":[{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052669dbd90940700006008556000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff0219169083151502179055506000600960026101000a81548160ff02191690831515021790555060405180602001604052806000815250600a90805190602001906200008792919062000234565b506000600e556000600f553480156200009f57600080fd5b506040518060400160405280600a81526020017f506c616e6b746f6f6e73000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f504c414e4b544f4f4e530000000000000000000000000000000000000000000081525081600190805190602001906200012492919062000234565b5080600290805190602001906200013d92919062000234565b50505062000160620001546200016660201b60201c565b6200016e60201b60201c565b62000349565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024290620002e4565b90600052602060002090601f016020900481019282620002665760008555620002b2565b82601f106200028157805160ff1916838001178555620002b2565b82800160010185558215620002b2579182015b82811115620002b157825182559160200191906001019062000294565b5b509050620002c19190620002c5565b5090565b5b80821115620002e0576000816000905550600101620002c6565b5090565b60006002820490506001821680620002fd57607f821691505b602082108114156200031457620003136200031a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615a7180620003596000396000f3fe6080604052600436106102c95760003560e01c80637dfed9fe11610175578063b08da342116100dc578063de97536b11610095578063e985e9c51161006f578063e985e9c514610af0578063edc2ac0214610b2d578063f2fde38b14610b58578063fe042d4914610b81576102c9565b8063de97536b14610a7e578063e3e1e8ef14610aa9578063e55f58bb14610ac5576102c9565b8063b08da34214610948578063b7d1919c14610973578063b88d4fde1461099e578063c87b56dd146109c7578063d2f6dfde14610a04578063dc33e68114610a41576102c9565b806395d89b411161012e57806395d89b41146108595780639858cf19146108845780639d044ed3146108af578063a0712d68146108da578063a101ff6d146108f6578063a22cb4651461091f576102c9565b80637dfed9fe146107495780638462151c1461076057806388d15d501461079d57806389aadd49146107c65780638d859f3e146108035780638da5cb5b1461082e576102c9565b806332cb6b0c1161023457806355f804b3116101ed57806370a08231116101c757806370a08231146106a157806370c42575146106de578063715018a61461070757806373138e4f1461071e576102c9565b806355f804b3146105fe5780636352211e146106275780636d41d4fb14610664576102c9565b806332cb6b0c14610516578063375a069a146105415780633ccfd60b1461056a5780633e07ac021461058157806342842e0e146105985780634f6ccce7146105c1576102c9565b806318160ddd1161028657806318160ddd146104045780631aee3f911461042f5780631e84c4131461045a57806323b872dd146104855780632f745c59146104ae57806331a53e9a146104eb576102c9565b806301ffc9a7146102ce578063027752401461030b57806306fdde0314610336578063081812fc14610361578063095ea7b31461039e5780630a02831c146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190613fed565b610baa565b604051610302919061488a565b60405180910390f35b34801561031757600080fd5b50610320610cf4565b60405161032d9190614cc7565b60405180910390f35b34801561034257600080fd5b5061034b610cf9565b60405161035891906148a5565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190614094565b610d8b565b6040516103959190614801565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190613e0c565b610e10565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613f7e565b610f29565b6040516103fb919061488a565b60405180910390f35b34801561041057600080fd5b50610419610fdf565b6040516104269190614cc7565b60405180910390f35b34801561043b57600080fd5b50610444610fe8565b6040516104519190614cc7565b60405180910390f35b34801561046657600080fd5b5061046f610fed565b60405161047c919061488a565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613cf6565b611000565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613e0c565b611010565b6040516104e29190614cc7565b60405180910390f35b3480156104f757600080fd5b50610500611202565b60405161050d9190614cc7565b60405180910390f35b34801561052257600080fd5b5061052b611207565b6040516105389190614cc7565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190614094565b61120d565b005b34801561057657600080fd5b5061057f611344565b005b34801561058d57600080fd5b5061059661156e565b005b3480156105a457600080fd5b506105bf60048036038101906105ba9190613cf6565b611616565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190614094565b611636565b6040516105f59190614cc7565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190614047565b611689565b005b34801561063357600080fd5b5061064e60048036038101906106499190614094565b61171b565b60405161065b9190614801565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613c89565b611731565b604051610698919061488a565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190613c89565b611751565b6040516106d59190614cc7565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190613ef5565b61183a565b005b34801561071357600080fd5b5061071c6118c0565b005b34801561072a57600080fd5b50610733611948565b6040516107409190614cc7565b60405180910390f35b34801561075557600080fd5b5061075e61194e565b005b34801561076c57600080fd5b5061078760048036038101906107829190613c89565b6119f6565b6040516107949190614868565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190613e4c565b611aa4565b005b3480156107d257600080fd5b506107ed60048036038101906107e89190613f22565b611d90565b6040516107fa919061488a565b60405180910390f35b34801561080f57600080fd5b50610818611da7565b6040516108259190614cc7565b60405180910390f35b34801561083a57600080fd5b50610843611dad565b6040516108509190614801565b60405180910390f35b34801561086557600080fd5b5061086e611dd7565b60405161087b91906148a5565b60405180910390f35b34801561089057600080fd5b50610899611e69565b6040516108a69190614cc7565b60405180910390f35b3480156108bb57600080fd5b506108c4611e6e565b6040516108d1919061488a565b60405180910390f35b6108f460048036038101906108ef9190614094565b611e81565b005b34801561090257600080fd5b5061091d60048036038101906109189190613e95565b612049565b005b34801561092b57600080fd5b5061094660048036038101906109419190613dcc565b6120f6565b005b34801561095457600080fd5b5061095d612277565b60405161096a9190614801565b60405180910390f35b34801561097f57600080fd5b5061098861228f565b6040516109959190614cc7565b60405180910390f35b3480156109aa57600080fd5b506109c560048036038101906109c09190613d49565b612295565b005b3480156109d357600080fd5b506109ee60048036038101906109e99190614094565b6122f1565b6040516109fb91906148a5565b60405180910390f35b348015610a1057600080fd5b50610a2b6004803603810190610a269190613f22565b612363565b604051610a38919061488a565b60405180910390f35b348015610a4d57600080fd5b50610a686004803603810190610a639190613c89565b61237a565b604051610a759190614cc7565b60405180910390f35b348015610a8a57600080fd5b50610a9361238c565b604051610aa09190614801565b60405180910390f35b610ac36004803603810190610abe91906140c1565b6123a4565b005b348015610ad157600080fd5b50610ada61270b565b604051610ae79190614cc7565b60405180910390f35b348015610afc57600080fd5b50610b176004803603810190610b129190613cb6565b612711565b604051610b24919061488a565b60405180910390f35b348015610b3957600080fd5b50610b426127a5565b604051610b4f9190614801565b60405180910390f35b348015610b6457600080fd5b50610b7f6004803603810190610b7a9190613c89565b6127bd565b005b348015610b8d57600080fd5b50610ba86004803603810190610ba39190613ef5565b6128b5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c7557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cdd57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ced5750610cec8261293b565b5b9050919050565b600481565b606060018054610d0890614fca565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3490614fca565b8015610d815780601f10610d5657610100808354040283529160200191610d81565b820191906000526020600020905b815481529060010190602001808311610d6457829003601f168201915b5050505050905090565b6000610d96826129a5565b610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90614ca7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e1b8261171b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390614b67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eab6129b2565b73ffffffffffffffffffffffffffffffffffffffff161480610eda5750610ed981610ed46129b2565b612711565b5b610f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1090614a67565b60405180910390fd5b610f248383836129ba565b505050565b60008084905060005b8451811015610fd1576000858281518110610f5057610f4f615162565b5b60200260200101519050808311610f91578281604051602001610f7492919061479a565b604051602081830303815290604052805190602001209250610fbd565b8083604051602001610fa492919061479a565b6040516020818303038152906040528051906020012092505b508080610fc99061502d565b915050610f32565b508281149150509392505050565b60008054905090565b600281565b600960009054906101000a900460ff1681565b61100b838383612a6c565b505050565b600061101b83611751565b821061105c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611053906148c7565b60405180910390fd5b6000611066610fdf565b905060008060005b838110156111c0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461116057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111b257868414156111a95781955050505050506111fc565b83806001019450505b50808060010191505061106e565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390614c47565b60405180910390fd5b92915050565b602181565b61115c81565b6112156129b2565b73ffffffffffffffffffffffffffffffffffffffff16611233611dad565b73ffffffffffffffffffffffffffffffffffffffff1614611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128090614b07565b60405180910390fd5b61115c611294610fdf565b8261129f9190614df5565b11156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906148e7565b60405180910390fd5b60216112eb3361237a565b826112f69190614df5565b1115611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90614ba7565b60405180910390fd5b6113413382612fac565b50565b61134c6129b2565b73ffffffffffffffffffffffffffffffffffffffff1661136a611dad565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b790614b07565b60405180910390fd5b60004790507349b65ec0be783ca6bbb7ed65dcb2c0a617ae423f73ffffffffffffffffffffffffffffffffffffffff166108fc6127106112c0846114049190614e7c565b61140e9190614e4b565b9081150290604051600060405180830381858888f19350505050158015611439573d6000803e3d6000fd5b50735b6785402f3321e43ba4e624afb9ac80a902bd4173ffffffffffffffffffffffffffffffffffffffff166108fc612710610bea846114799190614e7c565b6114839190614e4b565b9081150290604051600060405180830381858888f193505050501580156114ae573d6000803e3d6000fd5b507366691ad9065ef35ab1c70a9c99fe1d4da9c9451a73ffffffffffffffffffffffffffffffffffffffff166108fc612710610190846114ee9190614e7c565b6114f89190614e4b565b9081150290604051600060405180830381858888f19350505050158015611523573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561156a573d6000803e3d6000fd5b5050565b6115766129b2565b73ffffffffffffffffffffffffffffffffffffffff16611594611dad565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190614b07565b60405180910390fd5b600960019054906101000a900460ff1615600960016101000a81548160ff021916908315150217905550565b61163183838360405180602001604052806000815250612295565b505050565b6000611640610fdf565b8210611681576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611678906149a7565b60405180910390fd5b819050919050565b6116916129b2565b73ffffffffffffffffffffffffffffffffffffffff166116af611dad565b73ffffffffffffffffffffffffffffffffffffffff1614611705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fc90614b07565b60405180910390fd5b8181600a91906117169291906139ca565b505050565b600061172682612fca565b600001519050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b990614a87565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118426129b2565b73ffffffffffffffffffffffffffffffffffffffff16611860611dad565b73ffffffffffffffffffffffffffffffffffffffff16146118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad90614b07565b60405180910390fd5b80600c8190555050565b6118c86129b2565b73ffffffffffffffffffffffffffffffffffffffff166118e6611dad565b73ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390614b07565b60405180910390fd5b6119466000613164565b565b610fe281565b6119566129b2565b73ffffffffffffffffffffffffffffffffffffffff16611974611dad565b73ffffffffffffffffffffffffffffffffffffffff16146119ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c190614b07565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b60606000611a0383611751565b905060008167ffffffffffffffff811115611a2157611a20615191565b5b604051908082528060200260200182016040528015611a4f5781602001602082028036833780820191505090505b50905060005b82811015611a9957611a678582611010565b828281518110611a7a57611a79615162565b5b6020026020010181815250508080611a919061502d565b915050611a55565b508092505050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614c27565b60405180910390fd5b600033604051602001611b25919061477f565b604051602081830303815290604052805190602001209050611b4a8183600c54610f29565b611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8090614927565b60405180910390fd5b61115c611b94610fdf565b6001611ba09190614df5565b1115611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd8906148e7565b60405180910390fd5b6021600e546001611bf29190614df5565b1115611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a90614c87565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790614a27565b60405180910390fd5b600960019054906101000a900460ff16611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d06906149e7565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e6000828254611d7a9190614df5565b92505081905550611d8c336001612fac565b5050565b6000611d9f8383600c54610f29565b905092915050565b60085481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611de690614fca565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1290614fca565b8015611e5f5780601f10611e3457610100808354040283529160200191611e5f565b820191906000526020600020905b815481529060010190602001808311611e4257829003601f168201915b5050505050905090565b602181565b600960019054906101000a900460ff1681565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690614c27565b60405180910390fd5b61115c611efa610fdf565b82611f059190614df5565b1115611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d906148e7565b60405180910390fd5b600481611f523361237a565b611f5c9190614df5565b1115611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9490614a47565b60405180910390fd5b600960009054906101000a900460ff16611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe390614ae7565b60405180910390fd5b80600854611ffa9190614e7c565b34101561203c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203390614ac7565b60405180910390fd5b6120463382612fac565b50565b6120516129b2565b73ffffffffffffffffffffffffffffffffffffffff1661206f611dad565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614b07565b60405180910390fd5b82600960026101000a81548160ff0219169083151502179055508181600a91906120f09291906139ca565b50505050565b6120fe6129b2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561216c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216390614b27565b60405180910390fd5b80600660006121796129b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122266129b2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161226b919061488a565b60405180910390a35050565b7349b65ec0be783ca6bbb7ed65dcb2c0a617ae423f81565b600f5481565b6122a0848484612a6c565b6122ac8484848461322a565b6122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e290614b87565b60405180910390fd5b50505050565b6060600960029054906101000a900460ff161561233a57600a612313836133c1565b6040516020016123249291906147dd565b604051602081830303815290604052905061235e565b600a60405160200161234c91906147c6565b60405160208183030381529060405290505b919050565b60006123728383600b54610f29565b905092915050565b600061238582613522565b9050919050565b735b6785402f3321e43ba4e624afb9ac80a902bd4181565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240990614c27565b60405180910390fd5b600033604051602001612425919061477f565b60405160208183030381529060405280519060200120905061244a8183600b54610f29565b612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614987565b60405180910390fd5b61115c612494610fdf565b8461249f9190614df5565b11156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d7906148e7565b60405180910390fd5b610fe2600f54846124f19190614df5565b1115612532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252990614be7565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156125ec57600160026125929190614df5565b8361259c3361237a565b6125a69190614df5565b11156125e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125de90614967565b60405180910390fd5b612644565b6002836125f83361237a565b6126029190614df5565b1115612643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263a90614967565b60405180910390fd5b5b826008546126529190614e7c565b341015612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b90614ac7565b60405180910390fd5b600960019054906101000a900460ff166126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da906149e7565b60405180910390fd5b82600f60008282546126f59190614df5565b925050819055506127063384612fac565b505050565b600e5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7366691ad9065ef35ab1c70a9c99fe1d4da9c9451a81565b6127c56129b2565b73ffffffffffffffffffffffffffffffffffffffff166127e3611dad565b73ffffffffffffffffffffffffffffffffffffffff1614612839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283090614b07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a090614907565b60405180910390fd5b6128b281613164565b50565b6128bd6129b2565b73ffffffffffffffffffffffffffffffffffffffff166128db611dad565b73ffffffffffffffffffffffffffffffffffffffff1614612931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292890614b07565b60405180910390fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612a7782612fca565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612a9e6129b2565b73ffffffffffffffffffffffffffffffffffffffff161480612afa5750612ac36129b2565b73ffffffffffffffffffffffffffffffffffffffff16612ae284610d8b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b165750612b158260000151612b106129b2565b612711565b5b905080612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90614b47565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc190614aa7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c31906149c7565b60405180910390fd5b612c47858585600161360b565b612c5760008484600001516129ba565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f3c57612e9b816129a5565b15612f3b5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fa58585856001613611565b5050505050565b612fc6828260405180602001604052806000815250613617565b5050565b612fd2613a50565b612fdb826129a5565b61301a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301190614947565b60405180910390fd5b60008290505b60008110613123576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461311457809250505061315f565b50808060019003915050613020565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315690614c67565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061324b8473ffffffffffffffffffffffffffffffffffffffff16613629565b156133b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132746129b2565b8786866040518563ffffffff1660e01b8152600401613296949392919061481c565b602060405180830381600087803b1580156132b057600080fd5b505af19250505080156132e157506040513d601f19601f820116820180604052508101906132de919061401a565b60015b613364573d8060008114613311576040519150601f19603f3d011682016040523d82523d6000602084013e613316565b606091505b5060008151141561335c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335390614b87565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133b9565b600190505b949350505050565b60606000821415613409576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061351d565b600082905060005b6000821461343b5780806134249061502d565b915050600a826134349190614e4b565b9150613411565b60008167ffffffffffffffff81111561345757613456615191565b5b6040519080825280601f01601f1916602001820160405280156134895781602001600182028036833780820191505090505b5090505b60008514613516576001826134a29190614ed6565b9150600a856134b191906150a4565b60306134bd9190614df5565b60f81b8183815181106134d3576134d2615162565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561350f9190614e4b565b945061348d565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358a90614a07565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b613624838383600161364c565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b990614bc7565b60405180910390fd5b6000841415613706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136fd90614c07565b60405180910390fd5b613713600086838761360b565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156139ad57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561399857613958600088848861322a565b613997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398e90614b87565b60405180910390fd5b5b818060010192505080806001019150506138e1565b5080600081905550506139c36000868387613611565b5050505050565b8280546139d690614fca565b90600052602060002090601f0160209004810192826139f85760008555613a3f565b82601f10613a1157803560ff1916838001178555613a3f565b82800160010185558215613a3f579182015b82811115613a3e578235825591602001919060010190613a23565b5b509050613a4c9190613a8a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613aa3576000816000905550600101613a8b565b5090565b6000613aba613ab584614d07565b614ce2565b90508083825260208201905082856020860282011115613add57613adc6151ca565b5b60005b85811015613b0d5781613af38882613bb1565b845260208401935060208301925050600181019050613ae0565b5050509392505050565b6000613b2a613b2584614d33565b614ce2565b905082815260208101848484011115613b4657613b456151cf565b5b613b51848285614f88565b509392505050565b600081359050613b68816159c8565b92915050565b600082601f830112613b8357613b826151c5565b5b8135613b93848260208601613aa7565b91505092915050565b600081359050613bab816159df565b92915050565b600081359050613bc0816159f6565b92915050565b600081359050613bd581615a0d565b92915050565b600081519050613bea81615a0d565b92915050565b600082601f830112613c0557613c046151c5565b5b8135613c15848260208601613b17565b91505092915050565b60008083601f840112613c3457613c336151c5565b5b8235905067ffffffffffffffff811115613c5157613c506151c0565b5b602083019150836001820283011115613c6d57613c6c6151ca565b5b9250929050565b600081359050613c8381615a24565b92915050565b600060208284031215613c9f57613c9e6151d9565b5b6000613cad84828501613b59565b91505092915050565b60008060408385031215613ccd57613ccc6151d9565b5b6000613cdb85828601613b59565b9250506020613cec85828601613b59565b9150509250929050565b600080600060608486031215613d0f57613d0e6151d9565b5b6000613d1d86828701613b59565b9350506020613d2e86828701613b59565b9250506040613d3f86828701613c74565b9150509250925092565b60008060008060808587031215613d6357613d626151d9565b5b6000613d7187828801613b59565b9450506020613d8287828801613b59565b9350506040613d9387828801613c74565b925050606085013567ffffffffffffffff811115613db457613db36151d4565b5b613dc087828801613bf0565b91505092959194509250565b60008060408385031215613de357613de26151d9565b5b6000613df185828601613b59565b9250506020613e0285828601613b9c565b9150509250929050565b60008060408385031215613e2357613e226151d9565b5b6000613e3185828601613b59565b9250506020613e4285828601613c74565b9150509250929050565b600060208284031215613e6257613e616151d9565b5b600082013567ffffffffffffffff811115613e8057613e7f6151d4565b5b613e8c84828501613b6e565b91505092915050565b600080600060408486031215613eae57613ead6151d9565b5b6000613ebc86828701613b9c565b935050602084013567ffffffffffffffff811115613edd57613edc6151d4565b5b613ee986828701613c1e565b92509250509250925092565b600060208284031215613f0b57613f0a6151d9565b5b6000613f1984828501613bb1565b91505092915050565b60008060408385031215613f3957613f386151d9565b5b6000613f4785828601613bb1565b925050602083013567ffffffffffffffff811115613f6857613f676151d4565b5b613f7485828601613b6e565b9150509250929050565b600080600060608486031215613f9757613f966151d9565b5b6000613fa586828701613bb1565b935050602084013567ffffffffffffffff811115613fc657613fc56151d4565b5b613fd286828701613b6e565b9250506040613fe386828701613bb1565b9150509250925092565b600060208284031215614003576140026151d9565b5b600061401184828501613bc6565b91505092915050565b6000602082840312156140305761402f6151d9565b5b600061403e84828501613bdb565b91505092915050565b6000806020838503121561405e5761405d6151d9565b5b600083013567ffffffffffffffff81111561407c5761407b6151d4565b5b61408885828601613c1e565b92509250509250929050565b6000602082840312156140aa576140a96151d9565b5b60006140b884828501613c74565b91505092915050565b600080604083850312156140d8576140d76151d9565b5b60006140e685828601613c74565b925050602083013567ffffffffffffffff811115614107576141066151d4565b5b61411385828601613b6e565b9150509250929050565b60006141298383614761565b60208301905092915050565b61413e81614f0a565b82525050565b61415561415082614f0a565b615076565b82525050565b600061416682614d89565b6141708185614db7565b935061417b83614d64565b8060005b838110156141ac578151614193888261411d565b975061419e83614daa565b92505060018101905061417f565b5085935050505092915050565b6141c281614f1c565b82525050565b6141d96141d482614f28565b615088565b82525050565b60006141ea82614d94565b6141f48185614dc8565b9350614204818560208601614f97565b61420d816151de565b840191505092915050565b600061422382614d9f565b61422d8185614dd9565b935061423d818560208601614f97565b614246816151de565b840191505092915050565b600061425c82614d9f565b6142668185614dea565b9350614276818560208601614f97565b80840191505092915050565b6000815461428f81614fca565b6142998186614dea565b945060018216600081146142b457600181146142c5576142f8565b60ff198316865281860193506142f8565b6142ce85614d74565b60005b838110156142f0578154818901526001820191506020810190506142d1565b838801955050505b50505092915050565b600061430e602283614dd9565b9150614319826151fc565b604082019050919050565b6000614331601183614dd9565b915061433c8261524b565b602082019050919050565b6000614354602683614dd9565b915061435f82615274565b604082019050919050565b6000614377602083614dd9565b9150614382826152c3565b602082019050919050565b600061439a602a83614dd9565b91506143a5826152ec565b604082019050919050565b60006143bd601b83614dd9565b91506143c88261533b565b602082019050919050565b60006143e0601e83614dd9565b91506143eb82615364565b602082019050919050565b6000614403602383614dd9565b915061440e8261538d565b604082019050919050565b6000614426602583614dd9565b9150614431826153dc565b604082019050919050565b6000614449601283614dd9565b91506144548261542b565b602082019050919050565b600061446c603183614dd9565b915061447782615454565b604082019050919050565b600061448f602683614dd9565b915061449a826154a3565b604082019050919050565b60006144b2601883614dd9565b91506144bd826154f2565b602082019050919050565b60006144d5603983614dd9565b91506144e08261551b565b604082019050919050565b60006144f8602b83614dd9565b91506145038261556a565b604082019050919050565b600061451b602683614dd9565b9150614526826155b9565b604082019050919050565b600061453e600e83614dd9565b915061454982615608565b602082019050919050565b6000614561601683614dd9565b915061456c82615631565b602082019050919050565b6000614584602083614dd9565b915061458f8261565a565b602082019050919050565b60006145a7601a83614dd9565b91506145b282615683565b602082019050919050565b60006145ca603283614dd9565b91506145d5826156ac565b604082019050919050565b60006145ed602283614dd9565b91506145f8826156fb565b604082019050919050565b6000614610603383614dd9565b915061461b8261574a565b604082019050919050565b6000614633601a83614dd9565b915061463e82615799565b602082019050919050565b6000614656602183614dd9565b9150614661826157c2565b604082019050919050565b6000614679601983614dd9565b915061468482615811565b602082019050919050565b600061469c602883614dd9565b91506146a78261583a565b604082019050919050565b60006146bf601483614dd9565b91506146ca82615889565b602082019050919050565b60006146e2602e83614dd9565b91506146ed826158b2565b604082019050919050565b6000614705602f83614dd9565b915061471082615901565b604082019050919050565b6000614728601683614dd9565b915061473382615950565b602082019050919050565b600061474b602d83614dd9565b915061475682615979565b604082019050919050565b61476a81614f7e565b82525050565b61477981614f7e565b82525050565b600061478b8284614144565b60148201915081905092915050565b60006147a682856141c8565b6020820191506147b682846141c8565b6020820191508190509392505050565b60006147d28284614282565b915081905092915050565b60006147e98285614282565b91506147f58284614251565b91508190509392505050565b60006020820190506148166000830184614135565b92915050565b60006080820190506148316000830187614135565b61483e6020830186614135565b61484b6040830185614770565b818103606083015261485d81846141df565b905095945050505050565b60006020820190508181036000830152614882818461415b565b905092915050565b600060208201905061489f60008301846141b9565b92915050565b600060208201905081810360008301526148bf8184614218565b905092915050565b600060208201905081810360008301526148e081614301565b9050919050565b6000602082019050818103600083015261490081614324565b9050919050565b6000602082019050818103600083015261492081614347565b9050919050565b600060208201905081810360008301526149408161436a565b9050919050565b600060208201905081810360008301526149608161438d565b9050919050565b60006020820190508181036000830152614980816143b0565b9050919050565b600060208201905081810360008301526149a0816143d3565b9050919050565b600060208201905081810360008301526149c0816143f6565b9050919050565b600060208201905081810360008301526149e081614419565b9050919050565b60006020820190508181036000830152614a008161443c565b9050919050565b60006020820190508181036000830152614a208161445f565b9050919050565b60006020820190508181036000830152614a4081614482565b9050919050565b60006020820190508181036000830152614a60816144a5565b9050919050565b60006020820190508181036000830152614a80816144c8565b9050919050565b60006020820190508181036000830152614aa0816144eb565b9050919050565b60006020820190508181036000830152614ac08161450e565b9050919050565b60006020820190508181036000830152614ae081614531565b9050919050565b60006020820190508181036000830152614b0081614554565b9050919050565b60006020820190508181036000830152614b2081614577565b9050919050565b60006020820190508181036000830152614b408161459a565b9050919050565b60006020820190508181036000830152614b60816145bd565b9050919050565b60006020820190508181036000830152614b80816145e0565b9050919050565b60006020820190508181036000830152614ba081614603565b9050919050565b60006020820190508181036000830152614bc081614626565b9050919050565b60006020820190508181036000830152614be081614649565b9050919050565b60006020820190508181036000830152614c008161466c565b9050919050565b60006020820190508181036000830152614c208161468f565b9050919050565b60006020820190508181036000830152614c40816146b2565b9050919050565b60006020820190508181036000830152614c60816146d5565b9050919050565b60006020820190508181036000830152614c80816146f8565b9050919050565b60006020820190508181036000830152614ca08161471b565b9050919050565b60006020820190508181036000830152614cc08161473e565b9050919050565b6000602082019050614cdc6000830184614770565b92915050565b6000614cec614cfd565b9050614cf88282614ffc565b919050565b6000604051905090565b600067ffffffffffffffff821115614d2257614d21615191565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d4e57614d4d615191565b5b614d57826151de565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e0082614f7e565b9150614e0b83614f7e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e4057614e3f6150d5565b5b828201905092915050565b6000614e5682614f7e565b9150614e6183614f7e565b925082614e7157614e70615104565b5b828204905092915050565b6000614e8782614f7e565b9150614e9283614f7e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ecb57614eca6150d5565b5b828202905092915050565b6000614ee182614f7e565b9150614eec83614f7e565b925082821015614eff57614efe6150d5565b5b828203905092915050565b6000614f1582614f5e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614fb5578082015181840152602081019050614f9a565b83811115614fc4576000848401525b50505050565b60006002820490506001821680614fe257607f821691505b60208210811415614ff657614ff5615133565b5b50919050565b615005826151de565b810181811067ffffffffffffffff8211171561502457615023615191565b5b80604052505050565b600061503882614f7e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561506b5761506a6150d5565b5b600182019050919050565b600061508182615092565b9050919050565b6000819050919050565b600061509d826151ef565b9050919050565b60006150af82614f7e565b91506150ba83614f7e565b9250826150ca576150c9615104565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206973206e6f7420696e20667265652073616c65206c697374600082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f457863656564696e67206d61782070726573616c65206c696d69740000000000600082015250565b7f41646472657373206973206e6f7420696e2070726573616c65206c6973740000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f4164647265737320616c7265616479206d696e7465642074686569722066726560008201527f65206d696e740000000000000000000000000000000000000000000000000000602082015250565b7f457863656564696e67206d6178206d696e74206c696d69740000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f5075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e6f7420656e6f75676820726573657276656420737570706c79000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682070726573616c6520737570706c7900000000000000600082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4e6f20636f6e74726163747320616c6c6f776564000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206672656520737570706c7900000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6159d181614f0a565b81146159dc57600080fd5b50565b6159e881614f1c565b81146159f357600080fd5b50565b6159ff81614f28565b8114615a0a57600080fd5b50565b615a1681614f32565b8114615a2157600080fd5b50565b615a2d81614f7e565b8114615a3857600080fd5b5056fea2646970667358221220ce86b5904316dc5b6f466a1f2b9c6c5572ff91404e94bad0194807ef95fce26764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80637dfed9fe11610175578063b08da342116100dc578063de97536b11610095578063e985e9c51161006f578063e985e9c514610af0578063edc2ac0214610b2d578063f2fde38b14610b58578063fe042d4914610b81576102c9565b8063de97536b14610a7e578063e3e1e8ef14610aa9578063e55f58bb14610ac5576102c9565b8063b08da34214610948578063b7d1919c14610973578063b88d4fde1461099e578063c87b56dd146109c7578063d2f6dfde14610a04578063dc33e68114610a41576102c9565b806395d89b411161012e57806395d89b41146108595780639858cf19146108845780639d044ed3146108af578063a0712d68146108da578063a101ff6d146108f6578063a22cb4651461091f576102c9565b80637dfed9fe146107495780638462151c1461076057806388d15d501461079d57806389aadd49146107c65780638d859f3e146108035780638da5cb5b1461082e576102c9565b806332cb6b0c1161023457806355f804b3116101ed57806370a08231116101c757806370a08231146106a157806370c42575146106de578063715018a61461070757806373138e4f1461071e576102c9565b806355f804b3146105fe5780636352211e146106275780636d41d4fb14610664576102c9565b806332cb6b0c14610516578063375a069a146105415780633ccfd60b1461056a5780633e07ac021461058157806342842e0e146105985780634f6ccce7146105c1576102c9565b806318160ddd1161028657806318160ddd146104045780631aee3f911461042f5780631e84c4131461045a57806323b872dd146104855780632f745c59146104ae57806331a53e9a146104eb576102c9565b806301ffc9a7146102ce578063027752401461030b57806306fdde0314610336578063081812fc14610361578063095ea7b31461039e5780630a02831c146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190613fed565b610baa565b604051610302919061488a565b60405180910390f35b34801561031757600080fd5b50610320610cf4565b60405161032d9190614cc7565b60405180910390f35b34801561034257600080fd5b5061034b610cf9565b60405161035891906148a5565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190614094565b610d8b565b6040516103959190614801565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190613e0c565b610e10565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613f7e565b610f29565b6040516103fb919061488a565b60405180910390f35b34801561041057600080fd5b50610419610fdf565b6040516104269190614cc7565b60405180910390f35b34801561043b57600080fd5b50610444610fe8565b6040516104519190614cc7565b60405180910390f35b34801561046657600080fd5b5061046f610fed565b60405161047c919061488a565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613cf6565b611000565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613e0c565b611010565b6040516104e29190614cc7565b60405180910390f35b3480156104f757600080fd5b50610500611202565b60405161050d9190614cc7565b60405180910390f35b34801561052257600080fd5b5061052b611207565b6040516105389190614cc7565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190614094565b61120d565b005b34801561057657600080fd5b5061057f611344565b005b34801561058d57600080fd5b5061059661156e565b005b3480156105a457600080fd5b506105bf60048036038101906105ba9190613cf6565b611616565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190614094565b611636565b6040516105f59190614cc7565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190614047565b611689565b005b34801561063357600080fd5b5061064e60048036038101906106499190614094565b61171b565b60405161065b9190614801565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613c89565b611731565b604051610698919061488a565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190613c89565b611751565b6040516106d59190614cc7565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190613ef5565b61183a565b005b34801561071357600080fd5b5061071c6118c0565b005b34801561072a57600080fd5b50610733611948565b6040516107409190614cc7565b60405180910390f35b34801561075557600080fd5b5061075e61194e565b005b34801561076c57600080fd5b5061078760048036038101906107829190613c89565b6119f6565b6040516107949190614868565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190613e4c565b611aa4565b005b3480156107d257600080fd5b506107ed60048036038101906107e89190613f22565b611d90565b6040516107fa919061488a565b60405180910390f35b34801561080f57600080fd5b50610818611da7565b6040516108259190614cc7565b60405180910390f35b34801561083a57600080fd5b50610843611dad565b6040516108509190614801565b60405180910390f35b34801561086557600080fd5b5061086e611dd7565b60405161087b91906148a5565b60405180910390f35b34801561089057600080fd5b50610899611e69565b6040516108a69190614cc7565b60405180910390f35b3480156108bb57600080fd5b506108c4611e6e565b6040516108d1919061488a565b60405180910390f35b6108f460048036038101906108ef9190614094565b611e81565b005b34801561090257600080fd5b5061091d60048036038101906109189190613e95565b612049565b005b34801561092b57600080fd5b5061094660048036038101906109419190613dcc565b6120f6565b005b34801561095457600080fd5b5061095d612277565b60405161096a9190614801565b60405180910390f35b34801561097f57600080fd5b5061098861228f565b6040516109959190614cc7565b60405180910390f35b3480156109aa57600080fd5b506109c560048036038101906109c09190613d49565b612295565b005b3480156109d357600080fd5b506109ee60048036038101906109e99190614094565b6122f1565b6040516109fb91906148a5565b60405180910390f35b348015610a1057600080fd5b50610a2b6004803603810190610a269190613f22565b612363565b604051610a38919061488a565b60405180910390f35b348015610a4d57600080fd5b50610a686004803603810190610a639190613c89565b61237a565b604051610a759190614cc7565b60405180910390f35b348015610a8a57600080fd5b50610a9361238c565b604051610aa09190614801565b60405180910390f35b610ac36004803603810190610abe91906140c1565b6123a4565b005b348015610ad157600080fd5b50610ada61270b565b604051610ae79190614cc7565b60405180910390f35b348015610afc57600080fd5b50610b176004803603810190610b129190613cb6565b612711565b604051610b24919061488a565b60405180910390f35b348015610b3957600080fd5b50610b426127a5565b604051610b4f9190614801565b60405180910390f35b348015610b6457600080fd5b50610b7f6004803603810190610b7a9190613c89565b6127bd565b005b348015610b8d57600080fd5b50610ba86004803603810190610ba39190613ef5565b6128b5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c7557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cdd57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ced5750610cec8261293b565b5b9050919050565b600481565b606060018054610d0890614fca565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3490614fca565b8015610d815780601f10610d5657610100808354040283529160200191610d81565b820191906000526020600020905b815481529060010190602001808311610d6457829003601f168201915b5050505050905090565b6000610d96826129a5565b610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90614ca7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e1b8261171b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390614b67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eab6129b2565b73ffffffffffffffffffffffffffffffffffffffff161480610eda5750610ed981610ed46129b2565b612711565b5b610f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1090614a67565b60405180910390fd5b610f248383836129ba565b505050565b60008084905060005b8451811015610fd1576000858281518110610f5057610f4f615162565b5b60200260200101519050808311610f91578281604051602001610f7492919061479a565b604051602081830303815290604052805190602001209250610fbd565b8083604051602001610fa492919061479a565b6040516020818303038152906040528051906020012092505b508080610fc99061502d565b915050610f32565b508281149150509392505050565b60008054905090565b600281565b600960009054906101000a900460ff1681565b61100b838383612a6c565b505050565b600061101b83611751565b821061105c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611053906148c7565b60405180910390fd5b6000611066610fdf565b905060008060005b838110156111c0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461116057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111b257868414156111a95781955050505050506111fc565b83806001019450505b50808060010191505061106e565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390614c47565b60405180910390fd5b92915050565b602181565b61115c81565b6112156129b2565b73ffffffffffffffffffffffffffffffffffffffff16611233611dad565b73ffffffffffffffffffffffffffffffffffffffff1614611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128090614b07565b60405180910390fd5b61115c611294610fdf565b8261129f9190614df5565b11156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906148e7565b60405180910390fd5b60216112eb3361237a565b826112f69190614df5565b1115611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90614ba7565b60405180910390fd5b6113413382612fac565b50565b61134c6129b2565b73ffffffffffffffffffffffffffffffffffffffff1661136a611dad565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b790614b07565b60405180910390fd5b60004790507349b65ec0be783ca6bbb7ed65dcb2c0a617ae423f73ffffffffffffffffffffffffffffffffffffffff166108fc6127106112c0846114049190614e7c565b61140e9190614e4b565b9081150290604051600060405180830381858888f19350505050158015611439573d6000803e3d6000fd5b50735b6785402f3321e43ba4e624afb9ac80a902bd4173ffffffffffffffffffffffffffffffffffffffff166108fc612710610bea846114799190614e7c565b6114839190614e4b565b9081150290604051600060405180830381858888f193505050501580156114ae573d6000803e3d6000fd5b507366691ad9065ef35ab1c70a9c99fe1d4da9c9451a73ffffffffffffffffffffffffffffffffffffffff166108fc612710610190846114ee9190614e7c565b6114f89190614e4b565b9081150290604051600060405180830381858888f19350505050158015611523573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561156a573d6000803e3d6000fd5b5050565b6115766129b2565b73ffffffffffffffffffffffffffffffffffffffff16611594611dad565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190614b07565b60405180910390fd5b600960019054906101000a900460ff1615600960016101000a81548160ff021916908315150217905550565b61163183838360405180602001604052806000815250612295565b505050565b6000611640610fdf565b8210611681576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611678906149a7565b60405180910390fd5b819050919050565b6116916129b2565b73ffffffffffffffffffffffffffffffffffffffff166116af611dad565b73ffffffffffffffffffffffffffffffffffffffff1614611705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fc90614b07565b60405180910390fd5b8181600a91906117169291906139ca565b505050565b600061172682612fca565b600001519050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b990614a87565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118426129b2565b73ffffffffffffffffffffffffffffffffffffffff16611860611dad565b73ffffffffffffffffffffffffffffffffffffffff16146118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad90614b07565b60405180910390fd5b80600c8190555050565b6118c86129b2565b73ffffffffffffffffffffffffffffffffffffffff166118e6611dad565b73ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390614b07565b60405180910390fd5b6119466000613164565b565b610fe281565b6119566129b2565b73ffffffffffffffffffffffffffffffffffffffff16611974611dad565b73ffffffffffffffffffffffffffffffffffffffff16146119ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c190614b07565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b60606000611a0383611751565b905060008167ffffffffffffffff811115611a2157611a20615191565b5b604051908082528060200260200182016040528015611a4f5781602001602082028036833780820191505090505b50905060005b82811015611a9957611a678582611010565b828281518110611a7a57611a79615162565b5b6020026020010181815250508080611a919061502d565b915050611a55565b508092505050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614c27565b60405180910390fd5b600033604051602001611b25919061477f565b604051602081830303815290604052805190602001209050611b4a8183600c54610f29565b611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8090614927565b60405180910390fd5b61115c611b94610fdf565b6001611ba09190614df5565b1115611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd8906148e7565b60405180910390fd5b6021600e546001611bf29190614df5565b1115611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a90614c87565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790614a27565b60405180910390fd5b600960019054906101000a900460ff16611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d06906149e7565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e6000828254611d7a9190614df5565b92505081905550611d8c336001612fac565b5050565b6000611d9f8383600c54610f29565b905092915050565b60085481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611de690614fca565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1290614fca565b8015611e5f5780601f10611e3457610100808354040283529160200191611e5f565b820191906000526020600020905b815481529060010190602001808311611e4257829003601f168201915b5050505050905090565b602181565b600960019054906101000a900460ff1681565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690614c27565b60405180910390fd5b61115c611efa610fdf565b82611f059190614df5565b1115611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d906148e7565b60405180910390fd5b600481611f523361237a565b611f5c9190614df5565b1115611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9490614a47565b60405180910390fd5b600960009054906101000a900460ff16611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe390614ae7565b60405180910390fd5b80600854611ffa9190614e7c565b34101561203c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203390614ac7565b60405180910390fd5b6120463382612fac565b50565b6120516129b2565b73ffffffffffffffffffffffffffffffffffffffff1661206f611dad565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614b07565b60405180910390fd5b82600960026101000a81548160ff0219169083151502179055508181600a91906120f09291906139ca565b50505050565b6120fe6129b2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561216c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216390614b27565b60405180910390fd5b80600660006121796129b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122266129b2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161226b919061488a565b60405180910390a35050565b7349b65ec0be783ca6bbb7ed65dcb2c0a617ae423f81565b600f5481565b6122a0848484612a6c565b6122ac8484848461322a565b6122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e290614b87565b60405180910390fd5b50505050565b6060600960029054906101000a900460ff161561233a57600a612313836133c1565b6040516020016123249291906147dd565b604051602081830303815290604052905061235e565b600a60405160200161234c91906147c6565b60405160208183030381529060405290505b919050565b60006123728383600b54610f29565b905092915050565b600061238582613522565b9050919050565b735b6785402f3321e43ba4e624afb9ac80a902bd4181565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240990614c27565b60405180910390fd5b600033604051602001612425919061477f565b60405160208183030381529060405280519060200120905061244a8183600b54610f29565b612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614987565b60405180910390fd5b61115c612494610fdf565b8461249f9190614df5565b11156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d7906148e7565b60405180910390fd5b610fe2600f54846124f19190614df5565b1115612532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252990614be7565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156125ec57600160026125929190614df5565b8361259c3361237a565b6125a69190614df5565b11156125e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125de90614967565b60405180910390fd5b612644565b6002836125f83361237a565b6126029190614df5565b1115612643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263a90614967565b60405180910390fd5b5b826008546126529190614e7c565b341015612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b90614ac7565b60405180910390fd5b600960019054906101000a900460ff166126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da906149e7565b60405180910390fd5b82600f60008282546126f59190614df5565b925050819055506127063384612fac565b505050565b600e5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7366691ad9065ef35ab1c70a9c99fe1d4da9c9451a81565b6127c56129b2565b73ffffffffffffffffffffffffffffffffffffffff166127e3611dad565b73ffffffffffffffffffffffffffffffffffffffff1614612839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283090614b07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a090614907565b60405180910390fd5b6128b281613164565b50565b6128bd6129b2565b73ffffffffffffffffffffffffffffffffffffffff166128db611dad565b73ffffffffffffffffffffffffffffffffffffffff1614612931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292890614b07565b60405180910390fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612a7782612fca565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612a9e6129b2565b73ffffffffffffffffffffffffffffffffffffffff161480612afa5750612ac36129b2565b73ffffffffffffffffffffffffffffffffffffffff16612ae284610d8b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b165750612b158260000151612b106129b2565b612711565b5b905080612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90614b47565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc190614aa7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c31906149c7565b60405180910390fd5b612c47858585600161360b565b612c5760008484600001516129ba565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f3c57612e9b816129a5565b15612f3b5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fa58585856001613611565b5050505050565b612fc6828260405180602001604052806000815250613617565b5050565b612fd2613a50565b612fdb826129a5565b61301a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301190614947565b60405180910390fd5b60008290505b60008110613123576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461311457809250505061315f565b50808060019003915050613020565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315690614c67565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061324b8473ffffffffffffffffffffffffffffffffffffffff16613629565b156133b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132746129b2565b8786866040518563ffffffff1660e01b8152600401613296949392919061481c565b602060405180830381600087803b1580156132b057600080fd5b505af19250505080156132e157506040513d601f19601f820116820180604052508101906132de919061401a565b60015b613364573d8060008114613311576040519150601f19603f3d011682016040523d82523d6000602084013e613316565b606091505b5060008151141561335c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335390614b87565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133b9565b600190505b949350505050565b60606000821415613409576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061351d565b600082905060005b6000821461343b5780806134249061502d565b915050600a826134349190614e4b565b9150613411565b60008167ffffffffffffffff81111561345757613456615191565b5b6040519080825280601f01601f1916602001820160405280156134895781602001600182028036833780820191505090505b5090505b60008514613516576001826134a29190614ed6565b9150600a856134b191906150a4565b60306134bd9190614df5565b60f81b8183815181106134d3576134d2615162565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561350f9190614e4b565b945061348d565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358a90614a07565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b613624838383600161364c565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b990614bc7565b60405180910390fd5b6000841415613706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136fd90614c07565b60405180910390fd5b613713600086838761360b565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156139ad57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561399857613958600088848861322a565b613997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398e90614b87565b60405180910390fd5b5b818060010192505080806001019150506138e1565b5080600081905550506139c36000868387613611565b5050505050565b8280546139d690614fca565b90600052602060002090601f0160209004810192826139f85760008555613a3f565b82601f10613a1157803560ff1916838001178555613a3f565b82800160010185558215613a3f579182015b82811115613a3e578235825591602001919060010190613a23565b5b509050613a4c9190613a8a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613aa3576000816000905550600101613a8b565b5090565b6000613aba613ab584614d07565b614ce2565b90508083825260208201905082856020860282011115613add57613adc6151ca565b5b60005b85811015613b0d5781613af38882613bb1565b845260208401935060208301925050600181019050613ae0565b5050509392505050565b6000613b2a613b2584614d33565b614ce2565b905082815260208101848484011115613b4657613b456151cf565b5b613b51848285614f88565b509392505050565b600081359050613b68816159c8565b92915050565b600082601f830112613b8357613b826151c5565b5b8135613b93848260208601613aa7565b91505092915050565b600081359050613bab816159df565b92915050565b600081359050613bc0816159f6565b92915050565b600081359050613bd581615a0d565b92915050565b600081519050613bea81615a0d565b92915050565b600082601f830112613c0557613c046151c5565b5b8135613c15848260208601613b17565b91505092915050565b60008083601f840112613c3457613c336151c5565b5b8235905067ffffffffffffffff811115613c5157613c506151c0565b5b602083019150836001820283011115613c6d57613c6c6151ca565b5b9250929050565b600081359050613c8381615a24565b92915050565b600060208284031215613c9f57613c9e6151d9565b5b6000613cad84828501613b59565b91505092915050565b60008060408385031215613ccd57613ccc6151d9565b5b6000613cdb85828601613b59565b9250506020613cec85828601613b59565b9150509250929050565b600080600060608486031215613d0f57613d0e6151d9565b5b6000613d1d86828701613b59565b9350506020613d2e86828701613b59565b9250506040613d3f86828701613c74565b9150509250925092565b60008060008060808587031215613d6357613d626151d9565b5b6000613d7187828801613b59565b9450506020613d8287828801613b59565b9350506040613d9387828801613c74565b925050606085013567ffffffffffffffff811115613db457613db36151d4565b5b613dc087828801613bf0565b91505092959194509250565b60008060408385031215613de357613de26151d9565b5b6000613df185828601613b59565b9250506020613e0285828601613b9c565b9150509250929050565b60008060408385031215613e2357613e226151d9565b5b6000613e3185828601613b59565b9250506020613e4285828601613c74565b9150509250929050565b600060208284031215613e6257613e616151d9565b5b600082013567ffffffffffffffff811115613e8057613e7f6151d4565b5b613e8c84828501613b6e565b91505092915050565b600080600060408486031215613eae57613ead6151d9565b5b6000613ebc86828701613b9c565b935050602084013567ffffffffffffffff811115613edd57613edc6151d4565b5b613ee986828701613c1e565b92509250509250925092565b600060208284031215613f0b57613f0a6151d9565b5b6000613f1984828501613bb1565b91505092915050565b60008060408385031215613f3957613f386151d9565b5b6000613f4785828601613bb1565b925050602083013567ffffffffffffffff811115613f6857613f676151d4565b5b613f7485828601613b6e565b9150509250929050565b600080600060608486031215613f9757613f966151d9565b5b6000613fa586828701613bb1565b935050602084013567ffffffffffffffff811115613fc657613fc56151d4565b5b613fd286828701613b6e565b9250506040613fe386828701613bb1565b9150509250925092565b600060208284031215614003576140026151d9565b5b600061401184828501613bc6565b91505092915050565b6000602082840312156140305761402f6151d9565b5b600061403e84828501613bdb565b91505092915050565b6000806020838503121561405e5761405d6151d9565b5b600083013567ffffffffffffffff81111561407c5761407b6151d4565b5b61408885828601613c1e565b92509250509250929050565b6000602082840312156140aa576140a96151d9565b5b60006140b884828501613c74565b91505092915050565b600080604083850312156140d8576140d76151d9565b5b60006140e685828601613c74565b925050602083013567ffffffffffffffff811115614107576141066151d4565b5b61411385828601613b6e565b9150509250929050565b60006141298383614761565b60208301905092915050565b61413e81614f0a565b82525050565b61415561415082614f0a565b615076565b82525050565b600061416682614d89565b6141708185614db7565b935061417b83614d64565b8060005b838110156141ac578151614193888261411d565b975061419e83614daa565b92505060018101905061417f565b5085935050505092915050565b6141c281614f1c565b82525050565b6141d96141d482614f28565b615088565b82525050565b60006141ea82614d94565b6141f48185614dc8565b9350614204818560208601614f97565b61420d816151de565b840191505092915050565b600061422382614d9f565b61422d8185614dd9565b935061423d818560208601614f97565b614246816151de565b840191505092915050565b600061425c82614d9f565b6142668185614dea565b9350614276818560208601614f97565b80840191505092915050565b6000815461428f81614fca565b6142998186614dea565b945060018216600081146142b457600181146142c5576142f8565b60ff198316865281860193506142f8565b6142ce85614d74565b60005b838110156142f0578154818901526001820191506020810190506142d1565b838801955050505b50505092915050565b600061430e602283614dd9565b9150614319826151fc565b604082019050919050565b6000614331601183614dd9565b915061433c8261524b565b602082019050919050565b6000614354602683614dd9565b915061435f82615274565b604082019050919050565b6000614377602083614dd9565b9150614382826152c3565b602082019050919050565b600061439a602a83614dd9565b91506143a5826152ec565b604082019050919050565b60006143bd601b83614dd9565b91506143c88261533b565b602082019050919050565b60006143e0601e83614dd9565b91506143eb82615364565b602082019050919050565b6000614403602383614dd9565b915061440e8261538d565b604082019050919050565b6000614426602583614dd9565b9150614431826153dc565b604082019050919050565b6000614449601283614dd9565b91506144548261542b565b602082019050919050565b600061446c603183614dd9565b915061447782615454565b604082019050919050565b600061448f602683614dd9565b915061449a826154a3565b604082019050919050565b60006144b2601883614dd9565b91506144bd826154f2565b602082019050919050565b60006144d5603983614dd9565b91506144e08261551b565b604082019050919050565b60006144f8602b83614dd9565b91506145038261556a565b604082019050919050565b600061451b602683614dd9565b9150614526826155b9565b604082019050919050565b600061453e600e83614dd9565b915061454982615608565b602082019050919050565b6000614561601683614dd9565b915061456c82615631565b602082019050919050565b6000614584602083614dd9565b915061458f8261565a565b602082019050919050565b60006145a7601a83614dd9565b91506145b282615683565b602082019050919050565b60006145ca603283614dd9565b91506145d5826156ac565b604082019050919050565b60006145ed602283614dd9565b91506145f8826156fb565b604082019050919050565b6000614610603383614dd9565b915061461b8261574a565b604082019050919050565b6000614633601a83614dd9565b915061463e82615799565b602082019050919050565b6000614656602183614dd9565b9150614661826157c2565b604082019050919050565b6000614679601983614dd9565b915061468482615811565b602082019050919050565b600061469c602883614dd9565b91506146a78261583a565b604082019050919050565b60006146bf601483614dd9565b91506146ca82615889565b602082019050919050565b60006146e2602e83614dd9565b91506146ed826158b2565b604082019050919050565b6000614705602f83614dd9565b915061471082615901565b604082019050919050565b6000614728601683614dd9565b915061473382615950565b602082019050919050565b600061474b602d83614dd9565b915061475682615979565b604082019050919050565b61476a81614f7e565b82525050565b61477981614f7e565b82525050565b600061478b8284614144565b60148201915081905092915050565b60006147a682856141c8565b6020820191506147b682846141c8565b6020820191508190509392505050565b60006147d28284614282565b915081905092915050565b60006147e98285614282565b91506147f58284614251565b91508190509392505050565b60006020820190506148166000830184614135565b92915050565b60006080820190506148316000830187614135565b61483e6020830186614135565b61484b6040830185614770565b818103606083015261485d81846141df565b905095945050505050565b60006020820190508181036000830152614882818461415b565b905092915050565b600060208201905061489f60008301846141b9565b92915050565b600060208201905081810360008301526148bf8184614218565b905092915050565b600060208201905081810360008301526148e081614301565b9050919050565b6000602082019050818103600083015261490081614324565b9050919050565b6000602082019050818103600083015261492081614347565b9050919050565b600060208201905081810360008301526149408161436a565b9050919050565b600060208201905081810360008301526149608161438d565b9050919050565b60006020820190508181036000830152614980816143b0565b9050919050565b600060208201905081810360008301526149a0816143d3565b9050919050565b600060208201905081810360008301526149c0816143f6565b9050919050565b600060208201905081810360008301526149e081614419565b9050919050565b60006020820190508181036000830152614a008161443c565b9050919050565b60006020820190508181036000830152614a208161445f565b9050919050565b60006020820190508181036000830152614a4081614482565b9050919050565b60006020820190508181036000830152614a60816144a5565b9050919050565b60006020820190508181036000830152614a80816144c8565b9050919050565b60006020820190508181036000830152614aa0816144eb565b9050919050565b60006020820190508181036000830152614ac08161450e565b9050919050565b60006020820190508181036000830152614ae081614531565b9050919050565b60006020820190508181036000830152614b0081614554565b9050919050565b60006020820190508181036000830152614b2081614577565b9050919050565b60006020820190508181036000830152614b408161459a565b9050919050565b60006020820190508181036000830152614b60816145bd565b9050919050565b60006020820190508181036000830152614b80816145e0565b9050919050565b60006020820190508181036000830152614ba081614603565b9050919050565b60006020820190508181036000830152614bc081614626565b9050919050565b60006020820190508181036000830152614be081614649565b9050919050565b60006020820190508181036000830152614c008161466c565b9050919050565b60006020820190508181036000830152614c208161468f565b9050919050565b60006020820190508181036000830152614c40816146b2565b9050919050565b60006020820190508181036000830152614c60816146d5565b9050919050565b60006020820190508181036000830152614c80816146f8565b9050919050565b60006020820190508181036000830152614ca08161471b565b9050919050565b60006020820190508181036000830152614cc08161473e565b9050919050565b6000602082019050614cdc6000830184614770565b92915050565b6000614cec614cfd565b9050614cf88282614ffc565b919050565b6000604051905090565b600067ffffffffffffffff821115614d2257614d21615191565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d4e57614d4d615191565b5b614d57826151de565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e0082614f7e565b9150614e0b83614f7e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e4057614e3f6150d5565b5b828201905092915050565b6000614e5682614f7e565b9150614e6183614f7e565b925082614e7157614e70615104565b5b828204905092915050565b6000614e8782614f7e565b9150614e9283614f7e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ecb57614eca6150d5565b5b828202905092915050565b6000614ee182614f7e565b9150614eec83614f7e565b925082821015614eff57614efe6150d5565b5b828203905092915050565b6000614f1582614f5e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614fb5578082015181840152602081019050614f9a565b83811115614fc4576000848401525b50505050565b60006002820490506001821680614fe257607f821691505b60208210811415614ff657614ff5615133565b5b50919050565b615005826151de565b810181811067ffffffffffffffff8211171561502457615023615191565b5b80604052505050565b600061503882614f7e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561506b5761506a6150d5565b5b600182019050919050565b600061508182615092565b9050919050565b6000819050919050565b600061509d826151ef565b9050919050565b60006150af82614f7e565b91506150ba83614f7e565b9250826150ca576150c9615104565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206973206e6f7420696e20667265652073616c65206c697374600082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f457863656564696e67206d61782070726573616c65206c696d69740000000000600082015250565b7f41646472657373206973206e6f7420696e2070726573616c65206c6973740000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f4164647265737320616c7265616479206d696e7465642074686569722066726560008201527f65206d696e740000000000000000000000000000000000000000000000000000602082015250565b7f457863656564696e67206d6178206d696e74206c696d69740000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f5075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e6f7420656e6f75676820726573657276656420737570706c79000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682070726573616c6520737570706c7900000000000000600082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4e6f20636f6e74726163747320616c6c6f776564000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206672656520737570706c7900000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6159d181614f0a565b81146159dc57600080fd5b50565b6159e881614f1c565b81146159f357600080fd5b50565b6159ff81614f28565b8114615a0a57600080fd5b50565b615a1681614f32565b8114615a2157600080fd5b50565b615a2d81614f7e565b8114615a3857600080fd5b5056fea2646970667358221220ce86b5904316dc5b6f466a1f2b9c6c5572ff91404e94bad0194807ef95fce26764736f6c63430008070033

Deployed Bytecode Sourcemap

41568:7124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24950:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41907:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26992:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28688:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28209:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47399:672;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23125:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41859:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41954:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29715:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23830:1048;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41667:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41765:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45267:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46190:350;;;;;;;;;;;;;:::i;:::-;;46063:100;;;;;;;;;;;;;:::i;:::-;;29956:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23302:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45679:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26801:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42461:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25436:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48197:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40668:103;;;;;;;;;;;;;:::i;:::-;;41615:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45946:109;;;;;;;;;;;;;:::i;:::-;;46894:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44511:748;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48509:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41815:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40017:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27161:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41718:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41999:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42669:577;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45779:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29052:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42161:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42548:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30212:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46548:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48319:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47278:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42261:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43254:1249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42509:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29434:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42361:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40926:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48079:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24950:422;25097:4;25154:25;25139:40;;;:11;:40;;;;:105;;;;25211:33;25196:48;;;:11;:48;;;;25139:105;:172;;;;25276:35;25261:50;;;:11;:50;;;;25139:172;:225;;;;25328:36;25352:11;25328:23;:36::i;:::-;25139:225;25119:245;;24950:422;;;:::o;41907:38::-;41944:1;41907:38;:::o;26992:100::-;27046:13;27079:5;27072:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26992:100;:::o;28688:292::-;28792:7;28839:16;28847:7;28839;:16::i;:::-;28817:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28948:15;:24;28964:7;28948:24;;;;;;;;;;;;;;;;;;;;;28941:31;;28688:292;;;:::o;28209:413::-;28282:13;28298:24;28314:7;28298:15;:24::i;:::-;28282:40;;28347:5;28341:11;;:2;:11;;;;28333:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28442:5;28426:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28451:37;28468:5;28475:12;:10;:12::i;:::-;28451:16;:37::i;:::-;28426:62;28404:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;28586:28;28595:2;28599:7;28608:5;28586:8;:28::i;:::-;28271:351;28209:413;;:::o;47399:672::-;47522:4;47539:20;47562:4;47539:27;;47584:9;47579:447;47603:5;:12;47599:1;:16;47579:447;;;47637:20;47660:5;47666:1;47660:8;;;;;;;;:::i;:::-;;;;;;;;47637:31;;47705:12;47689;:28;47685:330;;47802:12;47816;47785:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47753:95;;;;;;47738:110;;47685:330;;;47953:12;47967;47936:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47904:95;;;;;;47889:110;;47685:330;47622:404;47617:3;;;;;:::i;:::-;;;;47579:447;;;;48059:4;48043:12;:20;48036:27;;;47399:672;;;;;:::o;23125:100::-;23178:7;23205:12;;23198:19;;23125:100;:::o;41859:41::-;41899:1;41859:41;:::o;41954:38::-;;;;;;;;;;;;;:::o;29715:170::-;29849:28;29859:4;29865:2;29869:7;29849:9;:28::i;:::-;29715:170;;;:::o;23830:1048::-;23955:7;23996:16;24006:5;23996:9;:16::i;:::-;23988:5;:24;23980:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24062:22;24087:13;:11;:13::i;:::-;24062:38;;24111:19;24141:25;24330:9;24325:466;24345:14;24341:1;:18;24325:466;;;24385:31;24419:11;:14;24431:1;24419:14;;;;;;;;;;;24385:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24482:1;24456:28;;:9;:14;;;:28;;;24452:111;;24529:9;:14;;;24509:34;;24452:111;24606:5;24585:26;;:17;:26;;;24581:195;;;24655:5;24640:11;:20;24636:85;;;24696:1;24689:8;;;;;;;;;24636:85;24743:13;;;;;;;24581:195;24366:425;24361:3;;;;;;;24325:466;;;;24814:56;;;;;;;;;;:::i;:::-;;;;;;;;23830:1048;;;;;:::o;41667:44::-;41709:2;41667:44;:::o;41765:41::-;41802:4;41765:41;:::o;45267:387::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41802:4:::1;45377:13;:11;:13::i;:::-;45360:14;:30;;;;:::i;:::-;:44;;45338:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41709:2;45499:26;45513:10;45499:12;:26::i;:::-;45482:14;:43;;;;:::i;:::-;:62;;45460:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;45609:37;45619:10;45631:14;45609:9;:37::i;:::-;45267:387:::0;:::o;46190:350::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46240:15:::1;46258:21;46240:39;;42206:42;46290:27;;:53;46337:5;46329:4;46319:7;:14;;;;:::i;:::-;46318:24;;;;:::i;:::-;46290:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42306:42;46354:27;;:53;46401:5;46393:4;46383:7;:14;;;;:::i;:::-;46382:24;;;;:::i;:::-;46354:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42406:42;46418:27;;:52;46464:5;46457:3;46447:7;:13;;;;:::i;:::-;46446:23;;;;:::i;:::-;46418:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46489:10;46481:28;;:51;46510:21;46481:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46229:311;46190:350::o:0;46063:100::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46140:15:::1;;;;;;;;;;;46139:16;46121:15;;:34;;;;;;;;;;;;;;;;;;46063:100::o:0;29956:185::-;30094:39;30111:4;30117:2;30121:7;30094:39;;;;;;;;;;;;:16;:39::i;:::-;29956:185;;;:::o;23302:228::-;23405:7;23446:13;:11;:13::i;:::-;23438:5;:21;23430:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23517:5;23510:12;;23302:228;;;:::o;45679:92::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45760:3:::1;;45750:7;:13;;;;;;;:::i;:::-;;45679:92:::0;;:::o;26801:124::-;26865:7;26892:20;26904:7;26892:11;:20::i;:::-;:25;;;26885:32;;26801:124;;;:::o;42461:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;25436:258::-;25500:7;25559:1;25542:19;;:5;:19;;;;25520:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;25658:12;:19;25671:5;25658:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25650:36;;25643:43;;25436:258;;;:::o;48197:114::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48290:13:::1;48275:12;:28;;;;48197:114:::0;:::o;40668:103::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40733:30:::1;40760:1;40733:18;:30::i;:::-;40668:103::o:0;41615:45::-;41656:4;41615:45;:::o;45946:109::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46029:18:::1;;;;;;;;;;;46028:19;46007:18;;:40;;;;;;;;;;;;;;;;;;45946:109::o:0;46894:376::-;46980:16;47014:18;47035:16;47045:5;47035:9;:16::i;:::-;47014:37;;47062:25;47104:10;47090:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47062:53;;47131:9;47126:111;47150:10;47146:1;:14;47126:111;;;47196:29;47216:5;47223:1;47196:19;:29::i;:::-;47182:8;47191:1;47182:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;47162:3;;;;;:::i;:::-;;;;47126:111;;;;47254:8;47247:15;;;;46894:376;;;:::o;44511:748::-;44595:9;44581:23;;:10;:23;;;44573:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44640:12;44682:10;44665:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;44655:39;;;;;;44640:54;;44727:33;44734:4;44740:5;44747:12;;44727:6;:33::i;:::-;44705:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;41802:4;44843:13;:11;:13::i;:::-;44839:1;:17;;;;:::i;:::-;:31;;44831:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41756:2;44915:13;;44911:1;:17;;;;:::i;:::-;:32;;44903:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45004:9;:21;45014:10;45004:21;;;;;;;;;;;;;;;;;;;;;;;;;45003:22;44981:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45110:15;;;;;;;;;;;45102:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;45183:4;45159:9;:21;45169:10;45159:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;45215:1;45198:13;;:18;;;;;;;:::i;:::-;;;;;;;;45227:24;45237:10;45249:1;45227:9;:24::i;:::-;44562:697;44511:748;:::o;48509:180::-;48619:4;48648:33;48655:4;48661:5;48668:12;;48648:6;:33::i;:::-;48641:40;;48509:180;;;;:::o;41815:35::-;;;;:::o;40017:87::-;40063:7;40090:6;;;;;;;;;;;40083:13;;40017:87;:::o;27161:104::-;27217:13;27250:7;27243:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27161:104;:::o;41718:40::-;41756:2;41718:40;:::o;41999:35::-;;;;;;;;;;;;;:::o;42669:577::-;42757:9;42743:23;;:10;:23;;;42735:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41802:4;42841:13;:11;:13::i;:::-;42824:14;:30;;;;:::i;:::-;:44;;42802:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41944:1;42973:14;42946:24;42959:10;42946:12;:24::i;:::-;:41;;;;:::i;:::-;:55;;42924:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;43072:18;;;;;;;;;;;43064:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43157:14;43149:5;;:22;;;;:::i;:::-;43136:9;:35;;43128:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43201:37;43211:10;43223:14;43201:9;:37::i;:::-;42669:577;:::o;45779:142::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45876:8:::1;45864:9;;:20;;;;;;;;;;;;;;;;;;45905:8;;45895:7;:18;;;;;;;:::i;:::-;;45779:142:::0;;;:::o;29052:311::-;29182:12;:10;:12::i;:::-;29170:24;;:8;:24;;;;29162:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29283:8;29238:18;:32;29257:12;:10;:12::i;:::-;29238:32;;;;;;;;;;;;;;;:42;29271:8;29238:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29336:8;29307:48;;29322:12;:10;:12::i;:::-;29307:48;;;29346:8;29307:48;;;;;;:::i;:::-;;;;;;;;29052:311;;:::o;42161:87::-;42206:42;42161:87;:::o;42548:35::-;;;;:::o;30212:355::-;30371:28;30381:4;30387:2;30391:7;30371:9;:28::i;:::-;30432:48;30455:4;30461:2;30465:7;30474:5;30432:22;:48::i;:::-;30410:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;30212:355;;;;:::o;46548:338::-;46666:13;46701:9;;;;;;;;;;;46697:182;;;46758:7;46767:25;46784:7;46767:16;:25::i;:::-;46741:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46727:67;;;;46697:182;46858:7;46841:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;46827:40;;46548:338;;;;:::o;48319:182::-;48432:4;48461:32;48468:4;48474:5;48481:11;;48461:6;:32::i;:::-;48454:39;;48319:182;;;;:::o;47278:113::-;47336:7;47363:20;47377:5;47363:13;:20::i;:::-;47356:27;;47278:113;;;:::o;42261:87::-;42306:42;42261:87;:::o;43254:1249::-;43396:9;43382:23;;:10;:23;;;43374:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;43441:12;43483:10;43466:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;43456:39;;;;;;43441:54;;43528:32;43535:4;43541:5;43548:11;;43528:6;:32::i;:::-;43506:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;41802:4;43668:13;:11;:13::i;:::-;43651:14;:30;;;;:::i;:::-;:44;;43629:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41656:4;43790:16;;43773:14;:33;;;;:::i;:::-;:51;;43751:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;43892:9;:21;43902:10;43892:21;;;;;;;;;;;;;;;;;;;;;;;;;43888:385;;;44017:1;41899;44001:17;;;;:::i;:::-;43983:14;43956:24;43969:10;43956:12;:24::i;:::-;:41;;;;:::i;:::-;:62;;43930:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;43888:385;;;41899:1;44167:14;44140:24;44153:10;44140:12;:24::i;:::-;:41;;;;:::i;:::-;:58;;44114:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;43888:385;44312:14;44304:5;;:22;;;;:::i;:::-;44291:9;:35;;44283:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44364:15;;;;;;;;;;;44356:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;44433:14;44413:16;;:34;;;;;;;:::i;:::-;;;;;;;;44458:37;44468:10;44480:14;44458:9;:37::i;:::-;43363:1140;43254:1249;;:::o;42509:32::-;;;;:::o;29434:214::-;29576:4;29605:18;:25;29624:5;29605:25;;;;;;;;;;;;;;;:35;29631:8;29605:35;;;;;;;;;;;;;;;;;;;;;;;;;29598:42;;29434:214;;;;:::o;42361:87::-;42406:42;42361:87;:::o;40926:201::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41035:1:::1;41015:22;;:8;:22;;;;41007:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41091:28;41110:8;41091:18;:28::i;:::-;40926:201:::0;:::o;48079:110::-;40248:12;:10;:12::i;:::-;40237:23;;:7;:5;:7::i;:::-;:23;;;40229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48169:12:::1;48155:11;:26;;;;48079:110:::0;:::o;11349:157::-;11434:4;11473:25;11458:40;;;:11;:40;;;;11451:47;;11349:157;;;:::o;30822:111::-;30879:4;30913:12;;30903:7;:22;30896:29;;30822:111;;;:::o;21071:98::-;21124:7;21151:10;21144:17;;21071:98;:::o;35985:196::-;36127:2;36100:15;:24;36116:7;36100:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36165:7;36161:2;36145:28;;36154:5;36145:28;;;;;;;;;;;;35985:196;;;:::o;33765:2102::-;33880:35;33918:20;33930:7;33918:11;:20::i;:::-;33880:58;;33951:22;33993:13;:18;;;33977:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;34052:12;:10;:12::i;:::-;34028:36;;:20;34040:7;34028:11;:20::i;:::-;:36;;;33977:87;:154;;;;34081:50;34098:13;:18;;;34118:12;:10;:12::i;:::-;34081:16;:50::i;:::-;33977:154;33951:181;;34167:17;34145:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;34319:4;34297:26;;:13;:18;;;:26;;;34275:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;34422:1;34408:16;;:2;:16;;;;34400:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34479:43;34501:4;34507:2;34511:7;34520:1;34479:21;:43::i;:::-;34587:49;34604:1;34608:7;34617:13;:18;;;34587:8;:49::i;:::-;34962:1;34932:12;:18;34945:4;34932:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35006:1;34978:12;:16;34991:2;34978:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35052:2;35024:11;:20;35036:7;35024:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;35114:15;35069:11;:20;35081:7;35069:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;35382:19;35414:1;35404:7;:11;35382:33;;35475:1;35434:43;;:11;:24;35446:11;35434:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;35430:321;;;35502:20;35510:11;35502:7;:20::i;:::-;35498:238;;;35579:13;:18;;;35547:11;:24;35559:11;35547:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;35662:13;:54;;;35620:11;:24;35632:11;35620:24;;;;;;;;;;;:39;;;:96;;;;;;;;;;;;;;;;;;35498:238;35430:321;34907:855;35798:7;35794:2;35779:27;;35788:4;35779:27;;;;;;;;;;;;35817:42;35838:4;35844:2;35848:7;35857:1;35817:20;:42::i;:::-;33869:1998;;33765:2102;;;:::o;30941:104::-;31010:27;31020:2;31024:8;31010:27;;;;;;;;;;;;:9;:27::i;:::-;30941:104;;:::o;26170:569::-;26258:21;;:::i;:::-;26305:16;26313:7;26305;:16::i;:::-;26297:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26411:12;26426:7;26411:22;;26406:245;26443:1;26435:4;:9;26406:245;;26473:31;26507:11;:17;26519:4;26507:17;;;;;;;;;;;26473:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26573:1;26547:28;;:9;:14;;;:28;;;26543:93;;26607:9;26600:16;;;;;;26543:93;26454:197;26446:6;;;;;;;;26406:245;;;;26674:57;;;;;;;;;;:::i;:::-;;;;;;;;26170:569;;;;:::o;41287:191::-;41361:16;41380:6;;;;;;;;;;;41361:25;;41406:8;41397:6;;:17;;;;;;;;;;;;;;;;;;41461:8;41430:40;;41451:8;41430:40;;;;;;;;;;;;41350:128;41287:191;:::o;36746:985::-;36901:4;36922:15;:2;:13;;;:15::i;:::-;36918:806;;;36991:2;36975:36;;;37034:12;:10;:12::i;:::-;37069:4;37096:7;37126:5;36975:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36954:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37354:1;37337:6;:13;:18;37333:321;;;37380:109;;;;;;;;;;:::i;:::-;;;;;;;;37333:321;37604:6;37598:13;37589:6;37585:2;37581:15;37574:38;36954:715;37224:45;;;37214:55;;;:6;:55;;;;37207:62;;;;;36918:806;37708:4;37701:11;;36746:985;;;;;;;:::o;18633:723::-;18689:13;18919:1;18910:5;:10;18906:53;;;18937:10;;;;;;;;;;;;;;;;;;;;;18906:53;18969:12;18984:5;18969:20;;19000:14;19025:78;19040:1;19032:4;:9;19025:78;;19058:8;;;;;:::i;:::-;;;;19089:2;19081:10;;;;;:::i;:::-;;;19025:78;;;19113:19;19145:6;19135:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19113:39;;19163:154;19179:1;19170:5;:10;19163:154;;19207:1;19197:11;;;;;:::i;:::-;;;19274:2;19266:5;:10;;;;:::i;:::-;19253:2;:24;;;;:::i;:::-;19240:39;;19223:6;19230;19223:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19303:2;19294:11;;;;;:::i;:::-;;;19163:154;;;19341:6;19327:21;;;;;18633:723;;;;:::o;25702:266::-;25763:7;25822:1;25805:19;;:5;:19;;;;25783:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;25927:12;:19;25940:5;25927:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;25919:41;;25912:48;;25702:266;;;:::o;38219:159::-;;;;;:::o;38790:158::-;;;;;:::o;31408:163::-;31531:32;31537:2;31541:8;31551:5;31558:4;31531:5;:32::i;:::-;31408:163;;;:::o;1266:326::-;1326:4;1583:1;1561:7;:19;;;:23;1554:30;;1266:326;;;:::o;31830:1681::-;31969:20;31992:12;;31969:35;;32037:1;32023:16;;:2;:16;;;;32015:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32108:1;32096:8;:13;;32088:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32167:61;32197:1;32201:2;32205:12;32219:8;32167:21;:61::i;:::-;32542:8;32506:12;:16;32519:2;32506:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32607:8;32566:12;:16;32579:2;32566:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32666:2;32633:11;:25;32645:12;32633:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32733:15;32683:11;:25;32695:12;32683:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32766:20;32789:12;32766:35;;32823:9;32818:558;32838:8;32834:1;:12;32818:558;;;32902:12;32898:2;32877:38;;32894:1;32877:38;;;;;;;;;;;;32938:4;32934:392;;;33001:202;33062:1;33095:2;33128:12;33171:5;33001:22;:202::i;:::-;32967:339;;;;;;;;;;;;:::i;:::-;;;;;;;;;32934:392;33346:14;;;;;;;32848:3;;;;;;;32818:558;;;;33407:12;33392;:27;;;;32481:950;33443:60;33472:1;33476:2;33480:12;33494:8;33443:20;:60::i;:::-;31958:1553;31830:1681;;;;:::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:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:139::-;1891:5;1929:6;1916:20;1907:29;;1945:33;1972:5;1945:33;:::i;:::-;1845:139;;;;:::o;1990:137::-;2035:5;2073:6;2060:20;2051:29;;2089:32;2115:5;2089:32;:::i;:::-;1990:137;;;;:::o;2133:141::-;2189:5;2220:6;2214:13;2205:22;;2236:32;2262:5;2236:32;:::i;:::-;2133:141;;;;:::o;2293:338::-;2348:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:122;;2405:79;;:::i;:::-;2364:122;2522:6;2509:20;2547:78;2621:3;2613:6;2606:4;2598:6;2594:17;2547:78;:::i;:::-;2538:87;;2354:277;2293:338;;;;:::o;2651:553::-;2709:8;2719:6;2769:3;2762:4;2754:6;2750:17;2746:27;2736:122;;2777:79;;:::i;:::-;2736:122;2890:6;2877:20;2867:30;;2920:18;2912:6;2909:30;2906:117;;;2942:79;;:::i;:::-;2906:117;3056:4;3048:6;3044:17;3032:29;;3110:3;3102:4;3094:6;3090:17;3080:8;3076:32;3073:41;3070:128;;;3117:79;;:::i;:::-;3070:128;2651:553;;;;;:::o;3210:139::-;3256:5;3294:6;3281:20;3272:29;;3310:33;3337:5;3310:33;:::i;:::-;3210:139;;;;:::o;3355:329::-;3414:6;3463:2;3451:9;3442:7;3438:23;3434:32;3431:119;;;3469:79;;:::i;:::-;3431:119;3589:1;3614:53;3659:7;3650:6;3639:9;3635:22;3614:53;:::i;:::-;3604:63;;3560:117;3355:329;;;;:::o;3690:474::-;3758:6;3766;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;4068:2;4094:53;4139:7;4130:6;4119:9;4115:22;4094:53;:::i;:::-;4084:63;;4039:118;3690:474;;;;;:::o;4170:619::-;4247:6;4255;4263;4312:2;4300:9;4291:7;4287:23;4283:32;4280:119;;;4318:79;;:::i;:::-;4280:119;4438:1;4463:53;4508:7;4499:6;4488:9;4484:22;4463:53;:::i;:::-;4453:63;;4409:117;4565:2;4591:53;4636:7;4627:6;4616:9;4612:22;4591:53;:::i;:::-;4581:63;;4536:118;4693:2;4719:53;4764:7;4755:6;4744:9;4740:22;4719:53;:::i;:::-;4709:63;;4664:118;4170:619;;;;;:::o;4795:943::-;4890:6;4898;4906;4914;4963:3;4951:9;4942:7;4938:23;4934:33;4931:120;;;4970:79;;:::i;:::-;4931:120;5090:1;5115:53;5160:7;5151:6;5140:9;5136:22;5115:53;:::i;:::-;5105:63;;5061:117;5217:2;5243:53;5288:7;5279:6;5268:9;5264:22;5243:53;:::i;:::-;5233:63;;5188:118;5345:2;5371:53;5416:7;5407:6;5396:9;5392:22;5371:53;:::i;:::-;5361:63;;5316:118;5501:2;5490:9;5486:18;5473:32;5532:18;5524:6;5521:30;5518:117;;;5554:79;;:::i;:::-;5518:117;5659:62;5713:7;5704:6;5693:9;5689:22;5659:62;:::i;:::-;5649:72;;5444:287;4795:943;;;;;;;:::o;5744:468::-;5809:6;5817;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:53;6062:7;6053:6;6042:9;6038:22;6017:53;:::i;:::-;6007:63;;5963:117;6119:2;6145:50;6187:7;6178:6;6167:9;6163:22;6145:50;:::i;:::-;6135:60;;6090:115;5744:468;;;;;:::o;6218:474::-;6286:6;6294;6343:2;6331:9;6322:7;6318:23;6314:32;6311:119;;;6349:79;;:::i;:::-;6311:119;6469:1;6494:53;6539:7;6530:6;6519:9;6515:22;6494:53;:::i;:::-;6484:63;;6440:117;6596:2;6622:53;6667:7;6658:6;6647:9;6643:22;6622:53;:::i;:::-;6612:63;;6567:118;6218:474;;;;;:::o;6698:539::-;6782:6;6831:2;6819:9;6810:7;6806:23;6802:32;6799:119;;;6837:79;;:::i;:::-;6799:119;6985:1;6974:9;6970:17;6957:31;7015:18;7007:6;7004:30;7001:117;;;7037:79;;:::i;:::-;7001:117;7142:78;7212:7;7203:6;7192:9;7188:22;7142:78;:::i;:::-;7132:88;;6928:302;6698:539;;;;:::o;7243:668::-;7320:6;7328;7336;7385:2;7373:9;7364:7;7360:23;7356:32;7353:119;;;7391:79;;:::i;:::-;7353:119;7511:1;7536:50;7578:7;7569:6;7558:9;7554:22;7536:50;:::i;:::-;7526:60;;7482:114;7663:2;7652:9;7648:18;7635:32;7694:18;7686:6;7683:30;7680:117;;;7716:79;;:::i;:::-;7680:117;7829:65;7886:7;7877:6;7866:9;7862:22;7829:65;:::i;:::-;7811:83;;;;7606:298;7243:668;;;;;:::o;7917:329::-;7976:6;8025:2;8013:9;8004:7;8000:23;7996:32;7993:119;;;8031:79;;:::i;:::-;7993:119;8151:1;8176:53;8221:7;8212:6;8201:9;8197:22;8176:53;:::i;:::-;8166:63;;8122:117;7917:329;;;;:::o;8252:684::-;8345:6;8353;8402:2;8390:9;8381:7;8377:23;8373:32;8370:119;;;8408:79;;:::i;:::-;8370:119;8528:1;8553:53;8598:7;8589:6;8578:9;8574:22;8553:53;:::i;:::-;8543:63;;8499:117;8683:2;8672:9;8668:18;8655:32;8714:18;8706:6;8703:30;8700:117;;;8736:79;;:::i;:::-;8700:117;8841:78;8911:7;8902:6;8891:9;8887:22;8841:78;:::i;:::-;8831:88;;8626:303;8252:684;;;;;:::o;8942:829::-;9044:6;9052;9060;9109:2;9097:9;9088:7;9084:23;9080:32;9077:119;;;9115:79;;:::i;:::-;9077:119;9235:1;9260:53;9305:7;9296:6;9285:9;9281:22;9260:53;:::i;:::-;9250:63;;9206:117;9390:2;9379:9;9375:18;9362:32;9421:18;9413:6;9410:30;9407:117;;;9443:79;;:::i;:::-;9407:117;9548:78;9618:7;9609:6;9598:9;9594:22;9548:78;:::i;:::-;9538:88;;9333:303;9675:2;9701:53;9746:7;9737:6;9726:9;9722:22;9701:53;:::i;:::-;9691:63;;9646:118;8942:829;;;;;:::o;9777:327::-;9835:6;9884:2;9872:9;9863:7;9859:23;9855:32;9852:119;;;9890:79;;:::i;:::-;9852:119;10010:1;10035:52;10079:7;10070:6;10059:9;10055:22;10035:52;:::i;:::-;10025:62;;9981:116;9777:327;;;;:::o;10110:349::-;10179:6;10228:2;10216:9;10207:7;10203:23;10199:32;10196:119;;;10234:79;;:::i;:::-;10196:119;10354:1;10379:63;10434:7;10425:6;10414:9;10410:22;10379:63;:::i;:::-;10369:73;;10325:127;10110:349;;;;:::o;10465:529::-;10536:6;10544;10593:2;10581:9;10572:7;10568:23;10564:32;10561:119;;;10599:79;;:::i;:::-;10561:119;10747:1;10736:9;10732:17;10719:31;10777:18;10769:6;10766:30;10763:117;;;10799:79;;:::i;:::-;10763:117;10912:65;10969:7;10960:6;10949:9;10945:22;10912:65;:::i;:::-;10894:83;;;;10690:297;10465:529;;;;;:::o;11000:329::-;11059:6;11108:2;11096:9;11087:7;11083:23;11079:32;11076:119;;;11114:79;;:::i;:::-;11076:119;11234:1;11259:53;11304:7;11295:6;11284:9;11280:22;11259:53;:::i;:::-;11249:63;;11205:117;11000:329;;;;:::o;11335:684::-;11428:6;11436;11485:2;11473:9;11464:7;11460:23;11456:32;11453:119;;;11491:79;;:::i;:::-;11453:119;11611:1;11636:53;11681:7;11672:6;11661:9;11657:22;11636:53;:::i;:::-;11626:63;;11582:117;11766:2;11755:9;11751:18;11738:32;11797:18;11789:6;11786:30;11783:117;;;11819:79;;:::i;:::-;11783:117;11924:78;11994:7;11985:6;11974:9;11970:22;11924:78;:::i;:::-;11914:88;;11709:303;11335:684;;;;;:::o;12025:179::-;12094:10;12115:46;12157:3;12149:6;12115:46;:::i;:::-;12193:4;12188:3;12184:14;12170:28;;12025:179;;;;:::o;12210:118::-;12297:24;12315:5;12297:24;:::i;:::-;12292:3;12285:37;12210:118;;:::o;12334:157::-;12439:45;12459:24;12477:5;12459:24;:::i;:::-;12439:45;:::i;:::-;12434:3;12427:58;12334:157;;:::o;12527:732::-;12646:3;12675:54;12723:5;12675:54;:::i;:::-;12745:86;12824:6;12819:3;12745:86;:::i;:::-;12738:93;;12855:56;12905:5;12855:56;:::i;:::-;12934:7;12965:1;12950:284;12975:6;12972:1;12969:13;12950:284;;;13051:6;13045:13;13078:63;13137:3;13122:13;13078:63;:::i;:::-;13071:70;;13164:60;13217:6;13164:60;:::i;:::-;13154:70;;13010:224;12997:1;12994;12990:9;12985:14;;12950:284;;;12954:14;13250:3;13243:10;;12651:608;;;12527:732;;;;:::o;13265:109::-;13346:21;13361:5;13346:21;:::i;:::-;13341:3;13334:34;13265:109;;:::o;13380:157::-;13485:45;13505:24;13523:5;13505:24;:::i;:::-;13485:45;:::i;:::-;13480:3;13473:58;13380:157;;:::o;13543:360::-;13629:3;13657:38;13689:5;13657:38;:::i;:::-;13711:70;13774:6;13769:3;13711:70;:::i;:::-;13704:77;;13790:52;13835:6;13830:3;13823:4;13816:5;13812:16;13790:52;:::i;:::-;13867:29;13889:6;13867:29;:::i;:::-;13862:3;13858:39;13851:46;;13633:270;13543:360;;;;:::o;13909:364::-;13997:3;14025:39;14058:5;14025:39;:::i;:::-;14080:71;14144:6;14139:3;14080:71;:::i;:::-;14073:78;;14160:52;14205:6;14200:3;14193:4;14186:5;14182:16;14160:52;:::i;:::-;14237:29;14259:6;14237:29;:::i;:::-;14232:3;14228:39;14221:46;;14001:272;13909:364;;;;:::o;14279:377::-;14385:3;14413:39;14446:5;14413:39;:::i;:::-;14468:89;14550:6;14545:3;14468:89;:::i;:::-;14461:96;;14566:52;14611:6;14606:3;14599:4;14592:5;14588:16;14566:52;:::i;:::-;14643:6;14638:3;14634:16;14627:23;;14389:267;14279:377;;;;:::o;14686:845::-;14789:3;14826:5;14820:12;14855:36;14881:9;14855:36;:::i;:::-;14907:89;14989:6;14984:3;14907:89;:::i;:::-;14900:96;;15027:1;15016:9;15012:17;15043:1;15038:137;;;;15189:1;15184:341;;;;15005:520;;15038:137;15122:4;15118:9;15107;15103:25;15098:3;15091:38;15158:6;15153:3;15149:16;15142:23;;15038:137;;15184:341;15251:38;15283:5;15251:38;:::i;:::-;15311:1;15325:154;15339:6;15336:1;15333:13;15325:154;;;15413:7;15407:14;15403:1;15398:3;15394:11;15387:35;15463:1;15454:7;15450:15;15439:26;;15361:4;15358:1;15354:12;15349:17;;15325:154;;;15508:6;15503:3;15499:16;15492:23;;15191:334;;15005:520;;14793:738;;14686:845;;;;:::o;15537:366::-;15679:3;15700:67;15764:2;15759:3;15700:67;:::i;:::-;15693:74;;15776:93;15865:3;15776:93;:::i;:::-;15894:2;15889:3;15885:12;15878:19;;15537:366;;;:::o;15909:::-;16051:3;16072:67;16136:2;16131:3;16072:67;:::i;:::-;16065:74;;16148:93;16237:3;16148:93;:::i;:::-;16266:2;16261:3;16257:12;16250:19;;15909:366;;;:::o;16281:::-;16423:3;16444:67;16508:2;16503:3;16444:67;:::i;:::-;16437:74;;16520:93;16609:3;16520:93;:::i;:::-;16638:2;16633:3;16629:12;16622:19;;16281:366;;;:::o;16653:::-;16795:3;16816:67;16880:2;16875:3;16816:67;:::i;:::-;16809:74;;16892:93;16981:3;16892:93;:::i;:::-;17010:2;17005:3;17001:12;16994:19;;16653:366;;;:::o;17025:::-;17167:3;17188:67;17252:2;17247:3;17188:67;:::i;:::-;17181:74;;17264:93;17353:3;17264:93;:::i;:::-;17382:2;17377:3;17373:12;17366:19;;17025:366;;;:::o;17397:::-;17539:3;17560:67;17624:2;17619:3;17560:67;:::i;:::-;17553:74;;17636:93;17725:3;17636:93;:::i;:::-;17754:2;17749:3;17745:12;17738:19;;17397:366;;;:::o;17769:::-;17911:3;17932:67;17996:2;17991:3;17932:67;:::i;:::-;17925:74;;18008:93;18097:3;18008:93;:::i;:::-;18126:2;18121:3;18117:12;18110:19;;17769:366;;;:::o;18141:::-;18283:3;18304:67;18368:2;18363:3;18304:67;:::i;:::-;18297:74;;18380:93;18469:3;18380:93;:::i;:::-;18498:2;18493:3;18489:12;18482:19;;18141:366;;;:::o;18513:::-;18655:3;18676:67;18740:2;18735:3;18676:67;:::i;:::-;18669:74;;18752:93;18841:3;18752:93;:::i;:::-;18870:2;18865:3;18861:12;18854:19;;18513:366;;;:::o;18885:::-;19027:3;19048:67;19112:2;19107:3;19048:67;:::i;:::-;19041:74;;19124:93;19213:3;19124:93;:::i;:::-;19242:2;19237:3;19233:12;19226:19;;18885:366;;;:::o;19257:::-;19399:3;19420:67;19484:2;19479:3;19420:67;:::i;:::-;19413:74;;19496:93;19585:3;19496:93;:::i;:::-;19614:2;19609:3;19605:12;19598:19;;19257:366;;;:::o;19629:::-;19771:3;19792:67;19856:2;19851:3;19792:67;:::i;:::-;19785:74;;19868:93;19957:3;19868:93;:::i;:::-;19986:2;19981:3;19977:12;19970:19;;19629:366;;;:::o;20001:::-;20143:3;20164:67;20228:2;20223:3;20164:67;:::i;:::-;20157:74;;20240:93;20329:3;20240:93;:::i;:::-;20358:2;20353:3;20349:12;20342:19;;20001:366;;;:::o;20373:::-;20515:3;20536:67;20600:2;20595:3;20536:67;:::i;:::-;20529:74;;20612:93;20701:3;20612:93;:::i;:::-;20730:2;20725:3;20721:12;20714:19;;20373:366;;;:::o;20745:::-;20887:3;20908:67;20972:2;20967:3;20908:67;:::i;:::-;20901:74;;20984:93;21073:3;20984:93;:::i;:::-;21102:2;21097:3;21093:12;21086:19;;20745:366;;;:::o;21117:::-;21259:3;21280:67;21344:2;21339:3;21280:67;:::i;:::-;21273:74;;21356:93;21445:3;21356:93;:::i;:::-;21474:2;21469:3;21465:12;21458:19;;21117:366;;;:::o;21489:::-;21631:3;21652:67;21716:2;21711:3;21652:67;:::i;:::-;21645:74;;21728:93;21817:3;21728:93;:::i;:::-;21846:2;21841:3;21837:12;21830:19;;21489:366;;;:::o;21861:::-;22003:3;22024:67;22088:2;22083:3;22024:67;:::i;:::-;22017:74;;22100:93;22189:3;22100:93;:::i;:::-;22218:2;22213:3;22209:12;22202:19;;21861:366;;;:::o;22233:::-;22375:3;22396:67;22460:2;22455:3;22396:67;:::i;:::-;22389:74;;22472:93;22561:3;22472:93;:::i;:::-;22590:2;22585:3;22581:12;22574:19;;22233:366;;;:::o;22605:::-;22747:3;22768:67;22832:2;22827:3;22768:67;:::i;:::-;22761:74;;22844:93;22933:3;22844:93;:::i;:::-;22962:2;22957:3;22953:12;22946:19;;22605:366;;;:::o;22977:::-;23119:3;23140:67;23204:2;23199:3;23140:67;:::i;:::-;23133:74;;23216:93;23305:3;23216:93;:::i;:::-;23334:2;23329:3;23325:12;23318:19;;22977:366;;;:::o;23349:::-;23491:3;23512:67;23576:2;23571:3;23512:67;:::i;:::-;23505:74;;23588:93;23677:3;23588:93;:::i;:::-;23706:2;23701:3;23697:12;23690:19;;23349:366;;;:::o;23721:::-;23863:3;23884:67;23948:2;23943:3;23884:67;:::i;:::-;23877:74;;23960:93;24049:3;23960:93;:::i;:::-;24078:2;24073:3;24069:12;24062:19;;23721:366;;;:::o;24093:::-;24235:3;24256:67;24320:2;24315:3;24256:67;:::i;:::-;24249:74;;24332:93;24421:3;24332:93;:::i;:::-;24450:2;24445:3;24441:12;24434:19;;24093:366;;;:::o;24465:::-;24607:3;24628:67;24692:2;24687:3;24628:67;:::i;:::-;24621:74;;24704:93;24793:3;24704:93;:::i;:::-;24822:2;24817:3;24813:12;24806:19;;24465:366;;;:::o;24837:::-;24979:3;25000:67;25064:2;25059:3;25000:67;:::i;:::-;24993:74;;25076:93;25165:3;25076:93;:::i;:::-;25194:2;25189:3;25185:12;25178:19;;24837:366;;;:::o;25209:::-;25351:3;25372:67;25436:2;25431:3;25372:67;:::i;:::-;25365:74;;25448:93;25537:3;25448:93;:::i;:::-;25566:2;25561:3;25557:12;25550:19;;25209:366;;;:::o;25581:::-;25723:3;25744:67;25808:2;25803:3;25744:67;:::i;:::-;25737:74;;25820:93;25909:3;25820:93;:::i;:::-;25938:2;25933:3;25929:12;25922:19;;25581:366;;;:::o;25953:::-;26095:3;26116:67;26180:2;26175:3;26116:67;:::i;:::-;26109:74;;26192:93;26281:3;26192:93;:::i;:::-;26310:2;26305:3;26301:12;26294:19;;25953:366;;;:::o;26325:::-;26467:3;26488:67;26552:2;26547:3;26488:67;:::i;:::-;26481:74;;26564:93;26653:3;26564:93;:::i;:::-;26682:2;26677:3;26673:12;26666:19;;26325:366;;;:::o;26697:::-;26839:3;26860:67;26924:2;26919:3;26860:67;:::i;:::-;26853:74;;26936:93;27025:3;26936:93;:::i;:::-;27054:2;27049:3;27045:12;27038:19;;26697:366;;;:::o;27069:::-;27211:3;27232:67;27296:2;27291:3;27232:67;:::i;:::-;27225:74;;27308:93;27397:3;27308:93;:::i;:::-;27426:2;27421:3;27417:12;27410:19;;27069:366;;;:::o;27441:108::-;27518:24;27536:5;27518:24;:::i;:::-;27513:3;27506:37;27441:108;;:::o;27555:118::-;27642:24;27660:5;27642:24;:::i;:::-;27637:3;27630:37;27555:118;;:::o;27679:256::-;27791:3;27806:75;27877:3;27868:6;27806:75;:::i;:::-;27906:2;27901:3;27897:12;27890:19;;27926:3;27919:10;;27679:256;;;;:::o;27941:397::-;28081:3;28096:75;28167:3;28158:6;28096:75;:::i;:::-;28196:2;28191:3;28187:12;28180:19;;28209:75;28280:3;28271:6;28209:75;:::i;:::-;28309:2;28304:3;28300:12;28293:19;;28329:3;28322:10;;27941:397;;;;;:::o;28344:269::-;28473:3;28495:92;28583:3;28574:6;28495:92;:::i;:::-;28488:99;;28604:3;28597:10;;28344:269;;;;:::o;28619:429::-;28796:3;28818:92;28906:3;28897:6;28818:92;:::i;:::-;28811:99;;28927:95;29018:3;29009:6;28927:95;:::i;:::-;28920:102;;29039:3;29032:10;;28619:429;;;;;:::o;29054:222::-;29147:4;29185:2;29174:9;29170:18;29162:26;;29198:71;29266:1;29255:9;29251:17;29242:6;29198:71;:::i;:::-;29054:222;;;;:::o;29282:640::-;29477:4;29515:3;29504:9;29500:19;29492:27;;29529:71;29597:1;29586:9;29582:17;29573:6;29529:71;:::i;:::-;29610:72;29678:2;29667:9;29663:18;29654:6;29610:72;:::i;:::-;29692;29760:2;29749:9;29745:18;29736:6;29692:72;:::i;:::-;29811:9;29805:4;29801:20;29796:2;29785:9;29781:18;29774:48;29839:76;29910:4;29901:6;29839:76;:::i;:::-;29831:84;;29282:640;;;;;;;:::o;29928:373::-;30071:4;30109:2;30098:9;30094:18;30086:26;;30158:9;30152:4;30148:20;30144:1;30133:9;30129:17;30122:47;30186:108;30289:4;30280:6;30186:108;:::i;:::-;30178:116;;29928:373;;;;:::o;30307:210::-;30394:4;30432:2;30421:9;30417:18;30409:26;;30445:65;30507:1;30496:9;30492:17;30483:6;30445:65;:::i;:::-;30307:210;;;;:::o;30523:313::-;30636:4;30674:2;30663:9;30659:18;30651:26;;30723:9;30717:4;30713:20;30709:1;30698:9;30694:17;30687:47;30751:78;30824:4;30815:6;30751:78;:::i;:::-;30743:86;;30523:313;;;;:::o;30842:419::-;31008:4;31046:2;31035:9;31031:18;31023:26;;31095:9;31089:4;31085:20;31081:1;31070:9;31066:17;31059:47;31123:131;31249:4;31123:131;:::i;:::-;31115:139;;30842:419;;;:::o;31267:::-;31433:4;31471:2;31460:9;31456:18;31448:26;;31520:9;31514:4;31510:20;31506:1;31495:9;31491:17;31484:47;31548:131;31674:4;31548:131;:::i;:::-;31540:139;;31267:419;;;:::o;31692:::-;31858:4;31896:2;31885:9;31881:18;31873:26;;31945:9;31939:4;31935:20;31931:1;31920:9;31916:17;31909:47;31973:131;32099:4;31973:131;:::i;:::-;31965:139;;31692:419;;;:::o;32117:::-;32283:4;32321:2;32310:9;32306:18;32298:26;;32370:9;32364:4;32360:20;32356:1;32345:9;32341:17;32334:47;32398:131;32524:4;32398:131;:::i;:::-;32390:139;;32117:419;;;:::o;32542:::-;32708:4;32746:2;32735:9;32731:18;32723:26;;32795:9;32789:4;32785:20;32781:1;32770:9;32766:17;32759:47;32823:131;32949:4;32823:131;:::i;:::-;32815:139;;32542:419;;;:::o;32967:::-;33133:4;33171:2;33160:9;33156:18;33148:26;;33220:9;33214:4;33210:20;33206:1;33195:9;33191:17;33184:47;33248:131;33374:4;33248:131;:::i;:::-;33240:139;;32967:419;;;:::o;33392:::-;33558:4;33596:2;33585:9;33581:18;33573:26;;33645:9;33639:4;33635:20;33631:1;33620:9;33616:17;33609:47;33673:131;33799:4;33673:131;:::i;:::-;33665:139;;33392:419;;;:::o;33817:::-;33983:4;34021:2;34010:9;34006:18;33998:26;;34070:9;34064:4;34060:20;34056:1;34045:9;34041:17;34034:47;34098:131;34224:4;34098:131;:::i;:::-;34090:139;;33817:419;;;:::o;34242:::-;34408:4;34446:2;34435:9;34431:18;34423:26;;34495:9;34489:4;34485:20;34481:1;34470:9;34466:17;34459:47;34523:131;34649:4;34523:131;:::i;:::-;34515:139;;34242:419;;;:::o;34667:::-;34833:4;34871:2;34860:9;34856:18;34848:26;;34920:9;34914:4;34910:20;34906:1;34895:9;34891:17;34884:47;34948:131;35074:4;34948:131;:::i;:::-;34940:139;;34667:419;;;:::o;35092:::-;35258:4;35296:2;35285:9;35281:18;35273:26;;35345:9;35339:4;35335:20;35331:1;35320:9;35316:17;35309:47;35373:131;35499:4;35373:131;:::i;:::-;35365:139;;35092:419;;;:::o;35517:::-;35683:4;35721:2;35710:9;35706:18;35698:26;;35770:9;35764:4;35760:20;35756:1;35745:9;35741:17;35734:47;35798:131;35924:4;35798:131;:::i;:::-;35790:139;;35517:419;;;:::o;35942:::-;36108:4;36146:2;36135:9;36131:18;36123:26;;36195:9;36189:4;36185:20;36181:1;36170:9;36166:17;36159:47;36223:131;36349:4;36223:131;:::i;:::-;36215:139;;35942:419;;;:::o;36367:::-;36533:4;36571:2;36560:9;36556:18;36548:26;;36620:9;36614:4;36610:20;36606:1;36595:9;36591:17;36584:47;36648:131;36774:4;36648:131;:::i;:::-;36640:139;;36367:419;;;:::o;36792:::-;36958:4;36996:2;36985:9;36981:18;36973:26;;37045:9;37039:4;37035:20;37031:1;37020:9;37016:17;37009:47;37073:131;37199:4;37073:131;:::i;:::-;37065:139;;36792:419;;;:::o;37217:::-;37383:4;37421:2;37410:9;37406:18;37398:26;;37470:9;37464:4;37460:20;37456:1;37445:9;37441:17;37434:47;37498:131;37624:4;37498:131;:::i;:::-;37490:139;;37217:419;;;:::o;37642:::-;37808:4;37846:2;37835:9;37831:18;37823:26;;37895:9;37889:4;37885:20;37881:1;37870:9;37866:17;37859:47;37923:131;38049:4;37923:131;:::i;:::-;37915:139;;37642:419;;;:::o;38067:::-;38233:4;38271:2;38260:9;38256:18;38248:26;;38320:9;38314:4;38310:20;38306:1;38295:9;38291:17;38284:47;38348:131;38474:4;38348:131;:::i;:::-;38340:139;;38067:419;;;:::o;38492:::-;38658:4;38696:2;38685:9;38681:18;38673:26;;38745:9;38739:4;38735:20;38731:1;38720:9;38716:17;38709:47;38773:131;38899:4;38773:131;:::i;:::-;38765:139;;38492:419;;;:::o;38917:::-;39083:4;39121:2;39110:9;39106:18;39098:26;;39170:9;39164:4;39160:20;39156:1;39145:9;39141:17;39134:47;39198:131;39324:4;39198:131;:::i;:::-;39190:139;;38917:419;;;:::o;39342:::-;39508:4;39546:2;39535:9;39531:18;39523:26;;39595:9;39589:4;39585:20;39581:1;39570:9;39566:17;39559:47;39623:131;39749:4;39623:131;:::i;:::-;39615:139;;39342:419;;;:::o;39767:::-;39933:4;39971:2;39960:9;39956:18;39948:26;;40020:9;40014:4;40010:20;40006:1;39995:9;39991:17;39984:47;40048:131;40174:4;40048:131;:::i;:::-;40040:139;;39767:419;;;:::o;40192:::-;40358:4;40396:2;40385:9;40381:18;40373:26;;40445:9;40439:4;40435:20;40431:1;40420:9;40416:17;40409:47;40473:131;40599:4;40473:131;:::i;:::-;40465:139;;40192:419;;;:::o;40617:::-;40783:4;40821:2;40810:9;40806:18;40798:26;;40870:9;40864:4;40860:20;40856:1;40845:9;40841:17;40834:47;40898:131;41024:4;40898:131;:::i;:::-;40890:139;;40617:419;;;:::o;41042:::-;41208:4;41246:2;41235:9;41231:18;41223:26;;41295:9;41289:4;41285:20;41281:1;41270:9;41266:17;41259:47;41323:131;41449:4;41323:131;:::i;:::-;41315:139;;41042:419;;;:::o;41467:::-;41633:4;41671:2;41660:9;41656:18;41648:26;;41720:9;41714:4;41710:20;41706:1;41695:9;41691:17;41684:47;41748:131;41874:4;41748:131;:::i;:::-;41740:139;;41467:419;;;:::o;41892:::-;42058:4;42096:2;42085:9;42081:18;42073:26;;42145:9;42139:4;42135:20;42131:1;42120:9;42116:17;42109:47;42173:131;42299:4;42173:131;:::i;:::-;42165:139;;41892:419;;;:::o;42317:::-;42483:4;42521:2;42510:9;42506:18;42498:26;;42570:9;42564:4;42560:20;42556:1;42545:9;42541:17;42534:47;42598:131;42724:4;42598:131;:::i;:::-;42590:139;;42317:419;;;:::o;42742:::-;42908:4;42946:2;42935:9;42931:18;42923:26;;42995:9;42989:4;42985:20;42981:1;42970:9;42966:17;42959:47;43023:131;43149:4;43023:131;:::i;:::-;43015:139;;42742:419;;;:::o;43167:::-;43333:4;43371:2;43360:9;43356:18;43348:26;;43420:9;43414:4;43410:20;43406:1;43395:9;43391:17;43384:47;43448:131;43574:4;43448:131;:::i;:::-;43440:139;;43167:419;;;:::o;43592:::-;43758:4;43796:2;43785:9;43781:18;43773:26;;43845:9;43839:4;43835:20;43831:1;43820:9;43816:17;43809:47;43873:131;43999:4;43873:131;:::i;:::-;43865:139;;43592:419;;;:::o;44017:::-;44183:4;44221:2;44210:9;44206:18;44198:26;;44270:9;44264:4;44260:20;44256:1;44245:9;44241:17;44234:47;44298:131;44424:4;44298:131;:::i;:::-;44290:139;;44017:419;;;:::o;44442:222::-;44535:4;44573:2;44562:9;44558:18;44550:26;;44586:71;44654:1;44643:9;44639:17;44630:6;44586:71;:::i;:::-;44442:222;;;;:::o;44670:129::-;44704:6;44731:20;;:::i;:::-;44721:30;;44760:33;44788:4;44780:6;44760:33;:::i;:::-;44670:129;;;:::o;44805:75::-;44838:6;44871:2;44865:9;44855:19;;44805:75;:::o;44886:311::-;44963:4;45053:18;45045:6;45042:30;45039:56;;;45075:18;;:::i;:::-;45039:56;45125:4;45117:6;45113:17;45105:25;;45185:4;45179;45175:15;45167:23;;44886:311;;;:::o;45203:307::-;45264:4;45354:18;45346:6;45343:30;45340:56;;;45376:18;;:::i;:::-;45340:56;45414:29;45436:6;45414:29;:::i;:::-;45406:37;;45498:4;45492;45488:15;45480:23;;45203:307;;;:::o;45516:132::-;45583:4;45606:3;45598:11;;45636:4;45631:3;45627:14;45619:22;;45516:132;;;:::o;45654:141::-;45703:4;45726:3;45718:11;;45749:3;45746:1;45739:14;45783:4;45780:1;45770:18;45762:26;;45654:141;;;:::o;45801:114::-;45868:6;45902:5;45896:12;45886:22;;45801:114;;;:::o;45921:98::-;45972:6;46006:5;46000:12;45990:22;;45921:98;;;:::o;46025:99::-;46077:6;46111:5;46105:12;46095:22;;46025:99;;;:::o;46130:113::-;46200:4;46232;46227:3;46223:14;46215:22;;46130:113;;;:::o;46249:184::-;46348:11;46382:6;46377:3;46370:19;46422:4;46417:3;46413:14;46398:29;;46249:184;;;;:::o;46439:168::-;46522:11;46556:6;46551:3;46544:19;46596:4;46591:3;46587:14;46572:29;;46439:168;;;;:::o;46613:169::-;46697:11;46731:6;46726:3;46719:19;46771:4;46766:3;46762:14;46747:29;;46613:169;;;;:::o;46788:148::-;46890:11;46927:3;46912:18;;46788:148;;;;:::o;46942:305::-;46982:3;47001:20;47019:1;47001:20;:::i;:::-;46996:25;;47035:20;47053:1;47035:20;:::i;:::-;47030:25;;47189:1;47121:66;47117:74;47114:1;47111:81;47108:107;;;47195:18;;:::i;:::-;47108:107;47239:1;47236;47232:9;47225:16;;46942:305;;;;:::o;47253:185::-;47293:1;47310:20;47328:1;47310:20;:::i;:::-;47305:25;;47344:20;47362:1;47344:20;:::i;:::-;47339:25;;47383:1;47373:35;;47388:18;;:::i;:::-;47373:35;47430:1;47427;47423:9;47418:14;;47253:185;;;;:::o;47444:348::-;47484:7;47507:20;47525:1;47507:20;:::i;:::-;47502:25;;47541:20;47559:1;47541:20;:::i;:::-;47536:25;;47729:1;47661:66;47657:74;47654:1;47651:81;47646:1;47639:9;47632:17;47628:105;47625:131;;;47736:18;;:::i;:::-;47625:131;47784:1;47781;47777:9;47766:20;;47444:348;;;;:::o;47798:191::-;47838:4;47858:20;47876:1;47858:20;:::i;:::-;47853:25;;47892:20;47910:1;47892:20;:::i;:::-;47887:25;;47931:1;47928;47925:8;47922:34;;;47936:18;;:::i;:::-;47922:34;47981:1;47978;47974:9;47966:17;;47798:191;;;;:::o;47995:96::-;48032:7;48061:24;48079:5;48061:24;:::i;:::-;48050:35;;47995:96;;;:::o;48097:90::-;48131:7;48174:5;48167:13;48160:21;48149:32;;48097:90;;;:::o;48193:77::-;48230:7;48259:5;48248:16;;48193:77;;;:::o;48276:149::-;48312:7;48352:66;48345:5;48341:78;48330:89;;48276:149;;;:::o;48431:126::-;48468:7;48508:42;48501:5;48497:54;48486:65;;48431:126;;;:::o;48563:77::-;48600:7;48629:5;48618:16;;48563:77;;;:::o;48646:154::-;48730:6;48725:3;48720;48707:30;48792:1;48783:6;48778:3;48774:16;48767:27;48646:154;;;:::o;48806:307::-;48874:1;48884:113;48898:6;48895:1;48892:13;48884:113;;;48983:1;48978:3;48974:11;48968:18;48964:1;48959:3;48955:11;48948:39;48920:2;48917:1;48913:10;48908:15;;48884:113;;;49015:6;49012:1;49009:13;49006:101;;;49095:1;49086:6;49081:3;49077:16;49070:27;49006:101;48855:258;48806:307;;;:::o;49119:320::-;49163:6;49200:1;49194:4;49190:12;49180:22;;49247:1;49241:4;49237:12;49268:18;49258:81;;49324:4;49316:6;49312:17;49302:27;;49258:81;49386:2;49378:6;49375:14;49355:18;49352:38;49349:84;;;49405:18;;:::i;:::-;49349:84;49170:269;49119:320;;;:::o;49445:281::-;49528:27;49550:4;49528:27;:::i;:::-;49520:6;49516:40;49658:6;49646:10;49643:22;49622:18;49610:10;49607:34;49604:62;49601:88;;;49669:18;;:::i;:::-;49601:88;49709:10;49705:2;49698:22;49488:238;49445:281;;:::o;49732:233::-;49771:3;49794:24;49812:5;49794:24;:::i;:::-;49785:33;;49840:66;49833:5;49830:77;49827:103;;;49910:18;;:::i;:::-;49827:103;49957:1;49950:5;49946:13;49939:20;;49732:233;;;:::o;49971:100::-;50010:7;50039:26;50059:5;50039:26;:::i;:::-;50028:37;;49971:100;;;:::o;50077:79::-;50116:7;50145:5;50134:16;;50077:79;;;:::o;50162:94::-;50201:7;50230:20;50244:5;50230:20;:::i;:::-;50219:31;;50162:94;;;:::o;50262:176::-;50294:1;50311:20;50329:1;50311:20;:::i;:::-;50306:25;;50345:20;50363:1;50345:20;:::i;:::-;50340:25;;50384:1;50374:35;;50389:18;;:::i;:::-;50374:35;50430:1;50427;50423:9;50418:14;;50262:176;;;;:::o;50444:180::-;50492:77;50489:1;50482:88;50589:4;50586:1;50579:15;50613:4;50610:1;50603:15;50630:180;50678:77;50675:1;50668:88;50775:4;50772:1;50765:15;50799:4;50796:1;50789:15;50816:180;50864:77;50861:1;50854:88;50961:4;50958:1;50951:15;50985:4;50982:1;50975:15;51002:180;51050:77;51047:1;51040:88;51147:4;51144:1;51137:15;51171:4;51168:1;51161:15;51188:180;51236:77;51233:1;51226:88;51333:4;51330:1;51323:15;51357:4;51354:1;51347:15;51374:117;51483:1;51480;51473:12;51497:117;51606:1;51603;51596:12;51620:117;51729:1;51726;51719:12;51743:117;51852:1;51849;51842:12;51866:117;51975:1;51972;51965:12;51989:117;52098:1;52095;52088:12;52112:102;52153:6;52204:2;52200:7;52195:2;52188:5;52184:14;52180:28;52170:38;;52112:102;;;:::o;52220:94::-;52253:8;52301:5;52297:2;52293:14;52272:35;;52220:94;;;:::o;52320:221::-;52460:34;52456:1;52448:6;52444:14;52437:58;52529:4;52524:2;52516:6;52512:15;52505:29;52320:221;:::o;52547:167::-;52687:19;52683:1;52675:6;52671:14;52664:43;52547:167;:::o;52720:225::-;52860:34;52856:1;52848:6;52844:14;52837:58;52929:8;52924:2;52916:6;52912:15;52905:33;52720:225;:::o;52951:182::-;53091:34;53087:1;53079:6;53075:14;53068:58;52951:182;:::o;53139:229::-;53279:34;53275:1;53267:6;53263:14;53256:58;53348:12;53343:2;53335:6;53331:15;53324:37;53139:229;:::o;53374:177::-;53514:29;53510:1;53502:6;53498:14;53491:53;53374:177;:::o;53557:180::-;53697:32;53693:1;53685:6;53681:14;53674:56;53557:180;:::o;53743:222::-;53883:34;53879:1;53871:6;53867:14;53860:58;53952:5;53947:2;53939:6;53935:15;53928:30;53743:222;:::o;53971:224::-;54111:34;54107:1;54099:6;54095:14;54088:58;54180:7;54175:2;54167:6;54163:15;54156:32;53971:224;:::o;54201:168::-;54341:20;54337:1;54329:6;54325:14;54318:44;54201:168;:::o;54375:236::-;54515:34;54511:1;54503:6;54499:14;54492:58;54584:19;54579:2;54571:6;54567:15;54560:44;54375:236;:::o;54617:225::-;54757:34;54753:1;54745:6;54741:14;54734:58;54826:8;54821:2;54813:6;54809:15;54802:33;54617:225;:::o;54848:174::-;54988:26;54984:1;54976:6;54972:14;54965:50;54848:174;:::o;55028:244::-;55168:34;55164:1;55156:6;55152:14;55145:58;55237:27;55232:2;55224:6;55220:15;55213:52;55028:244;:::o;55278:230::-;55418:34;55414:1;55406:6;55402:14;55395:58;55487:13;55482:2;55474:6;55470:15;55463:38;55278:230;:::o;55514:225::-;55654:34;55650:1;55642:6;55638:14;55631:58;55723:8;55718:2;55710:6;55706:15;55699:33;55514:225;:::o;55745:164::-;55885:16;55881:1;55873:6;55869:14;55862:40;55745:164;:::o;55915:172::-;56055:24;56051:1;56043:6;56039:14;56032:48;55915:172;:::o;56093:182::-;56233:34;56229:1;56221:6;56217:14;56210:58;56093:182;:::o;56281:176::-;56421:28;56417:1;56409:6;56405:14;56398:52;56281:176;:::o;56463:237::-;56603:34;56599:1;56591:6;56587:14;56580:58;56672:20;56667:2;56659:6;56655:15;56648:45;56463:237;:::o;56706:221::-;56846:34;56842:1;56834:6;56830:14;56823:58;56915:4;56910:2;56902:6;56898:15;56891:29;56706:221;:::o;56933:238::-;57073:34;57069:1;57061:6;57057:14;57050:58;57142:21;57137:2;57129:6;57125:15;57118:46;56933:238;:::o;57177:176::-;57317:28;57313:1;57305:6;57301:14;57294:52;57177:176;:::o;57359:220::-;57499:34;57495:1;57487:6;57483:14;57476:58;57568:3;57563:2;57555:6;57551:15;57544:28;57359:220;:::o;57585:175::-;57725:27;57721:1;57713:6;57709:14;57702:51;57585:175;:::o;57766:227::-;57906:34;57902:1;57894:6;57890:14;57883:58;57975:10;57970:2;57962:6;57958:15;57951:35;57766:227;:::o;57999:170::-;58139:22;58135:1;58127:6;58123:14;58116:46;57999:170;:::o;58175:233::-;58315:34;58311:1;58303:6;58299:14;58292:58;58384:16;58379:2;58371:6;58367:15;58360:41;58175:233;:::o;58414:234::-;58554:34;58550:1;58542:6;58538:14;58531:58;58623:17;58618:2;58610:6;58606:15;58599:42;58414:234;:::o;58654:172::-;58794:24;58790:1;58782:6;58778:14;58771:48;58654:172;:::o;58832:232::-;58972:34;58968:1;58960:6;58956:14;58949:58;59041:15;59036:2;59028:6;59024:15;59017:40;58832:232;:::o;59070:122::-;59143:24;59161:5;59143:24;:::i;:::-;59136:5;59133:35;59123:63;;59182:1;59179;59172:12;59123:63;59070:122;:::o;59198:116::-;59268:21;59283:5;59268:21;:::i;:::-;59261:5;59258:32;59248:60;;59304:1;59301;59294:12;59248:60;59198:116;:::o;59320:122::-;59393:24;59411:5;59393:24;:::i;:::-;59386:5;59383:35;59373:63;;59432:1;59429;59422:12;59373:63;59320:122;:::o;59448:120::-;59520:23;59537:5;59520:23;:::i;:::-;59513:5;59510:34;59500:62;;59558:1;59555;59548:12;59500:62;59448:120;:::o;59574:122::-;59647:24;59665:5;59647:24;:::i;:::-;59640:5;59637:35;59627:63;;59686:1;59683;59676:12;59627:63;59574:122;:::o

Swarm Source

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