ETH Price: $2,404.94 (-0.55%)

Token

Kannabiz Monkeez (KM)
 

Overview

Max Total Supply

511 KM

Holders

31

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 KM
0xe2a61fecd0c671437dc486d6ced280c1a13873c5
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Minting for Kannabiz Monkeez is now live!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KMonkeez

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-17
*/

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

// File: monkeez.sol

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








contract KMonkeez is ERC721, Pausable, Ownable, ERC721URIStorage, ERC721Enumerable {

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;


    uint256 public constant monkeePrice = 200000000000000000; // 0.2 ETH

    uint256 public constant preSaleMonkeePrice = 160000000000000000; // 0.16 ETH

    uint public constant maxMonkeePurchase = 12;

    uint256 public constant MAX_MONKEEZ = 10420;

    bool public saleIsActive = false;

    bool public preMintActive = false;
    
    string private _baseTokenURI;
    mapping(uint => string) public monkeeNames;

    // for whitelist
    mapping(address => bool) public whitelistClaimed;

    bytes32 internal merkleRoot;
    
    // Reserve 125 trees for team - Giveaways/Prizes etc
    uint public monkeeReserve = 1000;
    
    event monkeeNameChange(address _by, uint _tokenId, string _name);
    
    // event licenseisLocked(string _licenseText);

    uint256 public tokenCounter;
    mapping (uint256 => string) private _tokenURIs;

    constructor() ERC721("Kannabiz Monkeez", "KM") {
        tokenCounter = 0;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function ownerApprove(address _to, uint256 _tokenNumber) public onlyOwner {
        uint supply = totalSupply();
        for (uint i = 0; i < _tokenNumber; i++) {
            _safeMint(_to, supply + i);
        }
    }

    function preSaleMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable {
        require(preMintActive, "Pre sale is not active");
        require(!whitelistClaimed[msg.sender], "Address has already claimed.");
        require(_mintAmount < 13);
        require(msg.value >= preSaleMonkeePrice * _mintAmount, "Ether value sent is not correct");
        uint preSupply = totalSupply();
        bytes32 leaf = keccak256(abi.encodePacked((msg.sender)));
        require(
            MerkleProof.verify(_merkleProof, merkleRoot, leaf),
            "Invalid proof"
        );
        whitelistClaimed[msg.sender] = true;
        for (uint i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, preSupply + i);
        }
    }

    function reserveMonkeez(address _to, uint256 _reserveAmount) public onlyOwner {        
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= monkeeReserve, "Not enough reserve left for team");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        monkeeReserve = monkeeReserve - _reserveAmount;
    }


    function _setBaseURI(string memory baseURI) internal virtual {
    _baseTokenURI = baseURI;
  }

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

  // Administrative zone
  function setBaseURI(string memory baseURI) public onlyOwner {
    _setBaseURI(baseURI);
  }


    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function makePreSaleActive() public onlyOwner {
        preMintActive = !preMintActive;
    }

    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function mintMonkeez(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint bulls");
        require(numberOfTokens > 0 && numberOfTokens <= maxMonkeePurchase, "Can only mint 20 tokens at a time");
        require(totalSupply() + numberOfTokens <= MAX_MONKEEZ, "Purchase would exceed max supply of Members");
        require(msg.value >= monkeePrice * numberOfTokens, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_MONKEEZ) {
                _safeMint(msg.sender, mintIndex);
            }
        }

    }

    function setMerkleRoot(bytes32 _newMerkleRoot) public onlyOwner {
        merkleRoot = _newMerkleRoot;
    }

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"monkeeNameChange","type":"event"},{"inputs":[],"name":"MAX_MONKEEZ","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"makePreSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMonkeePurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintMonkeez","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"monkeeNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monkeePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monkeeReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenNumber","type":"uint256"}],"name":"ownerApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleMonkeePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveMonkeez","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","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":[],"name":"tokenCounter","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506103e86012553480156200004d57600080fd5b506040518060400160405280601081526020017f4b616e6e6162697a204d6f6e6b65657a000000000000000000000000000000008152506040518060400160405280600281526020017f4b4d0000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d292919062000205565b508060019080519060200190620000eb92919062000205565b5050506000600660006101000a81548160ff021916908315150217905550620001296200011d6200013760201b60201c565b6200013f60201b60201c565b60006013819055506200031a565b600033905090565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021390620002b5565b90600052602060002090601f01602090048101928262000237576000855562000283565b82601f106200025257805160ff191683800117855562000283565b8280016001018555821562000283579182015b828111156200028257825182559160200191906001019062000265565b5b50905062000292919062000296565b5090565b5b80821115620002b157600081600090555060010162000297565b5090565b60006002820490506001821680620002ce57607f821691505b60208210811415620002e557620002e4620002eb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615350806200032a6000396000f3fe6080604052600436106102515760003560e01c80636ad9de1111610139578063b132f681116100b6578063db4bec441161007a578063db4bec441461085c578063e985e9c514610899578063eb8d2444146108d6578063f2fde38b14610901578063f9afba1f1461092a578063f9feed7b1461095557610251565b8063b132f68114610777578063b88d4fde146107a0578063c87b56dd146107c9578063d082e38114610806578063d97c83211461083157610251565b80638462151c116100fd5780638462151c1461067e5780638da5cb5b146106bb57806395d89b41146106e6578063a22cb46514610711578063acb5f2fb1461073a57610251565b80636ad9de11146105bf57806370a08231146105ea578063715018a6146106275780637cb647591461063e5780638456cb591461066757610251565b806334918dfd116101d25780634c220f6e116101965780634c220f6e146104b95780634f6ccce7146104d557806355f804b3146105125780635c975abb1461053b578063627ee897146105665780636352211e1461058257610251565b806334918dfd146104345780633ccfd60b1461044b5780633f4ba83a1461046257806342842e0e14610479578063479b2cae146104a257610251565b806318160ddd1161021957806318160ddd1461034d5780631a12c91d1461037857806322ea4653146103a357806323b872dd146103ce5780632f745c59146103f757610251565b806301ffc9a714610256578063029d1ecd1461029357806306fdde03146102bc578063081812fc146102e7578063095ea7b314610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613b6c565b610980565b60405161028a91906142ab565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613b07565b610992565b005b3480156102c857600080fd5b506102d1610a53565b6040516102de91906142c6565b60405180910390f35b3480156102f357600080fd5b5061030e60048036038101906103099190613bff565b610ae5565b60405161031b9190614222565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190613b07565b610b6a565b005b34801561035957600080fd5b50610362610c82565b60405161036f9190614688565b60405180910390f35b34801561038457600080fd5b5061038d610c8f565b60405161039a91906142ab565b60405180910390f35b3480156103af57600080fd5b506103b8610ca2565b6040516103c59190614688565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613a01565b610ca8565b005b34801561040357600080fd5b5061041e60048036038101906104199190613b07565b610d08565b60405161042b9190614688565b60405180910390f35b34801561044057600080fd5b50610449610dad565b005b34801561045757600080fd5b50610460610e55565b005b34801561046e57600080fd5b50610477610f20565b005b34801561048557600080fd5b506104a0600480360381019061049b9190613a01565b610fa6565b005b3480156104ae57600080fd5b506104b7610fc6565b005b6104d360048036038101906104ce9190613c28565b61106e565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190613bff565b611304565b6040516105099190614688565b60405180910390f35b34801561051e57600080fd5b5061053960048036038101906105349190613bbe565b61139b565b005b34801561054757600080fd5b50610550611423565b60405161055d91906142ab565b60405180910390f35b610580600480360381019061057b9190613bff565b61143a565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613bff565b6115d1565b6040516105b69190614222565b60405180910390f35b3480156105cb57600080fd5b506105d4611683565b6040516105e19190614688565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c919061399c565b61168f565b60405161061e9190614688565b60405180910390f35b34801561063357600080fd5b5061063c611747565b005b34801561064a57600080fd5b5061066560048036038101906106609190613b43565b6117cf565b005b34801561067357600080fd5b5061067c611855565b005b34801561068a57600080fd5b506106a560048036038101906106a0919061399c565b6118db565b6040516106b29190614289565b60405180910390f35b3480156106c757600080fd5b506106d0611a57565b6040516106dd9190614222565b60405180910390f35b3480156106f257600080fd5b506106fb611a81565b60405161070891906142c6565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190613acb565b611b13565b005b34801561074657600080fd5b50610761600480360381019061075c9190613bff565b611b29565b60405161076e91906142c6565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190613b07565b611bc9565b005b3480156107ac57600080fd5b506107c760048036038101906107c29190613a50565b611cef565b005b3480156107d557600080fd5b506107f060048036038101906107eb9190613bff565b611d51565b6040516107fd91906142c6565b60405180910390f35b34801561081257600080fd5b5061081b611d63565b6040516108289190614688565b60405180910390f35b34801561083d57600080fd5b50610846611d69565b6040516108539190614688565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e919061399c565b611d75565b60405161089091906142ab565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb91906139c5565b611d95565b6040516108cd91906142ab565b60405180910390f35b3480156108e257600080fd5b506108eb611e29565b6040516108f891906142ab565b60405180910390f35b34801561090d57600080fd5b506109286004803603810190610923919061399c565b611e3c565b005b34801561093657600080fd5b5061093f611f34565b60405161094c9190614688565b60405180910390f35b34801561096157600080fd5b5061096a611f39565b6040516109779190614688565b60405180910390f35b600061098b82611f3f565b9050919050565b61099a611fb9565b73ffffffffffffffffffffffffffffffffffffffff166109b8611a57565b73ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a05906145a8565b60405180910390fd5b6000610a18610c82565b905060005b82811015610a4d57610a3a848284610a3591906147a6565b611fc1565b8080610a45906149de565b915050610a1d565b50505050565b606060008054610a629061497b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8e9061497b565b8015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b5050505050905090565b6000610af082611fdf565b610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690614588565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b75826115d1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90614608565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c05611fb9565b73ffffffffffffffffffffffffffffffffffffffff161480610c345750610c3381610c2e611fb9565b611d95565b5b610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a906144e8565b60405180910390fd5b610c7d838361204b565b505050565b6000600a80549050905090565b600d60019054906101000a900460ff1681565b60125481565b610cb9610cb3611fb9565b82612104565b610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef90614628565b60405180910390fd5b610d038383836121e2565b505050565b6000610d138361168f565b8210610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90614348565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610db5611fb9565b73ffffffffffffffffffffffffffffffffffffffff16610dd3611a57565b73ffffffffffffffffffffffffffffffffffffffff1614610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e20906145a8565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610e5d611fb9565b73ffffffffffffffffffffffffffffffffffffffff16610e7b611a57565b73ffffffffffffffffffffffffffffffffffffffff1614610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec8906145a8565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f1c573d6000803e3d6000fd5b5050565b610f28611fb9565b73ffffffffffffffffffffffffffffffffffffffff16610f46611a57565b73ffffffffffffffffffffffffffffffffffffffff1614610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f93906145a8565b60405180910390fd5b610fa4612449565b565b610fc183838360405180602001604052806000815250611cef565b505050565b610fce611fb9565b73ffffffffffffffffffffffffffffffffffffffff16610fec611a57565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906145a8565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b600d60019054906101000a900460ff166110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b4906145c8565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561114a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611141906142e8565b60405180910390fd5b600d831061115757600080fd5b826702386f26fc10000061116b919061482d565b3410156111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490614468565b60405180910390fd5b60006111b7610c82565b90506000336040516020016111cc91906141e3565b604051602081830303815290604052805190602001209050611232848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601154836124eb565b611271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126890614668565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b858110156112fc576112e93382856112e491906147a6565b611fc1565b80806112f4906149de565b9150506112cc565b505050505050565b600061130e610c82565b821061134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690614648565b60405180910390fd5b600a8281548110611389577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6113a3611fb9565b73ffffffffffffffffffffffffffffffffffffffff166113c1611a57565b73ffffffffffffffffffffffffffffffffffffffff1614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e906145a8565b60405180910390fd5b61142081612502565b50565b6000600660009054906101000a900460ff16905090565b600d60009054906101000a900460ff16611489576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611480906143e8565b60405180910390fd5b60008111801561149a5750600c8111155b6114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d0906144a8565b60405180910390fd5b6128b4816114e5610c82565b6114ef91906147a6565b1115611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790614328565b60405180910390fd5b806702c68af0bb140000611544919061482d565b341015611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90614468565b60405180910390fd5b60005b818110156115cd57600061159b610c82565b90506128b46115a8610c82565b10156115b9576115b83382611fc1565b5b5080806115c5906149de565b915050611589565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190614528565b60405180910390fd5b80915050919050565b6702386f26fc10000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614508565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174f611fb9565b73ffffffffffffffffffffffffffffffffffffffff1661176d611a57565b73ffffffffffffffffffffffffffffffffffffffff16146117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba906145a8565b60405180910390fd5b6117cd600061251c565b565b6117d7611fb9565b73ffffffffffffffffffffffffffffffffffffffff166117f5611a57565b73ffffffffffffffffffffffffffffffffffffffff161461184b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611842906145a8565b60405180910390fd5b8060118190555050565b61185d611fb9565b73ffffffffffffffffffffffffffffffffffffffff1661187b611a57565b73ffffffffffffffffffffffffffffffffffffffff16146118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c8906145a8565b60405180910390fd5b6118d96125e2565b565b606060006118e88361168f565b9050600081141561196b57600067ffffffffffffffff811115611934577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119625781602001602082028036833780820191505090505b50915050611a52565b60008167ffffffffffffffff8111156119ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119db5781602001602082028036833780820191505090505b50905060005b82811015611a4b576119f38582610d08565b828281518110611a2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611a43906149de565b9150506119e1565b8193505050505b919050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a909061497b565b80601f0160208091040260200160405190810160405280929190818152602001828054611abc9061497b565b8015611b095780601f10611ade57610100808354040283529160200191611b09565b820191906000526020600020905b815481529060010190602001808311611aec57829003601f168201915b5050505050905090565b611b25611b1e611fb9565b8383612685565b5050565b600f6020528060005260406000206000915090508054611b489061497b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b749061497b565b8015611bc15780601f10611b9657610100808354040283529160200191611bc1565b820191906000526020600020905b815481529060010190602001808311611ba457829003601f168201915b505050505081565b611bd1611fb9565b73ffffffffffffffffffffffffffffffffffffffff16611bef611a57565b73ffffffffffffffffffffffffffffffffffffffff1614611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c906145a8565b60405180910390fd5b6000611c4f610c82565b9050600082118015611c6357506012548211155b611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9990614408565b60405180910390fd5b60005b82811015611cd557611cc2848284611cbd91906147a6565b611fc1565b8080611ccd906149de565b915050611ca5565b5081601254611ce49190614887565b601281905550505050565b611d00611cfa611fb9565b83612104565b611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614628565b60405180910390fd5b611d4b848484846127f2565b50505050565b6060611d5c8261284e565b9050919050565b60135481565b6702c68af0bb14000081565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611e44611fb9565b73ffffffffffffffffffffffffffffffffffffffff16611e62611a57565b73ffffffffffffffffffffffffffffffffffffffff1614611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf906145a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f90614388565b60405180910390fd5b611f318161251c565b50565b600c81565b6128b481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fb25750611fb1826129a0565b5b9050919050565b600033905090565b611fdb828260405180602001604052806000815250612a82565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120be836115d1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061210f82611fdf565b61214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590614488565b60405180910390fd5b6000612159836115d1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121c857508373ffffffffffffffffffffffffffffffffffffffff166121b084610ae5565b73ffffffffffffffffffffffffffffffffffffffff16145b806121d957506121d88185611d95565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612202826115d1565b73ffffffffffffffffffffffffffffffffffffffff1614612258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224f906143a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bf90614428565b60405180910390fd5b6122d3838383612add565b6122de60008261204b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461232e9190614887565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238591906147a6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612444838383612b35565b505050565b612451611423565b612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248790614308565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6124d4611fb9565b6040516124e19190614222565b60405180910390a1565b6000826124f88584612b3a565b1490509392505050565b80600e9080519060200190612518929190613761565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125ea611423565b1561262a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612621906144c8565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861266e611fb9565b60405161267b9190614222565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb90614448565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127e591906142ab565b60405180910390a3505050565b6127fd8484846121e2565b61280984848484612bd5565b612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f90614368565b60405180910390fd5b50505050565b606061285982611fdf565b612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f90614568565b60405180910390fd5b60006007600084815260200190815260200160002080546128b89061497b565b80601f01602080910402602001604051908101604052809291908181526020018280546128e49061497b565b80156129315780601f1061290657610100808354040283529160200191612931565b820191906000526020600020905b81548152906001019060200180831161291457829003601f168201915b505050505090506000612942612d6c565b905060008151141561295857819250505061299b565b60008251111561298d5780826040516020016129759291906141fe565b6040516020818303038152906040529250505061299b565b61299684612dfe565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a6b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a7b5750612a7a82612ea5565b5b9050919050565b612a8c8383612f0f565b612a996000848484612bd5565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614368565b60405180910390fd5b505050565b612ae5611423565b15612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c906144c8565b60405180910390fd5b612b308383836130e9565b505050565b505050565b60008082905060005b8451811015612bca576000858281518110612b87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612ba957612ba283826131fd565b9250612bb6565b612bb381846131fd565b92505b508080612bc2906149de565b915050612b43565b508091505092915050565b6000612bf68473ffffffffffffffffffffffffffffffffffffffff16613214565b15612d5f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c1f611fb9565b8786866040518563ffffffff1660e01b8152600401612c41949392919061423d565b602060405180830381600087803b158015612c5b57600080fd5b505af1925050508015612c8c57506040513d601f19601f82011682018060405250810190612c899190613b95565b60015b612d0f573d8060008114612cbc576040519150601f19603f3d011682016040523d82523d6000602084013e612cc1565b606091505b50600081511415612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90614368565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d64565b600190505b949350505050565b6060600e8054612d7b9061497b565b80601f0160208091040260200160405190810160405280929190818152602001828054612da79061497b565b8015612df45780601f10612dc957610100808354040283529160200191612df4565b820191906000526020600020905b815481529060010190602001808311612dd757829003601f168201915b5050505050905090565b6060612e0982611fdf565b612e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3f906145e8565b60405180910390fd5b6000612e52612d6c565b90506000815111612e725760405180602001604052806000815250612e9d565b80612e7c84613237565b604051602001612e8d9291906141fe565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7690614548565b60405180910390fd5b612f8881611fdf565b15612fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbf906143c8565b60405180910390fd5b612fd460008383612add565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461302491906147a6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130e560008383612b35565b5050565b6130f48383836133e4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561313757613132816133e9565b613176565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613175576131748382613432565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131b9576131b48161359f565b6131f8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131f7576131f682826136e2565b5b5b505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600082141561327f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133df565b600082905060005b600082146132b157808061329a906149de565b915050600a826132aa91906147fc565b9150613287565b60008167ffffffffffffffff8111156132f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133255781602001600182028036833780820191505090505b5090505b600085146133d85760018261333e9190614887565b9150600a8561334d9190614a4b565b603061335991906147a6565b60f81b818381518110613395577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133d191906147fc565b9450613329565b8093505050505b919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161343f8461168f565b6134499190614887565b905060006009600084815260200190815260200160002054905081811461352e576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506135b39190614887565b90506000600b60008481526020019081526020016000205490506000600a8381548110613609577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a8381548110613651577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806136c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006136ed8361168f565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b82805461376d9061497b565b90600052602060002090601f01602090048101928261378f57600085556137d6565b82601f106137a857805160ff19168380011785556137d6565b828001600101855582156137d6579182015b828111156137d55782518255916020019190600101906137ba565b5b5090506137e391906137e7565b5090565b5b808211156138005760008160009055506001016137e8565b5090565b6000613817613812846146c8565b6146a3565b90508281526020810184848401111561382f57600080fd5b61383a848285614939565b509392505050565b6000613855613850846146f9565b6146a3565b90508281526020810184848401111561386d57600080fd5b613878848285614939565b509392505050565b60008135905061388f816152a7565b92915050565b60008083601f8401126138a757600080fd5b8235905067ffffffffffffffff8111156138c057600080fd5b6020830191508360208202830111156138d857600080fd5b9250929050565b6000813590506138ee816152be565b92915050565b600081359050613903816152d5565b92915050565b600081359050613918816152ec565b92915050565b60008151905061392d816152ec565b92915050565b600082601f83011261394457600080fd5b8135613954848260208601613804565b91505092915050565b600082601f83011261396e57600080fd5b813561397e848260208601613842565b91505092915050565b60008135905061399681615303565b92915050565b6000602082840312156139ae57600080fd5b60006139bc84828501613880565b91505092915050565b600080604083850312156139d857600080fd5b60006139e685828601613880565b92505060206139f785828601613880565b9150509250929050565b600080600060608486031215613a1657600080fd5b6000613a2486828701613880565b9350506020613a3586828701613880565b9250506040613a4686828701613987565b9150509250925092565b60008060008060808587031215613a6657600080fd5b6000613a7487828801613880565b9450506020613a8587828801613880565b9350506040613a9687828801613987565b925050606085013567ffffffffffffffff811115613ab357600080fd5b613abf87828801613933565b91505092959194509250565b60008060408385031215613ade57600080fd5b6000613aec85828601613880565b9250506020613afd858286016138df565b9150509250929050565b60008060408385031215613b1a57600080fd5b6000613b2885828601613880565b9250506020613b3985828601613987565b9150509250929050565b600060208284031215613b5557600080fd5b6000613b63848285016138f4565b91505092915050565b600060208284031215613b7e57600080fd5b6000613b8c84828501613909565b91505092915050565b600060208284031215613ba757600080fd5b6000613bb58482850161391e565b91505092915050565b600060208284031215613bd057600080fd5b600082013567ffffffffffffffff811115613bea57600080fd5b613bf68482850161395d565b91505092915050565b600060208284031215613c1157600080fd5b6000613c1f84828501613987565b91505092915050565b600080600060408486031215613c3d57600080fd5b6000613c4b86828701613987565b935050602084013567ffffffffffffffff811115613c6857600080fd5b613c7486828701613895565b92509250509250925092565b6000613c8c83836141c5565b60208301905092915050565b613ca1816148bb565b82525050565b613cb8613cb3826148bb565b614a27565b82525050565b6000613cc98261473a565b613cd38185614768565b9350613cde8361472a565b8060005b83811015613d0f578151613cf68882613c80565b9750613d018361475b565b925050600181019050613ce2565b5085935050505092915050565b613d25816148cd565b82525050565b6000613d3682614745565b613d408185614779565b9350613d50818560208601614948565b613d5981614b38565b840191505092915050565b6000613d6f82614750565b613d79818561478a565b9350613d89818560208601614948565b613d9281614b38565b840191505092915050565b6000613da882614750565b613db2818561479b565b9350613dc2818560208601614948565b80840191505092915050565b6000613ddb601c8361478a565b9150613de682614b56565b602082019050919050565b6000613dfe60148361478a565b9150613e0982614b7f565b602082019050919050565b6000613e21602b8361478a565b9150613e2c82614ba8565b604082019050919050565b6000613e44602b8361478a565b9150613e4f82614bf7565b604082019050919050565b6000613e6760328361478a565b9150613e7282614c46565b604082019050919050565b6000613e8a60268361478a565b9150613e9582614c95565b604082019050919050565b6000613ead60258361478a565b9150613eb882614ce4565b604082019050919050565b6000613ed0601c8361478a565b9150613edb82614d33565b602082019050919050565b6000613ef360218361478a565b9150613efe82614d5c565b604082019050919050565b6000613f1660208361478a565b9150613f2182614dab565b602082019050919050565b6000613f3960248361478a565b9150613f4482614dd4565b604082019050919050565b6000613f5c60198361478a565b9150613f6782614e23565b602082019050919050565b6000613f7f601f8361478a565b9150613f8a82614e4c565b602082019050919050565b6000613fa2602c8361478a565b9150613fad82614e75565b604082019050919050565b6000613fc560218361478a565b9150613fd082614ec4565b604082019050919050565b6000613fe860108361478a565b9150613ff382614f13565b602082019050919050565b600061400b60388361478a565b915061401682614f3c565b604082019050919050565b600061402e602a8361478a565b915061403982614f8b565b604082019050919050565b600061405160298361478a565b915061405c82614fda565b604082019050919050565b600061407460208361478a565b915061407f82615029565b602082019050919050565b600061409760318361478a565b91506140a282615052565b604082019050919050565b60006140ba602c8361478a565b91506140c5826150a1565b604082019050919050565b60006140dd60208361478a565b91506140e8826150f0565b602082019050919050565b600061410060168361478a565b915061410b82615119565b602082019050919050565b6000614123602f8361478a565b915061412e82615142565b604082019050919050565b600061414660218361478a565b915061415182615191565b604082019050919050565b600061416960318361478a565b9150614174826151e0565b604082019050919050565b600061418c602c8361478a565b91506141978261522f565b604082019050919050565b60006141af600d8361478a565b91506141ba8261527e565b602082019050919050565b6141ce8161492f565b82525050565b6141dd8161492f565b82525050565b60006141ef8284613ca7565b60148201915081905092915050565b600061420a8285613d9d565b91506142168284613d9d565b91508190509392505050565b60006020820190506142376000830184613c98565b92915050565b60006080820190506142526000830187613c98565b61425f6020830186613c98565b61426c60408301856141d4565b818103606083015261427e8184613d2b565b905095945050505050565b600060208201905081810360008301526142a38184613cbe565b905092915050565b60006020820190506142c06000830184613d1c565b92915050565b600060208201905081810360008301526142e08184613d64565b905092915050565b6000602082019050818103600083015261430181613dce565b9050919050565b6000602082019050818103600083015261432181613df1565b9050919050565b6000602082019050818103600083015261434181613e14565b9050919050565b6000602082019050818103600083015261436181613e37565b9050919050565b6000602082019050818103600083015261438181613e5a565b9050919050565b600060208201905081810360008301526143a181613e7d565b9050919050565b600060208201905081810360008301526143c181613ea0565b9050919050565b600060208201905081810360008301526143e181613ec3565b9050919050565b6000602082019050818103600083015261440181613ee6565b9050919050565b6000602082019050818103600083015261442181613f09565b9050919050565b6000602082019050818103600083015261444181613f2c565b9050919050565b6000602082019050818103600083015261446181613f4f565b9050919050565b6000602082019050818103600083015261448181613f72565b9050919050565b600060208201905081810360008301526144a181613f95565b9050919050565b600060208201905081810360008301526144c181613fb8565b9050919050565b600060208201905081810360008301526144e181613fdb565b9050919050565b6000602082019050818103600083015261450181613ffe565b9050919050565b6000602082019050818103600083015261452181614021565b9050919050565b6000602082019050818103600083015261454181614044565b9050919050565b6000602082019050818103600083015261456181614067565b9050919050565b600060208201905081810360008301526145818161408a565b9050919050565b600060208201905081810360008301526145a1816140ad565b9050919050565b600060208201905081810360008301526145c1816140d0565b9050919050565b600060208201905081810360008301526145e1816140f3565b9050919050565b6000602082019050818103600083015261460181614116565b9050919050565b6000602082019050818103600083015261462181614139565b9050919050565b600060208201905081810360008301526146418161415c565b9050919050565b600060208201905081810360008301526146618161417f565b9050919050565b60006020820190508181036000830152614681816141a2565b9050919050565b600060208201905061469d60008301846141d4565b92915050565b60006146ad6146be565b90506146b982826149ad565b919050565b6000604051905090565b600067ffffffffffffffff8211156146e3576146e2614b09565b5b6146ec82614b38565b9050602081019050919050565b600067ffffffffffffffff82111561471457614713614b09565b5b61471d82614b38565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147b18261492f565b91506147bc8361492f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147f1576147f0614a7c565b5b828201905092915050565b60006148078261492f565b91506148128361492f565b92508261482257614821614aab565b5b828204905092915050565b60006148388261492f565b91506148438361492f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561487c5761487b614a7c565b5b828202905092915050565b60006148928261492f565b915061489d8361492f565b9250828210156148b0576148af614a7c565b5b828203905092915050565b60006148c68261490f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561496657808201518184015260208101905061494b565b83811115614975576000848401525b50505050565b6000600282049050600182168061499357607f821691505b602082108114156149a7576149a6614ada565b5b50919050565b6149b682614b38565b810181811067ffffffffffffffff821117156149d5576149d4614b09565b5b80604052505050565b60006149e98261492f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a1c57614a1b614a7c565b5b600182019050919050565b6000614a3282614a39565b9050919050565b6000614a4482614b49565b9050919050565b6000614a568261492f565b9150614a618361492f565b925082614a7157614a70614aab565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f416464726573732068617320616c726561647920636c61696d65642e00000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204d656d62657273000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e742062756c6c60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5072652073616c65206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6152b0816148bb565b81146152bb57600080fd5b50565b6152c7816148cd565b81146152d257600080fd5b50565b6152de816148d9565b81146152e957600080fd5b50565b6152f5816148e3565b811461530057600080fd5b50565b61530c8161492f565b811461531757600080fd5b5056fea264697066735822122038cfa9ca6bf59496472a39e0e7ce2af70e64d37cb1b424b813fb54428bd0644064736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102515760003560e01c80636ad9de1111610139578063b132f681116100b6578063db4bec441161007a578063db4bec441461085c578063e985e9c514610899578063eb8d2444146108d6578063f2fde38b14610901578063f9afba1f1461092a578063f9feed7b1461095557610251565b8063b132f68114610777578063b88d4fde146107a0578063c87b56dd146107c9578063d082e38114610806578063d97c83211461083157610251565b80638462151c116100fd5780638462151c1461067e5780638da5cb5b146106bb57806395d89b41146106e6578063a22cb46514610711578063acb5f2fb1461073a57610251565b80636ad9de11146105bf57806370a08231146105ea578063715018a6146106275780637cb647591461063e5780638456cb591461066757610251565b806334918dfd116101d25780634c220f6e116101965780634c220f6e146104b95780634f6ccce7146104d557806355f804b3146105125780635c975abb1461053b578063627ee897146105665780636352211e1461058257610251565b806334918dfd146104345780633ccfd60b1461044b5780633f4ba83a1461046257806342842e0e14610479578063479b2cae146104a257610251565b806318160ddd1161021957806318160ddd1461034d5780631a12c91d1461037857806322ea4653146103a357806323b872dd146103ce5780632f745c59146103f757610251565b806301ffc9a714610256578063029d1ecd1461029357806306fdde03146102bc578063081812fc146102e7578063095ea7b314610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613b6c565b610980565b60405161028a91906142ab565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613b07565b610992565b005b3480156102c857600080fd5b506102d1610a53565b6040516102de91906142c6565b60405180910390f35b3480156102f357600080fd5b5061030e60048036038101906103099190613bff565b610ae5565b60405161031b9190614222565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190613b07565b610b6a565b005b34801561035957600080fd5b50610362610c82565b60405161036f9190614688565b60405180910390f35b34801561038457600080fd5b5061038d610c8f565b60405161039a91906142ab565b60405180910390f35b3480156103af57600080fd5b506103b8610ca2565b6040516103c59190614688565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613a01565b610ca8565b005b34801561040357600080fd5b5061041e60048036038101906104199190613b07565b610d08565b60405161042b9190614688565b60405180910390f35b34801561044057600080fd5b50610449610dad565b005b34801561045757600080fd5b50610460610e55565b005b34801561046e57600080fd5b50610477610f20565b005b34801561048557600080fd5b506104a0600480360381019061049b9190613a01565b610fa6565b005b3480156104ae57600080fd5b506104b7610fc6565b005b6104d360048036038101906104ce9190613c28565b61106e565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190613bff565b611304565b6040516105099190614688565b60405180910390f35b34801561051e57600080fd5b5061053960048036038101906105349190613bbe565b61139b565b005b34801561054757600080fd5b50610550611423565b60405161055d91906142ab565b60405180910390f35b610580600480360381019061057b9190613bff565b61143a565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613bff565b6115d1565b6040516105b69190614222565b60405180910390f35b3480156105cb57600080fd5b506105d4611683565b6040516105e19190614688565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c919061399c565b61168f565b60405161061e9190614688565b60405180910390f35b34801561063357600080fd5b5061063c611747565b005b34801561064a57600080fd5b5061066560048036038101906106609190613b43565b6117cf565b005b34801561067357600080fd5b5061067c611855565b005b34801561068a57600080fd5b506106a560048036038101906106a0919061399c565b6118db565b6040516106b29190614289565b60405180910390f35b3480156106c757600080fd5b506106d0611a57565b6040516106dd9190614222565b60405180910390f35b3480156106f257600080fd5b506106fb611a81565b60405161070891906142c6565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190613acb565b611b13565b005b34801561074657600080fd5b50610761600480360381019061075c9190613bff565b611b29565b60405161076e91906142c6565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190613b07565b611bc9565b005b3480156107ac57600080fd5b506107c760048036038101906107c29190613a50565b611cef565b005b3480156107d557600080fd5b506107f060048036038101906107eb9190613bff565b611d51565b6040516107fd91906142c6565b60405180910390f35b34801561081257600080fd5b5061081b611d63565b6040516108289190614688565b60405180910390f35b34801561083d57600080fd5b50610846611d69565b6040516108539190614688565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e919061399c565b611d75565b60405161089091906142ab565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb91906139c5565b611d95565b6040516108cd91906142ab565b60405180910390f35b3480156108e257600080fd5b506108eb611e29565b6040516108f891906142ab565b60405180910390f35b34801561090d57600080fd5b506109286004803603810190610923919061399c565b611e3c565b005b34801561093657600080fd5b5061093f611f34565b60405161094c9190614688565b60405180910390f35b34801561096157600080fd5b5061096a611f39565b6040516109779190614688565b60405180910390f35b600061098b82611f3f565b9050919050565b61099a611fb9565b73ffffffffffffffffffffffffffffffffffffffff166109b8611a57565b73ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a05906145a8565b60405180910390fd5b6000610a18610c82565b905060005b82811015610a4d57610a3a848284610a3591906147a6565b611fc1565b8080610a45906149de565b915050610a1d565b50505050565b606060008054610a629061497b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8e9061497b565b8015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b5050505050905090565b6000610af082611fdf565b610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690614588565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b75826115d1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90614608565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c05611fb9565b73ffffffffffffffffffffffffffffffffffffffff161480610c345750610c3381610c2e611fb9565b611d95565b5b610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a906144e8565b60405180910390fd5b610c7d838361204b565b505050565b6000600a80549050905090565b600d60019054906101000a900460ff1681565b60125481565b610cb9610cb3611fb9565b82612104565b610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef90614628565b60405180910390fd5b610d038383836121e2565b505050565b6000610d138361168f565b8210610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90614348565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610db5611fb9565b73ffffffffffffffffffffffffffffffffffffffff16610dd3611a57565b73ffffffffffffffffffffffffffffffffffffffff1614610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e20906145a8565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610e5d611fb9565b73ffffffffffffffffffffffffffffffffffffffff16610e7b611a57565b73ffffffffffffffffffffffffffffffffffffffff1614610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec8906145a8565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f1c573d6000803e3d6000fd5b5050565b610f28611fb9565b73ffffffffffffffffffffffffffffffffffffffff16610f46611a57565b73ffffffffffffffffffffffffffffffffffffffff1614610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f93906145a8565b60405180910390fd5b610fa4612449565b565b610fc183838360405180602001604052806000815250611cef565b505050565b610fce611fb9565b73ffffffffffffffffffffffffffffffffffffffff16610fec611a57565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906145a8565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b600d60019054906101000a900460ff166110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b4906145c8565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561114a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611141906142e8565b60405180910390fd5b600d831061115757600080fd5b826702386f26fc10000061116b919061482d565b3410156111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490614468565b60405180910390fd5b60006111b7610c82565b90506000336040516020016111cc91906141e3565b604051602081830303815290604052805190602001209050611232848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601154836124eb565b611271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126890614668565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b858110156112fc576112e93382856112e491906147a6565b611fc1565b80806112f4906149de565b9150506112cc565b505050505050565b600061130e610c82565b821061134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690614648565b60405180910390fd5b600a8281548110611389577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6113a3611fb9565b73ffffffffffffffffffffffffffffffffffffffff166113c1611a57565b73ffffffffffffffffffffffffffffffffffffffff1614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e906145a8565b60405180910390fd5b61142081612502565b50565b6000600660009054906101000a900460ff16905090565b600d60009054906101000a900460ff16611489576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611480906143e8565b60405180910390fd5b60008111801561149a5750600c8111155b6114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d0906144a8565b60405180910390fd5b6128b4816114e5610c82565b6114ef91906147a6565b1115611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790614328565b60405180910390fd5b806702c68af0bb140000611544919061482d565b341015611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90614468565b60405180910390fd5b60005b818110156115cd57600061159b610c82565b90506128b46115a8610c82565b10156115b9576115b83382611fc1565b5b5080806115c5906149de565b915050611589565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190614528565b60405180910390fd5b80915050919050565b6702386f26fc10000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614508565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174f611fb9565b73ffffffffffffffffffffffffffffffffffffffff1661176d611a57565b73ffffffffffffffffffffffffffffffffffffffff16146117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba906145a8565b60405180910390fd5b6117cd600061251c565b565b6117d7611fb9565b73ffffffffffffffffffffffffffffffffffffffff166117f5611a57565b73ffffffffffffffffffffffffffffffffffffffff161461184b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611842906145a8565b60405180910390fd5b8060118190555050565b61185d611fb9565b73ffffffffffffffffffffffffffffffffffffffff1661187b611a57565b73ffffffffffffffffffffffffffffffffffffffff16146118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c8906145a8565b60405180910390fd5b6118d96125e2565b565b606060006118e88361168f565b9050600081141561196b57600067ffffffffffffffff811115611934577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119625781602001602082028036833780820191505090505b50915050611a52565b60008167ffffffffffffffff8111156119ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119db5781602001602082028036833780820191505090505b50905060005b82811015611a4b576119f38582610d08565b828281518110611a2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611a43906149de565b9150506119e1565b8193505050505b919050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a909061497b565b80601f0160208091040260200160405190810160405280929190818152602001828054611abc9061497b565b8015611b095780601f10611ade57610100808354040283529160200191611b09565b820191906000526020600020905b815481529060010190602001808311611aec57829003601f168201915b5050505050905090565b611b25611b1e611fb9565b8383612685565b5050565b600f6020528060005260406000206000915090508054611b489061497b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b749061497b565b8015611bc15780601f10611b9657610100808354040283529160200191611bc1565b820191906000526020600020905b815481529060010190602001808311611ba457829003601f168201915b505050505081565b611bd1611fb9565b73ffffffffffffffffffffffffffffffffffffffff16611bef611a57565b73ffffffffffffffffffffffffffffffffffffffff1614611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c906145a8565b60405180910390fd5b6000611c4f610c82565b9050600082118015611c6357506012548211155b611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9990614408565b60405180910390fd5b60005b82811015611cd557611cc2848284611cbd91906147a6565b611fc1565b8080611ccd906149de565b915050611ca5565b5081601254611ce49190614887565b601281905550505050565b611d00611cfa611fb9565b83612104565b611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614628565b60405180910390fd5b611d4b848484846127f2565b50505050565b6060611d5c8261284e565b9050919050565b60135481565b6702c68af0bb14000081565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611e44611fb9565b73ffffffffffffffffffffffffffffffffffffffff16611e62611a57565b73ffffffffffffffffffffffffffffffffffffffff1614611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf906145a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f90614388565b60405180910390fd5b611f318161251c565b50565b600c81565b6128b481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fb25750611fb1826129a0565b5b9050919050565b600033905090565b611fdb828260405180602001604052806000815250612a82565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120be836115d1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061210f82611fdf565b61214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590614488565b60405180910390fd5b6000612159836115d1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121c857508373ffffffffffffffffffffffffffffffffffffffff166121b084610ae5565b73ffffffffffffffffffffffffffffffffffffffff16145b806121d957506121d88185611d95565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612202826115d1565b73ffffffffffffffffffffffffffffffffffffffff1614612258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224f906143a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bf90614428565b60405180910390fd5b6122d3838383612add565b6122de60008261204b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461232e9190614887565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238591906147a6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612444838383612b35565b505050565b612451611423565b612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248790614308565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6124d4611fb9565b6040516124e19190614222565b60405180910390a1565b6000826124f88584612b3a565b1490509392505050565b80600e9080519060200190612518929190613761565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125ea611423565b1561262a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612621906144c8565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861266e611fb9565b60405161267b9190614222565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb90614448565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127e591906142ab565b60405180910390a3505050565b6127fd8484846121e2565b61280984848484612bd5565b612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f90614368565b60405180910390fd5b50505050565b606061285982611fdf565b612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f90614568565b60405180910390fd5b60006007600084815260200190815260200160002080546128b89061497b565b80601f01602080910402602001604051908101604052809291908181526020018280546128e49061497b565b80156129315780601f1061290657610100808354040283529160200191612931565b820191906000526020600020905b81548152906001019060200180831161291457829003601f168201915b505050505090506000612942612d6c565b905060008151141561295857819250505061299b565b60008251111561298d5780826040516020016129759291906141fe565b6040516020818303038152906040529250505061299b565b61299684612dfe565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a6b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a7b5750612a7a82612ea5565b5b9050919050565b612a8c8383612f0f565b612a996000848484612bd5565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614368565b60405180910390fd5b505050565b612ae5611423565b15612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c906144c8565b60405180910390fd5b612b308383836130e9565b505050565b505050565b60008082905060005b8451811015612bca576000858281518110612b87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612ba957612ba283826131fd565b9250612bb6565b612bb381846131fd565b92505b508080612bc2906149de565b915050612b43565b508091505092915050565b6000612bf68473ffffffffffffffffffffffffffffffffffffffff16613214565b15612d5f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c1f611fb9565b8786866040518563ffffffff1660e01b8152600401612c41949392919061423d565b602060405180830381600087803b158015612c5b57600080fd5b505af1925050508015612c8c57506040513d601f19601f82011682018060405250810190612c899190613b95565b60015b612d0f573d8060008114612cbc576040519150601f19603f3d011682016040523d82523d6000602084013e612cc1565b606091505b50600081511415612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90614368565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d64565b600190505b949350505050565b6060600e8054612d7b9061497b565b80601f0160208091040260200160405190810160405280929190818152602001828054612da79061497b565b8015612df45780601f10612dc957610100808354040283529160200191612df4565b820191906000526020600020905b815481529060010190602001808311612dd757829003601f168201915b5050505050905090565b6060612e0982611fdf565b612e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3f906145e8565b60405180910390fd5b6000612e52612d6c565b90506000815111612e725760405180602001604052806000815250612e9d565b80612e7c84613237565b604051602001612e8d9291906141fe565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7690614548565b60405180910390fd5b612f8881611fdf565b15612fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbf906143c8565b60405180910390fd5b612fd460008383612add565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461302491906147a6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130e560008383612b35565b5050565b6130f48383836133e4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561313757613132816133e9565b613176565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613175576131748382613432565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131b9576131b48161359f565b6131f8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131f7576131f682826136e2565b5b5b505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600082141561327f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133df565b600082905060005b600082146132b157808061329a906149de565b915050600a826132aa91906147fc565b9150613287565b60008167ffffffffffffffff8111156132f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133255781602001600182028036833780820191505090505b5090505b600085146133d85760018261333e9190614887565b9150600a8561334d9190614a4b565b603061335991906147a6565b60f81b818381518110613395577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133d191906147fc565b9450613329565b8093505050505b919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161343f8461168f565b6134499190614887565b905060006009600084815260200190815260200160002054905081811461352e576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506135b39190614887565b90506000600b60008481526020019081526020016000205490506000600a8381548110613609577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a8381548110613651577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806136c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006136ed8361168f565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b82805461376d9061497b565b90600052602060002090601f01602090048101928261378f57600085556137d6565b82601f106137a857805160ff19168380011785556137d6565b828001600101855582156137d6579182015b828111156137d55782518255916020019190600101906137ba565b5b5090506137e391906137e7565b5090565b5b808211156138005760008160009055506001016137e8565b5090565b6000613817613812846146c8565b6146a3565b90508281526020810184848401111561382f57600080fd5b61383a848285614939565b509392505050565b6000613855613850846146f9565b6146a3565b90508281526020810184848401111561386d57600080fd5b613878848285614939565b509392505050565b60008135905061388f816152a7565b92915050565b60008083601f8401126138a757600080fd5b8235905067ffffffffffffffff8111156138c057600080fd5b6020830191508360208202830111156138d857600080fd5b9250929050565b6000813590506138ee816152be565b92915050565b600081359050613903816152d5565b92915050565b600081359050613918816152ec565b92915050565b60008151905061392d816152ec565b92915050565b600082601f83011261394457600080fd5b8135613954848260208601613804565b91505092915050565b600082601f83011261396e57600080fd5b813561397e848260208601613842565b91505092915050565b60008135905061399681615303565b92915050565b6000602082840312156139ae57600080fd5b60006139bc84828501613880565b91505092915050565b600080604083850312156139d857600080fd5b60006139e685828601613880565b92505060206139f785828601613880565b9150509250929050565b600080600060608486031215613a1657600080fd5b6000613a2486828701613880565b9350506020613a3586828701613880565b9250506040613a4686828701613987565b9150509250925092565b60008060008060808587031215613a6657600080fd5b6000613a7487828801613880565b9450506020613a8587828801613880565b9350506040613a9687828801613987565b925050606085013567ffffffffffffffff811115613ab357600080fd5b613abf87828801613933565b91505092959194509250565b60008060408385031215613ade57600080fd5b6000613aec85828601613880565b9250506020613afd858286016138df565b9150509250929050565b60008060408385031215613b1a57600080fd5b6000613b2885828601613880565b9250506020613b3985828601613987565b9150509250929050565b600060208284031215613b5557600080fd5b6000613b63848285016138f4565b91505092915050565b600060208284031215613b7e57600080fd5b6000613b8c84828501613909565b91505092915050565b600060208284031215613ba757600080fd5b6000613bb58482850161391e565b91505092915050565b600060208284031215613bd057600080fd5b600082013567ffffffffffffffff811115613bea57600080fd5b613bf68482850161395d565b91505092915050565b600060208284031215613c1157600080fd5b6000613c1f84828501613987565b91505092915050565b600080600060408486031215613c3d57600080fd5b6000613c4b86828701613987565b935050602084013567ffffffffffffffff811115613c6857600080fd5b613c7486828701613895565b92509250509250925092565b6000613c8c83836141c5565b60208301905092915050565b613ca1816148bb565b82525050565b613cb8613cb3826148bb565b614a27565b82525050565b6000613cc98261473a565b613cd38185614768565b9350613cde8361472a565b8060005b83811015613d0f578151613cf68882613c80565b9750613d018361475b565b925050600181019050613ce2565b5085935050505092915050565b613d25816148cd565b82525050565b6000613d3682614745565b613d408185614779565b9350613d50818560208601614948565b613d5981614b38565b840191505092915050565b6000613d6f82614750565b613d79818561478a565b9350613d89818560208601614948565b613d9281614b38565b840191505092915050565b6000613da882614750565b613db2818561479b565b9350613dc2818560208601614948565b80840191505092915050565b6000613ddb601c8361478a565b9150613de682614b56565b602082019050919050565b6000613dfe60148361478a565b9150613e0982614b7f565b602082019050919050565b6000613e21602b8361478a565b9150613e2c82614ba8565b604082019050919050565b6000613e44602b8361478a565b9150613e4f82614bf7565b604082019050919050565b6000613e6760328361478a565b9150613e7282614c46565b604082019050919050565b6000613e8a60268361478a565b9150613e9582614c95565b604082019050919050565b6000613ead60258361478a565b9150613eb882614ce4565b604082019050919050565b6000613ed0601c8361478a565b9150613edb82614d33565b602082019050919050565b6000613ef360218361478a565b9150613efe82614d5c565b604082019050919050565b6000613f1660208361478a565b9150613f2182614dab565b602082019050919050565b6000613f3960248361478a565b9150613f4482614dd4565b604082019050919050565b6000613f5c60198361478a565b9150613f6782614e23565b602082019050919050565b6000613f7f601f8361478a565b9150613f8a82614e4c565b602082019050919050565b6000613fa2602c8361478a565b9150613fad82614e75565b604082019050919050565b6000613fc560218361478a565b9150613fd082614ec4565b604082019050919050565b6000613fe860108361478a565b9150613ff382614f13565b602082019050919050565b600061400b60388361478a565b915061401682614f3c565b604082019050919050565b600061402e602a8361478a565b915061403982614f8b565b604082019050919050565b600061405160298361478a565b915061405c82614fda565b604082019050919050565b600061407460208361478a565b915061407f82615029565b602082019050919050565b600061409760318361478a565b91506140a282615052565b604082019050919050565b60006140ba602c8361478a565b91506140c5826150a1565b604082019050919050565b60006140dd60208361478a565b91506140e8826150f0565b602082019050919050565b600061410060168361478a565b915061410b82615119565b602082019050919050565b6000614123602f8361478a565b915061412e82615142565b604082019050919050565b600061414660218361478a565b915061415182615191565b604082019050919050565b600061416960318361478a565b9150614174826151e0565b604082019050919050565b600061418c602c8361478a565b91506141978261522f565b604082019050919050565b60006141af600d8361478a565b91506141ba8261527e565b602082019050919050565b6141ce8161492f565b82525050565b6141dd8161492f565b82525050565b60006141ef8284613ca7565b60148201915081905092915050565b600061420a8285613d9d565b91506142168284613d9d565b91508190509392505050565b60006020820190506142376000830184613c98565b92915050565b60006080820190506142526000830187613c98565b61425f6020830186613c98565b61426c60408301856141d4565b818103606083015261427e8184613d2b565b905095945050505050565b600060208201905081810360008301526142a38184613cbe565b905092915050565b60006020820190506142c06000830184613d1c565b92915050565b600060208201905081810360008301526142e08184613d64565b905092915050565b6000602082019050818103600083015261430181613dce565b9050919050565b6000602082019050818103600083015261432181613df1565b9050919050565b6000602082019050818103600083015261434181613e14565b9050919050565b6000602082019050818103600083015261436181613e37565b9050919050565b6000602082019050818103600083015261438181613e5a565b9050919050565b600060208201905081810360008301526143a181613e7d565b9050919050565b600060208201905081810360008301526143c181613ea0565b9050919050565b600060208201905081810360008301526143e181613ec3565b9050919050565b6000602082019050818103600083015261440181613ee6565b9050919050565b6000602082019050818103600083015261442181613f09565b9050919050565b6000602082019050818103600083015261444181613f2c565b9050919050565b6000602082019050818103600083015261446181613f4f565b9050919050565b6000602082019050818103600083015261448181613f72565b9050919050565b600060208201905081810360008301526144a181613f95565b9050919050565b600060208201905081810360008301526144c181613fb8565b9050919050565b600060208201905081810360008301526144e181613fdb565b9050919050565b6000602082019050818103600083015261450181613ffe565b9050919050565b6000602082019050818103600083015261452181614021565b9050919050565b6000602082019050818103600083015261454181614044565b9050919050565b6000602082019050818103600083015261456181614067565b9050919050565b600060208201905081810360008301526145818161408a565b9050919050565b600060208201905081810360008301526145a1816140ad565b9050919050565b600060208201905081810360008301526145c1816140d0565b9050919050565b600060208201905081810360008301526145e1816140f3565b9050919050565b6000602082019050818103600083015261460181614116565b9050919050565b6000602082019050818103600083015261462181614139565b9050919050565b600060208201905081810360008301526146418161415c565b9050919050565b600060208201905081810360008301526146618161417f565b9050919050565b60006020820190508181036000830152614681816141a2565b9050919050565b600060208201905061469d60008301846141d4565b92915050565b60006146ad6146be565b90506146b982826149ad565b919050565b6000604051905090565b600067ffffffffffffffff8211156146e3576146e2614b09565b5b6146ec82614b38565b9050602081019050919050565b600067ffffffffffffffff82111561471457614713614b09565b5b61471d82614b38565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147b18261492f565b91506147bc8361492f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147f1576147f0614a7c565b5b828201905092915050565b60006148078261492f565b91506148128361492f565b92508261482257614821614aab565b5b828204905092915050565b60006148388261492f565b91506148438361492f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561487c5761487b614a7c565b5b828202905092915050565b60006148928261492f565b915061489d8361492f565b9250828210156148b0576148af614a7c565b5b828203905092915050565b60006148c68261490f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561496657808201518184015260208101905061494b565b83811115614975576000848401525b50505050565b6000600282049050600182168061499357607f821691505b602082108114156149a7576149a6614ada565b5b50919050565b6149b682614b38565b810181811067ffffffffffffffff821117156149d5576149d4614b09565b5b80604052505050565b60006149e98261492f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a1c57614a1b614a7c565b5b600182019050919050565b6000614a3282614a39565b9050919050565b6000614a4482614b49565b9050919050565b6000614a568261492f565b9150614a618361492f565b925082614a7157614a70614aab565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f416464726573732068617320616c726561647920636c61696d65642e00000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204d656d62657273000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e742062756c6c60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5072652073616c65206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6152b0816148bb565b81146152bb57600080fd5b50565b6152c7816148cd565b81146152d257600080fd5b50565b6152de816148d9565b81146152e957600080fd5b50565b6152f5816148e3565b811461530057600080fd5b50565b61530c8161492f565b811461531757600080fd5b5056fea264697066735822122038cfa9ca6bf59496472a39e0e7ce2af70e64d37cb1b424b813fb54428bd0644064736f6c63430008040033

Deployed Bytecode Sourcemap

53736:5533:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59054:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55032:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32306:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33865:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33388:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46126:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54220:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54529:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34615:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45794:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56786:89;;;;;;;;;;;;;:::i;:::-;;54884:140;;;;;;;;;;;;;:::i;:::-;;58419:65;;;;;;;;;;;;;:::i;:::-;;35025:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56883:95;;;;;;;;;;;;;:::i;:::-;;55263:764;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46316:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56683:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8003:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57534:690;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32000:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53991:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31730:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10902:103;;;;;;;;;;;;;:::i;:::-;;58232:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58350:61;;;;;;;;;;;;;:::i;:::-;;56986:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10251:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32475:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34158:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54301:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56035:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35281:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58850:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54705:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53915:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54374:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34384:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54179:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11160:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54075:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59054:212;59193:4;59222:36;59246:11;59222:23;:36::i;:::-;59215:43;;59054:212;;;:::o;55032:223::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55117:11:::1;55131:13;:11;:13::i;:::-;55117:27;;55160:6;55155:93;55176:12;55172:1;:16;55155:93;;;55210:26;55220:3;55234:1;55225:6;:10;;;;:::i;:::-;55210:9;:26::i;:::-;55190:3;;;;;:::i;:::-;;;;55155:93;;;;10542:1;55032:223:::0;;:::o;32306:100::-;32360:13;32393:5;32386:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32306:100;:::o;33865:221::-;33941:7;33969:16;33977:7;33969;:16::i;:::-;33961:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34054:15;:24;34070:7;34054:24;;;;;;;;;;;;;;;;;;;;;34047:31;;33865:221;;;:::o;33388:411::-;33469:13;33485:23;33500:7;33485:14;:23::i;:::-;33469:39;;33533:5;33527:11;;:2;:11;;;;33519:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33627:5;33611:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33636:37;33653:5;33660:12;:10;:12::i;:::-;33636:16;:37::i;:::-;33611:62;33589:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33770:21;33779:2;33783:7;33770:8;:21::i;:::-;33388:411;;;:::o;46126:113::-;46187:7;46214:10;:17;;;;46207:24;;46126:113;:::o;54220:33::-;;;;;;;;;;;;;:::o;54529:32::-;;;;:::o;34615:339::-;34810:41;34829:12;:10;:12::i;:::-;34843:7;34810:18;:41::i;:::-;34802:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34918:28;34928:4;34934:2;34938:7;34918:9;:28::i;:::-;34615:339;;;:::o;45794:256::-;45891:7;45927:23;45944:5;45927:16;:23::i;:::-;45919:5;:31;45911:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46016:12;:19;46029:5;46016:19;;;;;;;;;;;;;;;:26;46036:5;46016:26;;;;;;;;;;;;46009:33;;45794:256;;;;:::o;56786:89::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56855:12:::1;;;;;;;;;;;56854:13;56839:12;;:28;;;;;;;;;;;;;;;;;;56786:89::o:0;54884:140::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54932:12:::1;54947:21;54932:36;;54987:10;54979:28;;:37;55008:7;54979:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;10542:1;54884:140::o:0;58419:65::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58466:10:::1;:8;:10::i;:::-;58419:65::o:0;35025:185::-;35163:39;35180:4;35186:2;35190:7;35163:39;;;;;;;;;;;;:16;:39::i;:::-;35025:185;;;:::o;56883:95::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56957:13:::1;;;;;;;;;;;56956:14;56940:13;;:30;;;;;;;;;;;;;;;;;;56883:95::o:0;55263:764::-;55372:13;;;;;;;;;;;55364:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;55432:16;:28;55449:10;55432:28;;;;;;;;;;;;;;;;;;;;;;;;;55431:29;55423:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;55526:2;55512:11;:16;55504:25;;;;;;55582:11;54036:18;55561:32;;;;:::i;:::-;55548:9;:45;;55540:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;55640:14;55657:13;:11;:13::i;:::-;55640:30;;55681:12;55724:10;55706:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;55696:41;;;;;;55681:56;;55770:50;55789:12;;55770:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55803:10;;55815:4;55770:18;:50::i;:::-;55748:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;55903:4;55872:16;:28;55889:10;55872:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;55923:6;55918:102;55939:11;55935:1;:15;55918:102;;;55972:36;55982:10;56006:1;55994:9;:13;;;;:::i;:::-;55972:9;:36::i;:::-;55952:3;;;;;:::i;:::-;;;;55918:102;;;;55263:764;;;;;:::o;46316:233::-;46391:7;46427:30;:28;:30::i;:::-;46419:5;:38;46411:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46524:10;46535:5;46524:17;;;;;;;;;;;;;;;;;;;;;;;;46517:24;;46316:233;;;:::o;56683:93::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56750:20:::1;56762:7;56750:11;:20::i;:::-;56683:93:::0;:::o;8003:86::-;8050:4;8074:7;;;;;;;;;;;8067:14;;8003:86;:::o;57534:690::-;57610:12;;;;;;;;;;;57602:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57696:1;57679:14;:18;:57;;;;;54116:2;57701:14;:35;;57679:57;57671:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;54165:5;57809:14;57793:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:45;;57785:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;57932:14;53953:18;57918:28;;;;:::i;:::-;57905:9;:41;;57897:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58007:6;58003:212;58023:14;58019:1;:18;58003:212;;;58059:14;58076:13;:11;:13::i;:::-;58059:30;;54165:5;58108:13;:11;:13::i;:::-;:27;58104:100;;;58156:32;58166:10;58178:9;58156;:32::i;:::-;58104:100;58003:212;58039:3;;;;;:::i;:::-;;;;58003:212;;;;57534:690;:::o;32000:239::-;32072:7;32092:13;32108:7;:16;32116:7;32108:16;;;;;;;;;;;;;;;;;;;;;32092:32;;32160:1;32143:19;;:5;:19;;;;32135:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32226:5;32219:12;;;32000:239;;;:::o;53991:63::-;54036:18;53991:63;:::o;31730:208::-;31802:7;31847:1;31830:19;;:5;:19;;;;31822:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31914:9;:16;31924:5;31914:16;;;;;;;;;;;;;;;;31907:23;;31730:208;;;:::o;10902:103::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10967:30:::1;10994:1;10967:18;:30::i;:::-;10902:103::o:0;58232:110::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58320:14:::1;58307:10;:27;;;;58232:110:::0;:::o;58350:61::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58395:8:::1;:6;:8::i;:::-;58350:61::o:0;56986:540::-;57047:16;57077:18;57098:17;57108:6;57098:9;:17::i;:::-;57077:38;;57144:1;57130:10;:15;57126:393;;;57221:1;57207:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57200:23;;;;;57126:393;57256:23;57296:10;57282:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57256:51;;57322:13;57350:130;57374:10;57366:5;:18;57350:130;;;57430:34;57450:6;57458:5;57430:19;:34::i;:::-;57414:6;57421:5;57414:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;57386:7;;;;;:::i;:::-;;;;57350:130;;;57501:6;57494:13;;;;;56986:540;;;;:::o;10251:87::-;10297:7;10324:6;;;;;;;;;;;10317:13;;10251:87;:::o;32475:104::-;32531:13;32564:7;32557:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32475:104;:::o;34158:155::-;34253:52;34272:12;:10;:12::i;:::-;34286:8;34296;34253:18;:52::i;:::-;34158:155;;:::o;54301:42::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56035:403::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56132:11:::1;56146:13;:11;:13::i;:::-;56132:27;;56195:1;56178:14;:18;:53;;;;;56218:13;;56200:14;:31;;56178:53;56170:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;56284:6;56279:95;56300:14;56296:1;:18;56279:95;;;56336:26;56346:3;56360:1;56351:6;:10;;;;:::i;:::-;56336:9;:26::i;:::-;56316:3;;;;;:::i;:::-;;;;56279:95;;;;56416:14;56400:13;;:30;;;;:::i;:::-;56384:13;:46;;;;10542:1;56035:403:::0;;:::o;35281:328::-;35456:41;35475:12;:10;:12::i;:::-;35489:7;35456:18;:41::i;:::-;35448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35562:39;35576:4;35582:2;35586:7;35595:5;35562:13;:39::i;:::-;35281:328;;;;:::o;58850:196::-;58977:13;59015:23;59030:7;59015:14;:23::i;:::-;59008:30;;58850:196;;;:::o;54705:27::-;;;;:::o;53915:56::-;53953:18;53915:56;:::o;54374:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;34384:164::-;34481:4;34505:18;:25;34524:5;34505:25;;;;;;;;;;;;;;;:35;34531:8;34505:35;;;;;;;;;;;;;;;;;;;;;;;;;34498:42;;34384:164;;;;:::o;54179:32::-;;;;;;;;;;;;;:::o;11160:201::-;10482:12;:10;:12::i;:::-;10471:23;;:7;:5;:7::i;:::-;:23;;;10463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11269:1:::1;11249:22;;:8;:22;;;;11241:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11325:28;11344:8;11325:18;:28::i;:::-;11160:201:::0;:::o;54075:43::-;54116:2;54075:43;:::o;54127:::-;54165:5;54127:43;:::o;45486:224::-;45588:4;45627:35;45612:50;;;:11;:50;;;;:90;;;;45666:36;45690:11;45666:23;:36::i;:::-;45612:90;45605:97;;45486:224;;;:::o;6657:98::-;6710:7;6737:10;6730:17;;6657:98;:::o;38103:110::-;38179:26;38189:2;38193:7;38179:26;;;;;;;;;;;;:9;:26::i;:::-;38103:110;;:::o;37119:127::-;37184:4;37236:1;37208:30;;:7;:16;37216:7;37208:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37201:37;;37119:127;;;:::o;41265:174::-;41367:2;41340:15;:24;41356:7;41340:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41423:7;41419:2;41385:46;;41394:23;41409:7;41394:14;:23::i;:::-;41385:46;;;;;;;;;;;;41265:174;;:::o;37413:348::-;37506:4;37531:16;37539:7;37531;:16::i;:::-;37523:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37607:13;37623:23;37638:7;37623:14;:23::i;:::-;37607:39;;37676:5;37665:16;;:7;:16;;;:51;;;;37709:7;37685:31;;:20;37697:7;37685:11;:20::i;:::-;:31;;;37665:51;:87;;;;37720:32;37737:5;37744:7;37720:16;:32::i;:::-;37665:87;37657:96;;;37413:348;;;;:::o;40522:625::-;40681:4;40654:31;;:23;40669:7;40654:14;:23::i;:::-;:31;;;40646:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40760:1;40746:16;;:2;:16;;;;40738:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40816:39;40837:4;40843:2;40847:7;40816:20;:39::i;:::-;40920:29;40937:1;40941:7;40920:8;:29::i;:::-;40981:1;40962:9;:15;40972:4;40962:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41010:1;40993:9;:13;41003:2;40993:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41041:2;41022:7;:16;41030:7;41022:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41080:7;41076:2;41061:27;;41070:4;41061:27;;;;;;;;;;;;41101:38;41121:4;41127:2;41131:7;41101:19;:38::i;:::-;40522:625;;;:::o;9062:120::-;8606:8;:6;:8::i;:::-;8598:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;9131:5:::1;9121:7;;:15;;;;;;;;;;;;;;;;;;9152:22;9161:12;:10;:12::i;:::-;9152:22;;;;;;:::i;:::-;;;;;;;;9062:120::o:0;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;1065:40;;923:190;;;;;:::o;56448:97::-;56532:7;56516:13;:23;;;;;;;;;;;;:::i;:::-;;56448:97;:::o;11521:191::-;11595:16;11614:6;;;;;;;;;;;11595:25;;11640:8;11631:6;;:17;;;;;;;;;;;;;;;;;;11695:8;11664:40;;11685:8;11664:40;;;;;;;;;;;;11521:191;;:::o;8803:118::-;8329:8;:6;:8::i;:::-;8328:9;8320:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;8873:4:::1;8863:7;;:14;;;;;;;;;;;;;;;;;;8893:20;8900:12;:10;:12::i;:::-;8893:20;;;;;;:::i;:::-;;;;;;;;8803:118::o:0;41581:315::-;41736:8;41727:17;;:5;:17;;;;41719:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41823:8;41785:18;:25;41804:5;41785:25;;;;;;;;;;;;;;;:35;41811:8;41785:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41869:8;41847:41;;41862:5;41847:41;;;41879:8;41847:41;;;;;;:::i;:::-;;;;;;;;41581:315;;;:::o;36491:::-;36648:28;36658:4;36664:2;36668:7;36648:9;:28::i;:::-;36695:48;36718:4;36724:2;36728:7;36737:5;36695:22;:48::i;:::-;36687:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36491:315;;;;:::o;52145:679::-;52218:13;52252:16;52260:7;52252;:16::i;:::-;52244:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;52335:23;52361:10;:19;52372:7;52361:19;;;;;;;;;;;52335:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52391:18;52412:10;:8;:10::i;:::-;52391:31;;52520:1;52504:4;52498:18;:23;52494:72;;;52545:9;52538:16;;;;;;52494:72;52696:1;52676:9;52670:23;:27;52666:108;;;52745:4;52751:9;52728:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52714:48;;;;;;52666:108;52793:23;52808:7;52793:14;:23::i;:::-;52786:30;;;;52145:679;;;;:::o;31361:305::-;31463:4;31515:25;31500:40;;;:11;:40;;;;:105;;;;31572:33;31557:48;;;:11;:48;;;;31500:105;:158;;;;31622:36;31646:11;31622:23;:36::i;:::-;31500:158;31480:178;;31361:305;;;:::o;38440:321::-;38570:18;38576:2;38580:7;38570:5;:18::i;:::-;38621:54;38652:1;38656:2;38660:7;38669:5;38621:22;:54::i;:::-;38599:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38440:321;;;:::o;58492:227::-;8329:8;:6;:8::i;:::-;8328:9;8320:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;58666:45:::1;58693:4;58699:2;58703:7;58666:26;:45::i;:::-;58492:227:::0;;;:::o;44343:125::-;;;;:::o;1475:675::-;1558:7;1578:20;1601:4;1578:27;;1621:9;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;;;;;;;;;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;1867:42;1882:12;1896;1867:14;:42::i;:::-;1852:57;;1720:382;;;2044:42;2059:12;2073;2044:14;:42::i;:::-;2029:57;;1720:382;1616:497;1654:3;;;;;:::i;:::-;;;;1616:497;;;;2130:12;2123:19;;;1475:675;;;;:::o;42461:799::-;42616:4;42637:15;:2;:13;;;:15::i;:::-;42633:620;;;42689:2;42673:36;;;42710:12;:10;:12::i;:::-;42724:4;42730:7;42739:5;42673:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42669:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42932:1;42915:6;:13;:18;42911:272;;;42958:60;;;;;;;;;;:::i;:::-;;;;;;;;42911:272;43133:6;43127:13;43118:6;43114:2;43110:15;43103:38;42669:529;42806:41;;;42796:51;;;:6;:51;;;;42789:58;;;;;42633:620;43237:4;43230:11;;42461:799;;;;;;;:::o;56551:100::-;56603:13;56632;56625:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56551:100;:::o;32650:334::-;32723:13;32757:16;32765:7;32757;:16::i;:::-;32749:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32838:21;32862:10;:8;:10::i;:::-;32838:34;;32914:1;32896:7;32890:21;:25;:86;;;;;;;;;;;;;;;;;32942:7;32951:18;:7;:16;:18::i;:::-;32925:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32890:86;32883:93;;;32650:334;;;:::o;23035:157::-;23120:4;23159:25;23144:40;;;:11;:40;;;;23137:47;;23035:157;;;:::o;39097:439::-;39191:1;39177:16;;:2;:16;;;;39169:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39250:16;39258:7;39250;:16::i;:::-;39249:17;39241:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39312:45;39341:1;39345:2;39349:7;39312:20;:45::i;:::-;39387:1;39370:9;:13;39380:2;39370:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39418:2;39399:7;:16;39407:7;39399:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39463:7;39459:2;39438:33;;39455:1;39438:33;;;;;;;;;;;;39484:44;39512:1;39516:2;39520:7;39484:19;:44::i;:::-;39097:439;;:::o;47162:589::-;47306:45;47333:4;47339:2;47343:7;47306:26;:45::i;:::-;47384:1;47368:18;;:4;:18;;;47364:187;;;47403:40;47435:7;47403:31;:40::i;:::-;47364:187;;;47473:2;47465:10;;:4;:10;;;47461:90;;47492:47;47525:4;47531:7;47492:32;:47::i;:::-;47461:90;47364:187;47579:1;47565:16;;:2;:16;;;47561:183;;;47598:45;47635:7;47598:36;:45::i;:::-;47561:183;;;47671:4;47665:10;;:2;:10;;;47661:83;;47692:40;47720:2;47724:7;47692:27;:40::i;:::-;47661:83;47561:183;47162:589;;;:::o;2158:224::-;2226:13;2289:1;2283:4;2276:15;2318:1;2312:4;2305:15;2359:4;2353;2343:21;2334:30;;2261:114;;;;:::o;12952:326::-;13012:4;13269:1;13247:7;:19;;;:23;13240:30;;12952:326;;;:::o;4219:723::-;4275:13;4505:1;4496:5;:10;4492:53;;;4523:10;;;;;;;;;;;;;;;;;;;;;4492:53;4555:12;4570:5;4555:20;;4586:14;4611:78;4626:1;4618:4;:9;4611:78;;4644:8;;;;;:::i;:::-;;;;4675:2;4667:10;;;;;:::i;:::-;;;4611:78;;;4699:19;4731:6;4721:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4699:39;;4749:154;4765:1;4756:5;:10;4749:154;;4793:1;4783:11;;;;;:::i;:::-;;;4860:2;4852:5;:10;;;;:::i;:::-;4839:2;:24;;;;:::i;:::-;4826:39;;4809:6;4816;4809:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;4889:2;4880:11;;;;;:::i;:::-;;;4749:154;;;4927:6;4913:21;;;;;4219:723;;;;:::o;43832:126::-;;;;:::o;48474:164::-;48578:10;:17;;;;48551:15;:24;48567:7;48551:24;;;;;;;;;;;:44;;;;48606:10;48622:7;48606:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48474:164;:::o;49265:988::-;49531:22;49581:1;49556:22;49573:4;49556:16;:22::i;:::-;:26;;;;:::i;:::-;49531:51;;49593:18;49614:17;:26;49632:7;49614:26;;;;;;;;;;;;49593:47;;49761:14;49747:10;:28;49743:328;;49792:19;49814:12;:18;49827:4;49814:18;;;;;;;;;;;;;;;:34;49833:14;49814:34;;;;;;;;;;;;49792:56;;49898:11;49865:12;:18;49878:4;49865:18;;;;;;;;;;;;;;;:30;49884:10;49865:30;;;;;;;;;;;:44;;;;50015:10;49982:17;:30;50000:11;49982:30;;;;;;;;;;;:43;;;;49743:328;;50167:17;:26;50185:7;50167:26;;;;;;;;;;;50160:33;;;50211:12;:18;50224:4;50211:18;;;;;;;;;;;;;;;:34;50230:14;50211:34;;;;;;;;;;;50204:41;;;49265:988;;;;:::o;50548:1079::-;50801:22;50846:1;50826:10;:17;;;;:21;;;;:::i;:::-;50801:46;;50858:18;50879:15;:24;50895:7;50879:24;;;;;;;;;;;;50858:45;;51230:19;51252:10;51263:14;51252:26;;;;;;;;;;;;;;;;;;;;;;;;51230:48;;51316:11;51291:10;51302;51291:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;51427:10;51396:15;:28;51412:11;51396:28;;;;;;;;;;;:41;;;;51568:15;:24;51584:7;51568:24;;;;;;;;;;;51561:31;;;51603:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50548:1079;;;;:::o;48052:221::-;48137:14;48154:20;48171:2;48154:16;:20::i;:::-;48137:37;;48212:7;48185:12;:16;48198:2;48185:16;;;;;;;;;;;;;;;:24;48202:6;48185:24;;;;;;;;;;;:34;;;;48259:6;48230:17;:26;48248:7;48230:26;;;;;;;;;;;:35;;;;48052:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;1427:5;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;1571:5;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;1725:5;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:139::-;2445:5;2483:6;2470:20;2461:29;;2499:33;2526:5;2499:33;:::i;:::-;2451:87;;;;:::o;2544:262::-;2603:6;2652:2;2640:9;2631:7;2627:23;2623:32;2620:2;;;2668:1;2665;2658:12;2620:2;2711:1;2736:53;2781:7;2772:6;2761:9;2757:22;2736:53;:::i;:::-;2726:63;;2682:117;2610:196;;;;:::o;2812:407::-;2880:6;2888;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2996:1;3021:53;3066:7;3057:6;3046:9;3042:22;3021:53;:::i;:::-;3011:63;;2967:117;3123:2;3149:53;3194:7;3185:6;3174:9;3170:22;3149:53;:::i;:::-;3139:63;;3094:118;2895:324;;;;;:::o;3225:552::-;3302:6;3310;3318;3367:2;3355:9;3346:7;3342:23;3338:32;3335:2;;;3383:1;3380;3373:12;3335:2;3426:1;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3397:117;3553:2;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3524:118;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3325:452;;;;;:::o;3783:809::-;3878:6;3886;3894;3902;3951:3;3939:9;3930:7;3926:23;3922:33;3919:2;;;3968:1;3965;3958:12;3919:2;4011:1;4036:53;4081:7;4072:6;4061:9;4057:22;4036:53;:::i;:::-;4026:63;;3982:117;4138:2;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4109:118;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:62;4567:7;4558:6;4547:9;4543:22;4513:62;:::i;:::-;4503:72;;4365:220;3909:683;;;;;;;:::o;4598:401::-;4663:6;4671;4720:2;4708:9;4699:7;4695:23;4691:32;4688:2;;;4736:1;4733;4726:12;4688:2;4779:1;4804:53;4849:7;4840:6;4829:9;4825:22;4804:53;:::i;:::-;4794:63;;4750:117;4906:2;4932:50;4974:7;4965:6;4954:9;4950:22;4932:50;:::i;:::-;4922:60;;4877:115;4678:321;;;;;:::o;5005:407::-;5073:6;5081;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;5146:1;5143;5136:12;5098:2;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;5088:324;;;;;:::o;5418:262::-;5477:6;5526:2;5514:9;5505:7;5501:23;5497:32;5494:2;;;5542:1;5539;5532:12;5494:2;5585:1;5610:53;5655:7;5646:6;5635:9;5631:22;5610:53;:::i;:::-;5600:63;;5556:117;5484:196;;;;:::o;5686:260::-;5744:6;5793:2;5781:9;5772:7;5768:23;5764:32;5761:2;;;5809:1;5806;5799:12;5761:2;5852:1;5877:52;5921:7;5912:6;5901:9;5897:22;5877:52;:::i;:::-;5867:62;;5823:116;5751:195;;;;:::o;5952:282::-;6021:6;6070:2;6058:9;6049:7;6045:23;6041:32;6038:2;;;6086:1;6083;6076:12;6038:2;6129:1;6154:63;6209:7;6200:6;6189:9;6185:22;6154:63;:::i;:::-;6144:73;;6100:127;6028:206;;;;:::o;6240:375::-;6309:6;6358:2;6346:9;6337:7;6333:23;6329:32;6326:2;;;6374:1;6371;6364:12;6326:2;6445:1;6434:9;6430:17;6417:31;6475:18;6467:6;6464:30;6461:2;;;6507:1;6504;6497:12;6461:2;6535:63;6590:7;6581:6;6570:9;6566:22;6535:63;:::i;:::-;6525:73;;6388:220;6316:299;;;;:::o;6621:262::-;6680:6;6729:2;6717:9;6708:7;6704:23;6700:32;6697:2;;;6745:1;6742;6735:12;6697:2;6788:1;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;:::i;:::-;6803:63;;6759:117;6687:196;;;;:::o;6889:570::-;6984:6;6992;7000;7049:2;7037:9;7028:7;7024:23;7020:32;7017:2;;;7065:1;7062;7055:12;7017:2;7108:1;7133:53;7178:7;7169:6;7158:9;7154:22;7133:53;:::i;:::-;7123:63;;7079:117;7263:2;7252:9;7248:18;7235:32;7294:18;7286:6;7283:30;7280:2;;;7326:1;7323;7316:12;7280:2;7362:80;7434:7;7425:6;7414:9;7410:22;7362:80;:::i;:::-;7344:98;;;;7206:246;7007:452;;;;;:::o;7465:179::-;7534:10;7555:46;7597:3;7589:6;7555:46;:::i;:::-;7633:4;7628:3;7624:14;7610:28;;7545:99;;;;:::o;7650:118::-;7737:24;7755:5;7737:24;:::i;:::-;7732:3;7725:37;7715:53;;:::o;7774:157::-;7879:45;7899:24;7917:5;7899:24;:::i;:::-;7879:45;:::i;:::-;7874:3;7867:58;7857:74;;:::o;7967:732::-;8086:3;8115:54;8163:5;8115:54;:::i;:::-;8185:86;8264:6;8259:3;8185:86;:::i;:::-;8178:93;;8295:56;8345:5;8295:56;:::i;:::-;8374:7;8405:1;8390:284;8415:6;8412:1;8409:13;8390:284;;;8491:6;8485:13;8518:63;8577:3;8562:13;8518:63;:::i;:::-;8511:70;;8604:60;8657:6;8604:60;:::i;:::-;8594:70;;8450:224;8437:1;8434;8430:9;8425:14;;8390:284;;;8394:14;8690:3;8683:10;;8091:608;;;;;;;:::o;8705:109::-;8786:21;8801:5;8786:21;:::i;:::-;8781:3;8774:34;8764:50;;:::o;8820:360::-;8906:3;8934:38;8966:5;8934:38;:::i;:::-;8988:70;9051:6;9046:3;8988:70;:::i;:::-;8981:77;;9067:52;9112:6;9107:3;9100:4;9093:5;9089:16;9067:52;:::i;:::-;9144:29;9166:6;9144:29;:::i;:::-;9139:3;9135:39;9128:46;;8910:270;;;;;:::o;9186:364::-;9274:3;9302:39;9335:5;9302:39;:::i;:::-;9357:71;9421:6;9416:3;9357:71;:::i;:::-;9350:78;;9437:52;9482:6;9477:3;9470:4;9463:5;9459:16;9437:52;:::i;:::-;9514:29;9536:6;9514:29;:::i;:::-;9509:3;9505:39;9498:46;;9278:272;;;;;:::o;9556:377::-;9662:3;9690:39;9723:5;9690:39;:::i;:::-;9745:89;9827:6;9822:3;9745:89;:::i;:::-;9738:96;;9843:52;9888:6;9883:3;9876:4;9869:5;9865:16;9843:52;:::i;:::-;9920:6;9915:3;9911:16;9904:23;;9666:267;;;;;:::o;9939:366::-;10081:3;10102:67;10166:2;10161:3;10102:67;:::i;:::-;10095:74;;10178:93;10267:3;10178:93;:::i;:::-;10296:2;10291:3;10287:12;10280:19;;10085:220;;;:::o;10311:366::-;10453:3;10474:67;10538:2;10533:3;10474:67;:::i;:::-;10467:74;;10550:93;10639:3;10550:93;:::i;:::-;10668:2;10663:3;10659:12;10652:19;;10457:220;;;:::o;10683:366::-;10825:3;10846:67;10910:2;10905:3;10846:67;:::i;:::-;10839:74;;10922:93;11011:3;10922:93;:::i;:::-;11040:2;11035:3;11031:12;11024:19;;10829:220;;;:::o;11055:366::-;11197:3;11218:67;11282:2;11277:3;11218:67;:::i;:::-;11211:74;;11294:93;11383:3;11294:93;:::i;:::-;11412:2;11407:3;11403:12;11396:19;;11201:220;;;:::o;11427:366::-;11569:3;11590:67;11654:2;11649:3;11590:67;:::i;:::-;11583:74;;11666:93;11755:3;11666:93;:::i;:::-;11784:2;11779:3;11775:12;11768:19;;11573:220;;;:::o;11799:366::-;11941:3;11962:67;12026:2;12021:3;11962:67;:::i;:::-;11955:74;;12038:93;12127:3;12038:93;:::i;:::-;12156:2;12151:3;12147:12;12140:19;;11945:220;;;:::o;12171:366::-;12313:3;12334:67;12398:2;12393:3;12334:67;:::i;:::-;12327:74;;12410:93;12499:3;12410:93;:::i;:::-;12528:2;12523:3;12519:12;12512:19;;12317:220;;;:::o;12543:366::-;12685:3;12706:67;12770:2;12765:3;12706:67;:::i;:::-;12699:74;;12782:93;12871:3;12782:93;:::i;:::-;12900:2;12895:3;12891:12;12884:19;;12689:220;;;:::o;12915:366::-;13057:3;13078:67;13142:2;13137:3;13078:67;:::i;:::-;13071:74;;13154:93;13243:3;13154:93;:::i;:::-;13272:2;13267:3;13263:12;13256:19;;13061:220;;;:::o;13287:366::-;13429:3;13450:67;13514:2;13509:3;13450:67;:::i;:::-;13443:74;;13526:93;13615:3;13526:93;:::i;:::-;13644:2;13639:3;13635:12;13628:19;;13433:220;;;:::o;13659:366::-;13801:3;13822:67;13886:2;13881:3;13822:67;:::i;:::-;13815:74;;13898:93;13987:3;13898:93;:::i;:::-;14016:2;14011:3;14007:12;14000:19;;13805:220;;;:::o;14031:366::-;14173:3;14194:67;14258:2;14253:3;14194:67;:::i;:::-;14187:74;;14270:93;14359:3;14270:93;:::i;:::-;14388:2;14383:3;14379:12;14372:19;;14177:220;;;:::o;14403:366::-;14545:3;14566:67;14630:2;14625:3;14566:67;:::i;:::-;14559:74;;14642:93;14731:3;14642:93;:::i;:::-;14760:2;14755:3;14751:12;14744:19;;14549:220;;;:::o;14775:366::-;14917:3;14938:67;15002:2;14997:3;14938:67;:::i;:::-;14931:74;;15014:93;15103:3;15014:93;:::i;:::-;15132:2;15127:3;15123:12;15116:19;;14921:220;;;:::o;15147:366::-;15289:3;15310:67;15374:2;15369:3;15310:67;:::i;:::-;15303:74;;15386:93;15475:3;15386:93;:::i;:::-;15504:2;15499:3;15495:12;15488:19;;15293:220;;;:::o;15519:366::-;15661:3;15682:67;15746:2;15741:3;15682:67;:::i;:::-;15675:74;;15758:93;15847:3;15758:93;:::i;:::-;15876:2;15871:3;15867:12;15860:19;;15665:220;;;:::o;15891:366::-;16033:3;16054:67;16118:2;16113:3;16054:67;:::i;:::-;16047:74;;16130:93;16219:3;16130:93;:::i;:::-;16248:2;16243:3;16239:12;16232:19;;16037:220;;;:::o;16263:366::-;16405:3;16426:67;16490:2;16485:3;16426:67;:::i;:::-;16419:74;;16502:93;16591:3;16502:93;:::i;:::-;16620:2;16615:3;16611:12;16604:19;;16409:220;;;:::o;16635:366::-;16777:3;16798:67;16862:2;16857:3;16798:67;:::i;:::-;16791:74;;16874:93;16963:3;16874:93;:::i;:::-;16992:2;16987:3;16983:12;16976:19;;16781:220;;;:::o;17007:366::-;17149:3;17170:67;17234:2;17229:3;17170:67;:::i;:::-;17163:74;;17246:93;17335:3;17246:93;:::i;:::-;17364:2;17359:3;17355:12;17348:19;;17153:220;;;:::o;17379:366::-;17521:3;17542:67;17606:2;17601:3;17542:67;:::i;:::-;17535:74;;17618:93;17707:3;17618:93;:::i;:::-;17736:2;17731:3;17727:12;17720:19;;17525:220;;;:::o;17751:366::-;17893:3;17914:67;17978:2;17973:3;17914:67;:::i;:::-;17907:74;;17990:93;18079:3;17990:93;:::i;:::-;18108:2;18103:3;18099:12;18092:19;;17897:220;;;:::o;18123:366::-;18265:3;18286:67;18350:2;18345:3;18286:67;:::i;:::-;18279:74;;18362:93;18451:3;18362:93;:::i;:::-;18480:2;18475:3;18471:12;18464:19;;18269:220;;;:::o;18495:366::-;18637:3;18658:67;18722:2;18717:3;18658:67;:::i;:::-;18651:74;;18734:93;18823:3;18734:93;:::i;:::-;18852:2;18847:3;18843:12;18836:19;;18641:220;;;:::o;18867:366::-;19009:3;19030:67;19094:2;19089:3;19030:67;:::i;:::-;19023:74;;19106:93;19195:3;19106:93;:::i;:::-;19224:2;19219:3;19215:12;19208:19;;19013:220;;;:::o;19239:366::-;19381:3;19402:67;19466:2;19461:3;19402:67;:::i;:::-;19395:74;;19478:93;19567:3;19478:93;:::i;:::-;19596:2;19591:3;19587:12;19580:19;;19385:220;;;:::o;19611:366::-;19753:3;19774:67;19838:2;19833:3;19774:67;:::i;:::-;19767:74;;19850:93;19939:3;19850:93;:::i;:::-;19968:2;19963:3;19959:12;19952:19;;19757:220;;;:::o;19983:366::-;20125:3;20146:67;20210:2;20205:3;20146:67;:::i;:::-;20139:74;;20222:93;20311:3;20222:93;:::i;:::-;20340:2;20335:3;20331:12;20324:19;;20129:220;;;:::o;20355:366::-;20497:3;20518:67;20582:2;20577:3;20518:67;:::i;:::-;20511:74;;20594:93;20683:3;20594:93;:::i;:::-;20712:2;20707:3;20703:12;20696:19;;20501:220;;;:::o;20727:108::-;20804:24;20822:5;20804:24;:::i;:::-;20799:3;20792:37;20782:53;;:::o;20841:118::-;20928:24;20946:5;20928:24;:::i;:::-;20923:3;20916:37;20906:53;;:::o;20965:256::-;21077:3;21092:75;21163:3;21154:6;21092:75;:::i;:::-;21192:2;21187:3;21183:12;21176:19;;21212:3;21205:10;;21081:140;;;;:::o;21227:435::-;21407:3;21429:95;21520:3;21511:6;21429:95;:::i;:::-;21422:102;;21541:95;21632:3;21623:6;21541:95;:::i;:::-;21534:102;;21653:3;21646:10;;21411:251;;;;;:::o;21668:222::-;21761:4;21799:2;21788:9;21784:18;21776:26;;21812:71;21880:1;21869:9;21865:17;21856:6;21812:71;:::i;:::-;21766:124;;;;:::o;21896:640::-;22091:4;22129:3;22118:9;22114:19;22106:27;;22143:71;22211:1;22200:9;22196:17;22187:6;22143:71;:::i;:::-;22224:72;22292:2;22281:9;22277:18;22268:6;22224:72;:::i;:::-;22306;22374:2;22363:9;22359:18;22350:6;22306:72;:::i;:::-;22425:9;22419:4;22415:20;22410:2;22399:9;22395:18;22388:48;22453:76;22524:4;22515:6;22453:76;:::i;:::-;22445:84;;22096:440;;;;;;;:::o;22542:373::-;22685:4;22723:2;22712:9;22708:18;22700:26;;22772:9;22766:4;22762:20;22758:1;22747:9;22743:17;22736:47;22800:108;22903:4;22894:6;22800:108;:::i;:::-;22792:116;;22690:225;;;;:::o;22921:210::-;23008:4;23046:2;23035:9;23031:18;23023:26;;23059:65;23121:1;23110:9;23106:17;23097:6;23059:65;:::i;:::-;23013:118;;;;:::o;23137:313::-;23250:4;23288:2;23277:9;23273:18;23265:26;;23337:9;23331:4;23327:20;23323:1;23312:9;23308:17;23301:47;23365:78;23438:4;23429:6;23365:78;:::i;:::-;23357:86;;23255:195;;;;:::o;23456:419::-;23622:4;23660:2;23649:9;23645:18;23637:26;;23709:9;23703:4;23699:20;23695:1;23684:9;23680:17;23673:47;23737:131;23863:4;23737:131;:::i;:::-;23729:139;;23627:248;;;:::o;23881:419::-;24047:4;24085:2;24074:9;24070:18;24062:26;;24134:9;24128:4;24124:20;24120:1;24109:9;24105:17;24098:47;24162:131;24288:4;24162:131;:::i;:::-;24154:139;;24052:248;;;:::o;24306:419::-;24472:4;24510:2;24499:9;24495:18;24487:26;;24559:9;24553:4;24549:20;24545:1;24534:9;24530:17;24523:47;24587:131;24713:4;24587:131;:::i;:::-;24579:139;;24477:248;;;:::o;24731:419::-;24897:4;24935:2;24924:9;24920:18;24912:26;;24984:9;24978:4;24974:20;24970:1;24959:9;24955:17;24948:47;25012:131;25138:4;25012:131;:::i;:::-;25004:139;;24902:248;;;:::o;25156:419::-;25322:4;25360:2;25349:9;25345:18;25337:26;;25409:9;25403:4;25399:20;25395:1;25384:9;25380:17;25373:47;25437:131;25563:4;25437:131;:::i;:::-;25429:139;;25327:248;;;:::o;25581:419::-;25747:4;25785:2;25774:9;25770:18;25762:26;;25834:9;25828:4;25824:20;25820:1;25809:9;25805:17;25798:47;25862:131;25988:4;25862:131;:::i;:::-;25854:139;;25752:248;;;:::o;26006:419::-;26172:4;26210:2;26199:9;26195:18;26187:26;;26259:9;26253:4;26249:20;26245:1;26234:9;26230:17;26223:47;26287:131;26413:4;26287:131;:::i;:::-;26279:139;;26177:248;;;:::o;26431:419::-;26597:4;26635:2;26624:9;26620:18;26612:26;;26684:9;26678:4;26674:20;26670:1;26659:9;26655:17;26648:47;26712:131;26838:4;26712:131;:::i;:::-;26704:139;;26602:248;;;:::o;26856:419::-;27022:4;27060:2;27049:9;27045:18;27037:26;;27109:9;27103:4;27099:20;27095:1;27084:9;27080:17;27073:47;27137:131;27263:4;27137:131;:::i;:::-;27129:139;;27027:248;;;:::o;27281:419::-;27447:4;27485:2;27474:9;27470:18;27462:26;;27534:9;27528:4;27524:20;27520:1;27509:9;27505:17;27498:47;27562:131;27688:4;27562:131;:::i;:::-;27554:139;;27452:248;;;:::o;27706:419::-;27872:4;27910:2;27899:9;27895:18;27887:26;;27959:9;27953:4;27949:20;27945:1;27934:9;27930:17;27923:47;27987:131;28113:4;27987:131;:::i;:::-;27979:139;;27877:248;;;:::o;28131:419::-;28297:4;28335:2;28324:9;28320:18;28312:26;;28384:9;28378:4;28374:20;28370:1;28359:9;28355:17;28348:47;28412:131;28538:4;28412:131;:::i;:::-;28404:139;;28302:248;;;:::o;28556:419::-;28722:4;28760:2;28749:9;28745:18;28737:26;;28809:9;28803:4;28799:20;28795:1;28784:9;28780:17;28773:47;28837:131;28963:4;28837:131;:::i;:::-;28829:139;;28727:248;;;:::o;28981:419::-;29147:4;29185:2;29174:9;29170:18;29162:26;;29234:9;29228:4;29224:20;29220:1;29209:9;29205:17;29198:47;29262:131;29388:4;29262:131;:::i;:::-;29254:139;;29152:248;;;:::o;29406:419::-;29572:4;29610:2;29599:9;29595:18;29587:26;;29659:9;29653:4;29649:20;29645:1;29634:9;29630:17;29623:47;29687:131;29813:4;29687:131;:::i;:::-;29679:139;;29577:248;;;:::o;29831:419::-;29997:4;30035:2;30024:9;30020:18;30012:26;;30084:9;30078:4;30074:20;30070:1;30059:9;30055:17;30048:47;30112:131;30238:4;30112:131;:::i;:::-;30104:139;;30002:248;;;:::o;30256:419::-;30422:4;30460:2;30449:9;30445:18;30437:26;;30509:9;30503:4;30499:20;30495:1;30484:9;30480:17;30473:47;30537:131;30663:4;30537:131;:::i;:::-;30529:139;;30427:248;;;:::o;30681:419::-;30847:4;30885:2;30874:9;30870:18;30862:26;;30934:9;30928:4;30924:20;30920:1;30909:9;30905:17;30898:47;30962:131;31088:4;30962:131;:::i;:::-;30954:139;;30852:248;;;:::o;31106:419::-;31272:4;31310:2;31299:9;31295:18;31287:26;;31359:9;31353:4;31349:20;31345:1;31334:9;31330:17;31323:47;31387:131;31513:4;31387:131;:::i;:::-;31379:139;;31277:248;;;:::o;31531:419::-;31697:4;31735:2;31724:9;31720:18;31712:26;;31784:9;31778:4;31774:20;31770:1;31759:9;31755:17;31748:47;31812:131;31938:4;31812:131;:::i;:::-;31804:139;;31702:248;;;:::o;31956:419::-;32122:4;32160:2;32149:9;32145:18;32137:26;;32209:9;32203:4;32199:20;32195:1;32184:9;32180:17;32173:47;32237:131;32363:4;32237:131;:::i;:::-;32229:139;;32127:248;;;:::o;32381:419::-;32547:4;32585:2;32574:9;32570:18;32562:26;;32634:9;32628:4;32624:20;32620:1;32609:9;32605:17;32598:47;32662:131;32788:4;32662:131;:::i;:::-;32654:139;;32552:248;;;:::o;32806:419::-;32972:4;33010:2;32999:9;32995:18;32987:26;;33059:9;33053:4;33049:20;33045:1;33034:9;33030:17;33023:47;33087:131;33213:4;33087:131;:::i;:::-;33079:139;;32977:248;;;:::o;33231:419::-;33397:4;33435:2;33424:9;33420:18;33412:26;;33484:9;33478:4;33474:20;33470:1;33459:9;33455:17;33448:47;33512:131;33638:4;33512:131;:::i;:::-;33504:139;;33402:248;;;:::o;33656:419::-;33822:4;33860:2;33849:9;33845:18;33837:26;;33909:9;33903:4;33899:20;33895:1;33884:9;33880:17;33873:47;33937:131;34063:4;33937:131;:::i;:::-;33929:139;;33827:248;;;:::o;34081:419::-;34247:4;34285:2;34274:9;34270:18;34262:26;;34334:9;34328:4;34324:20;34320:1;34309:9;34305:17;34298:47;34362:131;34488:4;34362:131;:::i;:::-;34354:139;;34252:248;;;:::o;34506:419::-;34672:4;34710:2;34699:9;34695:18;34687:26;;34759:9;34753:4;34749:20;34745:1;34734:9;34730:17;34723:47;34787:131;34913:4;34787:131;:::i;:::-;34779:139;;34677:248;;;:::o;34931:419::-;35097:4;35135:2;35124:9;35120:18;35112:26;;35184:9;35178:4;35174:20;35170:1;35159:9;35155:17;35148:47;35212:131;35338:4;35212:131;:::i;:::-;35204:139;;35102:248;;;:::o;35356:419::-;35522:4;35560:2;35549:9;35545:18;35537:26;;35609:9;35603:4;35599:20;35595:1;35584:9;35580:17;35573:47;35637:131;35763:4;35637:131;:::i;:::-;35629:139;;35527:248;;;:::o;35781:222::-;35874:4;35912:2;35901:9;35897:18;35889:26;;35925:71;35993:1;35982:9;35978:17;35969:6;35925:71;:::i;:::-;35879:124;;;;:::o;36009:129::-;36043:6;36070:20;;:::i;:::-;36060:30;;36099:33;36127:4;36119:6;36099:33;:::i;:::-;36050:88;;;:::o;36144:75::-;36177:6;36210:2;36204:9;36194:19;;36184:35;:::o;36225:307::-;36286:4;36376:18;36368:6;36365:30;36362:2;;;36398:18;;:::i;:::-;36362:2;36436:29;36458:6;36436:29;:::i;:::-;36428:37;;36520:4;36514;36510:15;36502:23;;36291:241;;;:::o;36538:308::-;36600:4;36690:18;36682:6;36679:30;36676:2;;;36712:18;;:::i;:::-;36676:2;36750:29;36772:6;36750:29;:::i;:::-;36742:37;;36834:4;36828;36824:15;36816:23;;36605:241;;;:::o;36852:132::-;36919:4;36942:3;36934:11;;36972:4;36967:3;36963:14;36955:22;;36924:60;;;:::o;36990:114::-;37057:6;37091:5;37085:12;37075:22;;37064:40;;;:::o;37110:98::-;37161:6;37195:5;37189:12;37179:22;;37168:40;;;:::o;37214:99::-;37266:6;37300:5;37294:12;37284:22;;37273:40;;;:::o;37319:113::-;37389:4;37421;37416:3;37412:14;37404:22;;37394:38;;;:::o;37438:184::-;37537:11;37571:6;37566:3;37559:19;37611:4;37606:3;37602:14;37587:29;;37549:73;;;;:::o;37628:168::-;37711:11;37745:6;37740:3;37733:19;37785:4;37780:3;37776:14;37761:29;;37723:73;;;;:::o;37802:169::-;37886:11;37920:6;37915:3;37908:19;37960:4;37955:3;37951:14;37936:29;;37898:73;;;;:::o;37977:148::-;38079:11;38116:3;38101:18;;38091:34;;;;:::o;38131:305::-;38171:3;38190:20;38208:1;38190:20;:::i;:::-;38185:25;;38224:20;38242:1;38224:20;:::i;:::-;38219:25;;38378:1;38310:66;38306:74;38303:1;38300:81;38297:2;;;38384:18;;:::i;:::-;38297:2;38428:1;38425;38421:9;38414:16;;38175:261;;;;:::o;38442:185::-;38482:1;38499:20;38517:1;38499:20;:::i;:::-;38494:25;;38533:20;38551:1;38533:20;:::i;:::-;38528:25;;38572:1;38562:2;;38577:18;;:::i;:::-;38562:2;38619:1;38616;38612:9;38607:14;;38484:143;;;;:::o;38633:348::-;38673:7;38696:20;38714:1;38696:20;:::i;:::-;38691:25;;38730:20;38748:1;38730:20;:::i;:::-;38725:25;;38918:1;38850:66;38846:74;38843:1;38840:81;38835:1;38828:9;38821:17;38817:105;38814:2;;;38925:18;;:::i;:::-;38814:2;38973:1;38970;38966:9;38955:20;;38681:300;;;;:::o;38987:191::-;39027:4;39047:20;39065:1;39047:20;:::i;:::-;39042:25;;39081:20;39099:1;39081:20;:::i;:::-;39076:25;;39120:1;39117;39114:8;39111:2;;;39125:18;;:::i;:::-;39111:2;39170:1;39167;39163:9;39155:17;;39032:146;;;;:::o;39184:96::-;39221:7;39250:24;39268:5;39250:24;:::i;:::-;39239:35;;39229:51;;;:::o;39286:90::-;39320:7;39363:5;39356:13;39349:21;39338:32;;39328:48;;;:::o;39382:77::-;39419:7;39448:5;39437:16;;39427:32;;;:::o;39465:149::-;39501:7;39541:66;39534:5;39530:78;39519:89;;39509:105;;;:::o;39620:126::-;39657:7;39697:42;39690:5;39686:54;39675:65;;39665:81;;;:::o;39752:77::-;39789:7;39818:5;39807:16;;39797:32;;;:::o;39835:154::-;39919:6;39914:3;39909;39896:30;39981:1;39972:6;39967:3;39963:16;39956:27;39886:103;;;:::o;39995:307::-;40063:1;40073:113;40087:6;40084:1;40081:13;40073:113;;;40172:1;40167:3;40163:11;40157:18;40153:1;40148:3;40144:11;40137:39;40109:2;40106:1;40102:10;40097:15;;40073:113;;;40204:6;40201:1;40198:13;40195:2;;;40284:1;40275:6;40270:3;40266:16;40259:27;40195:2;40044:258;;;;:::o;40308:320::-;40352:6;40389:1;40383:4;40379:12;40369:22;;40436:1;40430:4;40426:12;40457:18;40447:2;;40513:4;40505:6;40501:17;40491:27;;40447:2;40575;40567:6;40564:14;40544:18;40541:38;40538:2;;;40594:18;;:::i;:::-;40538:2;40359:269;;;;:::o;40634:281::-;40717:27;40739:4;40717:27;:::i;:::-;40709:6;40705:40;40847:6;40835:10;40832:22;40811:18;40799:10;40796:34;40793:62;40790:2;;;40858:18;;:::i;:::-;40790:2;40898:10;40894:2;40887:22;40677:238;;;:::o;40921:233::-;40960:3;40983:24;41001:5;40983:24;:::i;:::-;40974:33;;41029:66;41022:5;41019:77;41016:2;;;41099:18;;:::i;:::-;41016:2;41146:1;41139:5;41135:13;41128:20;;40964:190;;;:::o;41160:100::-;41199:7;41228:26;41248:5;41228:26;:::i;:::-;41217:37;;41207:53;;;:::o;41266:94::-;41305:7;41334:20;41348:5;41334:20;:::i;:::-;41323:31;;41313:47;;;:::o;41366:176::-;41398:1;41415:20;41433:1;41415:20;:::i;:::-;41410:25;;41449:20;41467:1;41449:20;:::i;:::-;41444:25;;41488:1;41478:2;;41493:18;;:::i;:::-;41478:2;41534:1;41531;41527:9;41522:14;;41400:142;;;;:::o;41548:180::-;41596:77;41593:1;41586:88;41693:4;41690:1;41683:15;41717:4;41714:1;41707:15;41734:180;41782:77;41779:1;41772:88;41879:4;41876:1;41869:15;41903:4;41900:1;41893:15;41920:180;41968:77;41965:1;41958:88;42065:4;42062:1;42055:15;42089:4;42086:1;42079:15;42106:180;42154:77;42151:1;42144:88;42251:4;42248:1;42241:15;42275:4;42272:1;42265:15;42292:102;42333:6;42384:2;42380:7;42375:2;42368:5;42364:14;42360:28;42350:38;;42340:54;;;:::o;42400:94::-;42433:8;42481:5;42477:2;42473:14;42452:35;;42442:52;;;:::o;42500:178::-;42640:30;42636:1;42628:6;42624:14;42617:54;42606:72;:::o;42684:170::-;42824:22;42820:1;42812:6;42808:14;42801:46;42790:64;:::o;42860:230::-;43000:34;42996:1;42988:6;42984:14;42977:58;43069:13;43064:2;43056:6;43052:15;43045:38;42966:124;:::o;43096:230::-;43236:34;43232:1;43224:6;43220:14;43213:58;43305:13;43300:2;43292:6;43288:15;43281:38;43202:124;:::o;43332:237::-;43472:34;43468:1;43460:6;43456:14;43449:58;43541:20;43536:2;43528:6;43524:15;43517:45;43438:131;:::o;43575:225::-;43715:34;43711:1;43703:6;43699:14;43692:58;43784:8;43779:2;43771:6;43767:15;43760:33;43681:119;:::o;43806:224::-;43946:34;43942:1;43934:6;43930:14;43923:58;44015:7;44010:2;44002:6;43998:15;43991:32;43912:118;:::o;44036:178::-;44176:30;44172:1;44164:6;44160:14;44153:54;44142:72;:::o;44220:220::-;44360:34;44356:1;44348:6;44344:14;44337:58;44429:3;44424:2;44416:6;44412:15;44405:28;44326:114;:::o;44446:182::-;44586:34;44582:1;44574:6;44570:14;44563:58;44552:76;:::o;44634:223::-;44774:34;44770:1;44762:6;44758:14;44751:58;44843:6;44838:2;44830:6;44826:15;44819:31;44740:117;:::o;44863:175::-;45003:27;44999:1;44991:6;44987:14;44980:51;44969:69;:::o;45044:181::-;45184:33;45180:1;45172:6;45168:14;45161:57;45150:75;:::o;45231:231::-;45371:34;45367:1;45359:6;45355:14;45348:58;45440:14;45435:2;45427:6;45423:15;45416:39;45337:125;:::o;45468:220::-;45608:34;45604:1;45596:6;45592:14;45585:58;45677:3;45672:2;45664:6;45660:15;45653:28;45574:114;:::o;45694:166::-;45834:18;45830:1;45822:6;45818:14;45811:42;45800:60;:::o;45866:243::-;46006:34;46002:1;45994:6;45990:14;45983:58;46075:26;46070:2;46062:6;46058:15;46051:51;45972:137;:::o;46115:229::-;46255:34;46251:1;46243:6;46239:14;46232:58;46324:12;46319:2;46311:6;46307:15;46300:37;46221:123;:::o;46350:228::-;46490:34;46486:1;46478:6;46474:14;46467:58;46559:11;46554:2;46546:6;46542:15;46535:36;46456:122;:::o;46584:182::-;46724:34;46720:1;46712:6;46708:14;46701:58;46690:76;:::o;46772:236::-;46912:34;46908:1;46900:6;46896:14;46889:58;46981:19;46976:2;46968:6;46964:15;46957:44;46878:130;:::o;47014:231::-;47154:34;47150:1;47142:6;47138:14;47131:58;47223:14;47218:2;47210:6;47206:15;47199:39;47120:125;:::o;47251:182::-;47391:34;47387:1;47379:6;47375:14;47368:58;47357:76;:::o;47439:172::-;47579:24;47575:1;47567:6;47563:14;47556:48;47545:66;:::o;47617:234::-;47757:34;47753:1;47745:6;47741:14;47734:58;47826:17;47821:2;47813:6;47809:15;47802:42;47723:128;:::o;47857:220::-;47997:34;47993:1;47985:6;47981:14;47974:58;48066:3;48061:2;48053:6;48049:15;48042:28;47963:114;:::o;48083:236::-;48223:34;48219:1;48211:6;48207:14;48200:58;48292:19;48287:2;48279:6;48275:15;48268:44;48189:130;:::o;48325:231::-;48465:34;48461:1;48453:6;48449:14;48442:58;48534:14;48529:2;48521:6;48517:15;48510:39;48431:125;:::o;48562:163::-;48702:15;48698:1;48690:6;48686:14;48679:39;48668:57;:::o;48731:122::-;48804:24;48822:5;48804:24;:::i;:::-;48797:5;48794:35;48784:2;;48843:1;48840;48833:12;48784:2;48774:79;:::o;48859:116::-;48929:21;48944:5;48929:21;:::i;:::-;48922:5;48919:32;48909:2;;48965:1;48962;48955:12;48909:2;48899:76;:::o;48981:122::-;49054:24;49072:5;49054:24;:::i;:::-;49047:5;49044:35;49034:2;;49093:1;49090;49083:12;49034:2;49024:79;:::o;49109:120::-;49181:23;49198:5;49181:23;:::i;:::-;49174:5;49171:34;49161:2;;49219:1;49216;49209:12;49161:2;49151:78;:::o;49235:122::-;49308:24;49326:5;49308:24;:::i;:::-;49301:5;49298:35;49288:2;;49347:1;49344;49337:12;49288:2;49278:79;:::o

Swarm Source

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