ETH Price: $2,696.26 (-1.78%)

Token

YommsFrens (YF)
 

Overview

Max Total Supply

0 YF

Holders

55

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 YF
0x98f081894c66d2bd0e9d0bca5bccbe9b886fb24f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
YommsFrens

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-08-08
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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.7.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
                /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` 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: contract-e435d65d5b.sol



pragma solidity ^0.8.4;




contract YommsFrens is ERC721, Ownable {
    uint256 public maxSupply;
    uint256 public raffleMintPerWallet;
    uint256 public raffleMintPrice;
    uint256 public raffleMaxSupply;
    uint256 public whitelistMintPerWallet;
    uint256 public whitelistMintPrice;
    uint256 public whitelistMaxSupply;
    uint256 public publicMintPerWallet;
    uint256 public publicMintPrice;
    uint256 public tokenCounter;
    uint256 public vault;

    string public baseURI; // initialize

    bytes32 private raffleRoot; // initialize
    bytes32 private whitelistRoot; // initialize
    bytes32 private specialWhitelistRoot; // initialize

    enum ContractState {
        Open,
        Closed
    }

    enum MintState {
        Empty,
        Raffle,
        Whitelist,
        Public
    }

    ContractState public contractState;
    MintState public mintState;

    constructor() ERC721("YommsFrens", "YF") {
        maxSupply = 696;
        raffleMintPerWallet = 2;
        raffleMintPrice = 0.04 ether;
        raffleMaxSupply = 398;
        whitelistMintPerWallet = 1;
        whitelistMintPrice = 0.03 ether;
        whitelistMaxSupply = 229;
        publicMintPerWallet = 2;
        publicMintPrice = 0.04 ether;
        tokenCounter = 0;
        vault = 69;

        baseURI = "ipfs://bafybeigyydiivf46lkpzm3npijlrrszxqc742arvgxn2t6bobzswcv45ra/"; // initialize
        raffleRoot = 0x8c02f23dcea44595c84be7e7552a6b6d6eadb22b6bedb9fd418f94b2e1c97867; // initialize
        whitelistRoot = 0xf00289e04fc9e9e4718225499b1df6c4f5aeae259e4ec5c366d320c5e5a5921c; // initialize
        specialWhitelistRoot = 0x550ca12a1d40e8963e65f1e20ca955d0f4a4f9968ea1cf4c4a6624e6dd35478b; // initialize

        contractState = ContractState.Closed;
        mintState = MintState.Empty;
    }

    function isOnAddressList(bytes32[] memory proof, bytes32 leaf, bytes32 root) public pure returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }

    modifier mintRequirements(bytes32[] memory proof, uint256 mintCount) {
        require(contractState == ContractState.Open, "There is no minting at this time.");
        require(mintState != MintState.Empty, "There is no minting at this time.");

        uint256 maxSupplyAfterVault = maxSupply - vault;
        uint256 tempTokenCount = mintCount + tokenCounter;

        require(tokenCounter < maxSupplyAfterVault, "All of YommsFrens have been sold out!");
        require(tempTokenCount <= maxSupplyAfterVault, "There is only 1 more YommsFrens NFT left. Please go back and mint only 1 YommsFrens NFT.");

        address msgSender = msg.sender;
        uint256 msgSenderBalance = balanceOf(msgSender);
        uint256 tempBalanceCount = msgSenderBalance + mintCount;

        if (mintState == MintState.Raffle) {
            require(isOnAddressList(proof, keccak256(abi.encodePacked(msgSender)), raffleRoot), "Your address is not on the raffle list!");

            require(tempTokenCount <= raffleMaxSupply, "There is only 1 more YommsFrens NFT left for Raffle Mint. Please go back and mint only 1 YommsFrens NFT.");

            require(msgSenderBalance < raffleMintPerWallet, "You have no more mints left!");

            require((mintCount <= raffleMintPerWallet) && (tempBalanceCount <= raffleMintPerWallet), "You are going over your maximum mint count!");        

            require(msg.value == (raffleMintPrice * mintCount), "You must provide the right amount of ETH to mint!");
        } else if (mintState == MintState.Whitelist) {          
            require(isOnAddressList(proof, keccak256(abi.encodePacked(msgSender)), whitelistRoot) || isOnAddressList(proof, keccak256(abi.encodePacked(msgSender)), specialWhitelistRoot), "Your address is not on the whitelist!");

            require(tempTokenCount <= whitelistMaxSupply, "There is only 1 more YommsFrens NFT left for Whitelist Mint. Please go back and mint only 1 YommsFrens NFT.");

            if (isOnAddressList(proof, keccak256(abi.encodePacked(msgSender)), whitelistRoot)) {
                require(msgSenderBalance < whitelistMintPerWallet, "You have no more mints left!");

                require((mintCount <= whitelistMintPerWallet) && (tempBalanceCount <= whitelistMintPerWallet), "You are going over your maximum mint count!");  
            } else if (isOnAddressList(proof, keccak256(abi.encodePacked(msgSender)), specialWhitelistRoot)) {
                require(msgSenderBalance < 2, "You have no more mints left!");

                require((mintCount <= 2) && (tempBalanceCount <= 2), "You are going over your maximum mint count!"); 
            }

            require(msg.value == (whitelistMintPrice * mintCount), "You must provide the right amount of ETH to mint!");
        } else if (mintState == MintState.Public) {
            require(msgSenderBalance < publicMintPerWallet, "You have no more mints left!");

            require((mintCount <= publicMintPerWallet) && (tempBalanceCount <= publicMintPerWallet), "You are going over your maximum mint count!");

            require(msg.value == (publicMintPrice * mintCount), "You must provide the right amount of ETH to mint!");
        }

        _;
    }

    function createToken(bytes32[] memory proof, uint256 mintCount) public payable mintRequirements(proof, mintCount) {
        tokenCounter += 1;

        address tokenOwner = msg.sender;
        uint256 tokenID = tokenCounter;

        _safeMint(tokenOwner, tokenID);

        if (mintCount == 2) {
            tokenCounter += 1;

            tokenID = tokenCounter;

            _safeMint(tokenOwner, tokenID);
        }
    }

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

    function setBaseURI(string memory __baseURI) public onlyOwner {
        baseURI = __baseURI;
    }

    function toggleContractState(ContractState _contractState) public onlyOwner {
        contractState = _contractState;
    }

    function toggleMintState(MintState _mintState) public onlyOwner {
        mintState = _mintState;
    }

    function withdraw(address payable walletAddress, uint256 weiAmount) public payable onlyOwner {
        (bool success, ) = walletAddress.call{value: weiAmount}("");

        require(success, "ETH withdrawal failed!");
    }

    // Setters
    //---BEGIN---
    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }   

    function setRaffleMintPerWallet(uint256 _raffleMintPerWallet) public onlyOwner {
        raffleMintPerWallet = _raffleMintPerWallet;
    }

    function setRaffleMintPrice(uint256 _raffleMintPrice) public onlyOwner {
        raffleMintPrice = _raffleMintPrice;
    }

    function setRaffleMaxSupply(uint256 _raffleMaxSupply) public onlyOwner {
        raffleMaxSupply = _raffleMaxSupply;
    }

    function setWhitelistMintPerWallet(uint256 _whitelistMintPerWallet) public onlyOwner {
        whitelistMintPerWallet = _whitelistMintPerWallet;
    }

    function setWhitelistMintPrice(uint256 _whitelistMintPrice) public onlyOwner {
        whitelistMintPrice = _whitelistMintPrice;
    }

    function setWhitelistMaxSupply(uint256 _whitelistMaxSupply) public onlyOwner {
        whitelistMaxSupply = _whitelistMaxSupply;
    }

    function setPublicMintPerWallet(uint256 _publicMintPerWallet) public onlyOwner {
        publicMintPerWallet = _publicMintPerWallet;
    }

    function setPublicMintPrice(uint256 _publicMintPrice) public onlyOwner {
        publicMintPrice = _publicMintPrice;
    }

    function setVault(uint256 _vault) public onlyOwner {
        vault = _vault;
    }
    //---END---

    function burnToken(uint256 tokenID) public onlyOwner {
        _burn(tokenID);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractState","outputs":[{"internalType":"enum YommsFrens.ContractState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"createToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"isOnAddressList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum YommsFrens.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMintPerWallet","type":"uint256"}],"name":"setPublicMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMintPrice","type":"uint256"}],"name":"setPublicMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleMaxSupply","type":"uint256"}],"name":"setRaffleMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleMintPerWallet","type":"uint256"}],"name":"setRaffleMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleMintPrice","type":"uint256"}],"name":"setRaffleMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vault","type":"uint256"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistMaxSupply","type":"uint256"}],"name":"setWhitelistMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistMintPerWallet","type":"uint256"}],"name":"setWhitelistMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistMintPrice","type":"uint256"}],"name":"setWhitelistMintPrice","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":"enum YommsFrens.ContractState","name":"_contractState","type":"uint8"}],"name":"toggleContractState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YommsFrens.MintState","name":"_mintState","type":"uint8"}],"name":"toggleMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenCounter","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":"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":"vault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"walletAddress","type":"address"},{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f596f6d6d734672656e73000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f594600000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009692919062000366565b508060019080519060200190620000af92919062000366565b505050620000d2620000c66200029860201b60201c565b620002a060201b60201c565b6102b86007819055506002600881905550668e1bc9bf04000060098190555061018e600a819055506001600b81905550666a94d74f430000600c8190555060e5600d819055506002600e81905550668e1bc9bf040000600f81905550600060108190555060456011819055506040518060800160405280604381526020016200509a60439139601290805190602001906200016f92919062000366565b507f8c02f23dcea44595c84be7e7552a6b6d6eadb22b6bedb9fd418f94b2e1c9786760001b6013819055507ff00289e04fc9e9e4718225499b1df6c4f5aeae259e4ec5c366d320c5e5a5921c60001b6014819055507f550ca12a1d40e8963e65f1e20ca955d0f4a4f9968ea1cf4c4a6624e6dd35478b60001b6015819055506001601660006101000a81548160ff021916908360018111156200023b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506000601660016101000a81548160ff021916908360038111156200028d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506200047b565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003749062000416565b90600052602060002090601f016020900481019282620003985760008555620003e4565b82601f10620003b357805160ff1916838001178555620003e4565b82800160010185558215620003e4579182015b82811115620003e3578251825591602001919060010190620003c6565b5b509050620003f39190620003f7565b5090565b5b8082111562000412576000816000905550600101620003f8565b5090565b600060028204905060018216806200042f57607f821691505b602082108114156200044657620004456200044c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614c0f806200048b6000396000f3fe6080604052600436106102885760003560e01c806395d89b411161015a578063d40778d0116100c1578063e985e9c51161007a578063e985e9c514610981578063ebde2b37146109be578063ece0d256146109e9578063f2fde38b14610a26578063f3fef3a314610a4f578063fbfa77cf14610a6b57610288565b8063d40778d014610892578063d5abeb01146108ae578063d98d1d51146108d9578063dc53fd9214610904578063e56889de1461092f578063e63218b01461095857610288565b8063b677dd0b11610113578063b677dd0b14610784578063b88d4fde146107ad578063c051e38a146107d6578063c3ac4feb14610801578063c87b56dd1461082a578063d082e3811461086757610288565b806395d89b411461068a578063a0732422146106b5578063a22cb465146106e0578063a42a7bd914610709578063a4c5976414610732578063a611708e1461075b57610288565b806355f804b3116101fe57806370a08231116101b757806370a082311461058c578063715018a6146105c95780637b47ec1a146105e05780637ff0b3b11461060957806385209ee0146106345780638da5cb5b1461065f57610288565b806355f804b31461047e57806358f46285146104a75780635d82cf6e146104d25780636352211e146104fb5780636c0360eb146105385780636f8b44b01461056357610288565b80631d9c2989116102505780631d9c29891461038457806323b872dd146103ad57806335c6aaf8146103d65780633e8f09871461040157806342842e0e1461042c5780634edee1821461045557610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b314610332578063120f693d1461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906134e5565b610a96565b6040516102c19190613b1e565b60405180910390f35b3480156102d657600080fd5b506102df610b78565b6040516102ec9190613b6f565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906135ca565b610c0a565b6040516103299190613ab7565b60405180910390f35b34801561033e57600080fd5b50610359600480360381019061035491906133ee565b610c50565b005b34801561036757600080fd5b50610382600480360381019061037d91906135ca565b610d68565b005b34801561039057600080fd5b506103ab60048036038101906103a691906135ca565b610d7a565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906132e8565b610d8c565b005b3480156103e257600080fd5b506103eb610dec565b6040516103f89190613e91565b60405180910390f35b34801561040d57600080fd5b50610416610df2565b6040516104239190613e91565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906132e8565b610df8565b005b34801561046157600080fd5b5061047c60048036038101906104779190613560565b610e18565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613589565b610e73565b005b3480156104b357600080fd5b506104bc610e95565b6040516104c99190613e91565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f491906135ca565b610e9b565b005b34801561050757600080fd5b50610522600480360381019061051d91906135ca565b610ead565b60405161052f9190613ab7565b60405180910390f35b34801561054457600080fd5b5061054d610f5f565b60405161055a9190613b6f565b60405180910390f35b34801561056f57600080fd5b5061058a600480360381019061058591906135ca565b610fed565b005b34801561059857600080fd5b506105b360048036038101906105ae9190613247565b610fff565b6040516105c09190613e91565b60405180910390f35b3480156105d557600080fd5b506105de6110b7565b005b3480156105ec57600080fd5b50610607600480360381019061060291906135ca565b6110cb565b005b34801561061557600080fd5b5061061e6110df565b60405161062b9190613e91565b60405180910390f35b34801561064057600080fd5b506106496110e5565b6040516106569190613b39565b60405180910390f35b34801561066b57600080fd5b506106746110f8565b6040516106819190613ab7565b60405180910390f35b34801561069657600080fd5b5061069f611122565b6040516106ac9190613b6f565b60405180910390f35b3480156106c157600080fd5b506106ca6111b4565b6040516106d79190613e91565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906133b2565b6111ba565b005b34801561071557600080fd5b50610730600480360381019061072b91906135ca565b6111d0565b005b34801561073e57600080fd5b50610759600480360381019061075491906135ca565b6111e2565b005b34801561076757600080fd5b50610782600480360381019061077d91906135ca565b6111f4565b005b34801561079057600080fd5b506107ab60048036038101906107a691906135ca565b611206565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613337565b611218565b005b3480156107e257600080fd5b506107eb61127a565b6040516107f89190613b54565b60405180910390f35b34801561080d57600080fd5b50610828600480360381019061082391906135ca565b61128d565b005b34801561083657600080fd5b50610851600480360381019061084c91906135ca565b61129f565b60405161085e9190613b6f565b60405180910390f35b34801561087357600080fd5b5061087c611307565b6040516108899190613e91565b60405180910390f35b6108ac60048036038101906108a79190613491565b61130d565b005b3480156108ba57600080fd5b506108c3611cdc565b6040516108d09190613e91565b60405180910390f35b3480156108e557600080fd5b506108ee611ce2565b6040516108fb9190613e91565b60405180910390f35b34801561091057600080fd5b50610919611ce8565b6040516109269190613e91565b60405180910390f35b34801561093b57600080fd5b5061095660048036038101906109519190613537565b611cee565b005b34801561096457600080fd5b5061097f600480360381019061097a91906135ca565b611d49565b005b34801561098d57600080fd5b506109a860048036038101906109a391906132ac565b611d5b565b6040516109b59190613b1e565b60405180910390f35b3480156109ca57600080fd5b506109d3611def565b6040516109e09190613e91565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b919061342a565b611df5565b604051610a1d9190613b1e565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190613247565b611e0b565b005b610a696004803603810190610a649190613270565b611e8f565b005b348015610a7757600080fd5b50610a80611f48565b604051610a8d9190613e91565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b715750610b7082611f4e565b5b9050919050565b606060008054610b87906141de565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb3906141de565b8015610c005780601f10610bd557610100808354040283529160200191610c00565b820191906000526020600020905b815481529060010190602001808311610be357829003601f168201915b5050505050905090565b6000610c1582611fb8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5b82610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613d91565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ceb612003565b73ffffffffffffffffffffffffffffffffffffffff161480610d1a5750610d1981610d14612003565b611d5b565b5b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090613cd1565b60405180910390fd5b610d63838361200b565b505050565b610d706120c4565b8060088190555050565b610d826120c4565b80600b8190555050565b610d9d610d97612003565b82612142565b610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd390613e71565b60405180910390fd5b610de78383836121d7565b505050565b600c5481565b60095481565b610e1383838360405180602001604052806000815250611218565b505050565b610e206120c4565b80601660016101000a81548160ff02191690836003811115610e6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b610e7b6120c4565b8060129080519060200190610e91929190612f81565b5050565b600d5481565b610ea36120c4565b80600f8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90613d71565b60405180910390fd5b80915050919050565b60128054610f6c906141de565b80601f0160208091040260200160405190810160405280929190818152602001828054610f98906141de565b8015610fe55780601f10610fba57610100808354040283529160200191610fe5565b820191906000526020600020905b815481529060010190602001808311610fc857829003601f168201915b505050505081565b610ff56120c4565b8060078190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790613c91565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110bf6120c4565b6110c9600061243e565b565b6110d36120c4565b6110dc81612504565b50565b600b5481565b601660009054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611131906141de565b80601f016020809104026020016040519081016040528092919081815260200182805461115d906141de565b80156111aa5780601f1061117f576101008083540402835291602001916111aa565b820191906000526020600020905b81548152906001019060200180831161118d57829003601f168201915b5050505050905090565b60085481565b6111cc6111c5612003565b8383612621565b5050565b6111d86120c4565b80600e8190555050565b6111ea6120c4565b8060118190555050565b6111fc6120c4565b80600c8190555050565b61120e6120c4565b80600d8190555050565b611229611223612003565b83612142565b611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613e71565b60405180910390fd5b6112748484848461278e565b50505050565b601660019054906101000a900460ff1681565b6112956120c4565b8060098190555050565b60606112aa82611fb8565b60006112b46127ea565b905060008151116112d457604051806020016040528060008152506112ff565b806112de8461287c565b6040516020016112ef929190613a7e565b6040516020818303038152906040525b915050919050565b60105481565b818160006001811115611349577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660009054906101000a900460ff166001811115611391577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613d51565b60405180910390fd5b6000600381111561140b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660019054906101000a900460ff166003811115611453577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b90613d51565b60405180910390fd5b60006011546007546114a6919061408e565b90506000601054836114b89190613fad565b905081601054106114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f590613e31565b60405180910390fd5b81811115611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890613df1565b60405180910390fd5b6000339050600061155182610fff565b9050600085826115619190613fad565b90506001600381111561159d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660019054906101000a900460ff1660038111156115e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561178d5761161e87846040516020016116009190613a63565b60405160208183030381529060405280519060200120601354611df5565b61165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165490613db1565b60405180910390fd5b600a548411156116a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169990613dd1565b60405180910390fd5b60085482106116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90613c11565b60405180910390fd5b60085486111580156116fa57506008548111155b611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090613d31565b60405180910390fd5b856009546117479190614034565b3414611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f90613e51565b60405180910390fd5b611c6c565b600260038111156117c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660019054906101000a900460ff16600381111561180f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611afc57611848878460405160200161182a9190613a63565b60405160208183030381529060405280519060200120601454611df5565b80611882575061188187846040516020016118639190613a63565b60405160208183030381529060405280519060200120601554611df5565b5b6118c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b890613c31565b60405180910390fd5b600d54841115611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd90613e11565b60405180910390fd5b611939878460405160200161191b9190613a63565b60405160208183030381529060405280519060200120601454611df5565b156119da57600b548210611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990613c11565b60405180910390fd5b600b5486111580156119965750600b548111155b6119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90613d31565b60405180910390fd5b611aa8565b611a0d87846040516020016119ef9190613a63565b60405160208183030381529060405280519060200120601554611df5565b15611aa75760028210611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90613c11565b60405180910390fd5b60028611158015611a67575060028111155b611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d90613d31565b60405180910390fd5b5b5b85600c54611ab69190614034565b3414611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90613e51565b60405180910390fd5b611c6b565b600380811115611b35577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660019054906101000a900460ff166003811115611b7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611c6a57600e548210611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe90613c11565b60405180910390fd5b600e548611158015611bdb5750600e548111155b611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1190613d31565b60405180910390fd5b85600f54611c289190614034565b3414611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6090613e51565b60405180910390fd5b5b5b5b600160106000828254611c7f9190613fad565b92505081905550600033905060006010549050611c9c8282612a29565b60028a1415611ccf57600160106000828254611cb89190613fad565b925050819055506010549050611cce8282612a29565b5b5050505050505050505050565b60075481565b600a5481565b600f5481565b611cf66120c4565b80601660006101000a81548160ff02191690836001811115611d41577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b611d516120c4565b80600a8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b6000611e02848385612a47565b90509392505050565b611e136120c4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a90613bb1565b60405180910390fd5b611e8c8161243e565b50565b611e976120c4565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611ebd90613aa2565b60006040518083038185875af1925050503d8060008114611efa576040519150601f19603f3d011682016040523d82523d6000602084013e611eff565b606091505b5050905080611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90613cb1565b60405180910390fd5b505050565b60115481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fc181612a5e565b612000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff790613d71565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661207e83610ead565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6120cc612003565b73ffffffffffffffffffffffffffffffffffffffff166120ea6110f8565b73ffffffffffffffffffffffffffffffffffffffff1614612140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213790613d11565b60405180910390fd5b565b60008061214e83610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612190575061218f8185611d5b565b5b806121ce57508373ffffffffffffffffffffffffffffffffffffffff166121b684610c0a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121f782610ead565b73ffffffffffffffffffffffffffffffffffffffff161461224d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224490613bd1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490613c51565b60405180910390fd5b6122c8838383612aca565b6122d360008261200b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612323919061408e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461237a9190613fad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612439838383612acf565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061250f82610ead565b905061251d81600084612aca565b61252860008361200b565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612578919061408e565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261d81600084612acf565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268790613c71565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127819190613b1e565b60405180910390a3505050565b6127998484846121d7565b6127a584848484612ad4565b6127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90613b91565b60405180910390fd5b50505050565b6060601280546127f9906141de565b80601f0160208091040260200160405190810160405280929190818152602001828054612825906141de565b80156128725780601f1061284757610100808354040283529160200191612872565b820191906000526020600020905b81548152906001019060200180831161285557829003601f168201915b5050505050905090565b606060008214156128c4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a24565b600082905060005b600082146128f65780806128df90614241565b915050600a826128ef9190614003565b91506128cc565b60008167ffffffffffffffff811115612938577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561296a5781602001600182028036833780820191505090505b5090505b60008514612a1d57600182612983919061408e565b9150600a8561299291906142ae565b603061299e9190613fad565b60f81b8183815181106129da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a169190614003565b945061296e565b8093505050505b919050565b612a43828260405180602001604052806000815250612c6b565b5050565b600082612a548584612cc6565b1490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6000612af58473ffffffffffffffffffffffffffffffffffffffff16612d42565b15612c5e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b1e612003565b8786866040518563ffffffff1660e01b8152600401612b409493929190613ad2565b602060405180830381600087803b158015612b5a57600080fd5b505af1925050508015612b8b57506040513d601f19601f82011682018060405250810190612b88919061350e565b60015b612c0e573d8060008114612bbb576040519150601f19603f3d011682016040523d82523d6000602084013e612bc0565b606091505b50600081511415612c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfd90613b91565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c63565b600190505b949350505050565b612c758383612d65565b612c826000848484612ad4565b612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890613b91565b60405180910390fd5b505050565b60008082905060005b8451811015612d3757612d2282868381518110612d15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612f3f565b91508080612d2f90614241565b915050612ccf565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcc90613cf1565b60405180910390fd5b612dde81612a5e565b15612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590613bf1565b60405180910390fd5b612e2a60008383612aca565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7a9190613fad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f3b60008383612acf565b5050565b6000818310612f5757612f528284612f6a565b612f62565b612f618383612f6a565b5b905092915050565b600082600052816020526040600020905092915050565b828054612f8d906141de565b90600052602060002090601f016020900481019282612faf5760008555612ff6565b82601f10612fc857805160ff1916838001178555612ff6565b82800160010185558215612ff6579182015b82811115612ff5578251825591602001919060010190612fda565b5b5090506130039190613007565b5090565b5b80821115613020576000816000905550600101613008565b5090565b600061303761303284613ed1565b613eac565b9050808382526020820190508285602086028201111561305657600080fd5b60005b85811015613086578161306c8882613175565b845260208401935060208301925050600181019050613059565b5050509392505050565b60006130a361309e84613efd565b613eac565b9050828152602081018484840111156130bb57600080fd5b6130c684828561419c565b509392505050565b60006130e16130dc84613f2e565b613eac565b9050828152602081018484840111156130f957600080fd5b61310484828561419c565b509392505050565b60008135905061311b81614b2f565b92915050565b60008135905061313081614b46565b92915050565b600082601f83011261314757600080fd5b8135613157848260208601613024565b91505092915050565b60008135905061316f81614b5d565b92915050565b60008135905061318481614b74565b92915050565b60008135905061319981614b8b565b92915050565b6000815190506131ae81614b8b565b92915050565b600082601f8301126131c557600080fd5b81356131d5848260208601613090565b91505092915050565b6000813590506131ed81614ba2565b92915050565b60008135905061320281614bb2565b92915050565b600082601f83011261321957600080fd5b81356132298482602086016130ce565b91505092915050565b60008135905061324181614bc2565b92915050565b60006020828403121561325957600080fd5b60006132678482850161310c565b91505092915050565b6000806040838503121561328357600080fd5b600061329185828601613121565b92505060206132a285828601613232565b9150509250929050565b600080604083850312156132bf57600080fd5b60006132cd8582860161310c565b92505060206132de8582860161310c565b9150509250929050565b6000806000606084860312156132fd57600080fd5b600061330b8682870161310c565b935050602061331c8682870161310c565b925050604061332d86828701613232565b9150509250925092565b6000806000806080858703121561334d57600080fd5b600061335b8782880161310c565b945050602061336c8782880161310c565b935050604061337d87828801613232565b925050606085013567ffffffffffffffff81111561339a57600080fd5b6133a6878288016131b4565b91505092959194509250565b600080604083850312156133c557600080fd5b60006133d38582860161310c565b92505060206133e485828601613160565b9150509250929050565b6000806040838503121561340157600080fd5b600061340f8582860161310c565b925050602061342085828601613232565b9150509250929050565b60008060006060848603121561343f57600080fd5b600084013567ffffffffffffffff81111561345957600080fd5b61346586828701613136565b935050602061347686828701613175565b925050604061348786828701613175565b9150509250925092565b600080604083850312156134a457600080fd5b600083013567ffffffffffffffff8111156134be57600080fd5b6134ca85828601613136565b92505060206134db85828601613232565b9150509250929050565b6000602082840312156134f757600080fd5b60006135058482850161318a565b91505092915050565b60006020828403121561352057600080fd5b600061352e8482850161319f565b91505092915050565b60006020828403121561354957600080fd5b6000613557848285016131de565b91505092915050565b60006020828403121561357257600080fd5b6000613580848285016131f3565b91505092915050565b60006020828403121561359b57600080fd5b600082013567ffffffffffffffff8111156135b557600080fd5b6135c184828501613208565b91505092915050565b6000602082840312156135dc57600080fd5b60006135ea84828501613232565b91505092915050565b6135fc816140c2565b82525050565b61361361360e826140c2565b61428a565b82525050565b613622816140e6565b82525050565b600061363382613f5f565b61363d8185613f75565b935061364d8185602086016141ab565b613656816143ca565b840191505092915050565b61366a81614178565b82525050565b6136798161418a565b82525050565b600061368a82613f6a565b6136948185613f91565b93506136a48185602086016141ab565b6136ad816143ca565b840191505092915050565b60006136c382613f6a565b6136cd8185613fa2565b93506136dd8185602086016141ab565b80840191505092915050565b60006136f6603283613f91565b9150613701826143e8565b604082019050919050565b6000613719602683613f91565b915061372482614437565b604082019050919050565b600061373c602583613f91565b915061374782614486565b604082019050919050565b600061375f601c83613f91565b915061376a826144d5565b602082019050919050565b6000613782601c83613f91565b915061378d826144fe565b602082019050919050565b60006137a5602583613f91565b91506137b082614527565b604082019050919050565b60006137c8602483613f91565b91506137d382614576565b604082019050919050565b60006137eb601983613f91565b91506137f6826145c5565b602082019050919050565b600061380e602983613f91565b9150613819826145ee565b604082019050919050565b6000613831601683613f91565b915061383c8261463d565b602082019050919050565b6000613854603e83613f91565b915061385f82614666565b604082019050919050565b6000613877602083613f91565b9150613882826146b5565b602082019050919050565b600061389a602083613f91565b91506138a5826146de565b602082019050919050565b60006138bd602b83613f91565b91506138c882614707565b604082019050919050565b60006138e0602183613f91565b91506138eb82614756565b604082019050919050565b6000613903601883613f91565b915061390e826147a5565b602082019050919050565b6000613926602183613f91565b9150613931826147ce565b604082019050919050565b6000613949602783613f91565b91506139548261481d565b604082019050919050565b600061396c606883613f91565b91506139778261486c565b608082019050919050565b600061398f605883613f91565b915061399a82614907565b606082019050919050565b60006139b2600083613f86565b91506139bd8261497c565b600082019050919050565b60006139d5606b83613f91565b91506139e08261497f565b608082019050919050565b60006139f8602583613f91565b9150613a0382614a1a565b604082019050919050565b6000613a1b603183613f91565b9150613a2682614a69565b604082019050919050565b6000613a3e602e83613f91565b9150613a4982614ab8565b604082019050919050565b613a5d8161416e565b82525050565b6000613a6f8284613602565b60148201915081905092915050565b6000613a8a82856136b8565b9150613a9682846136b8565b91508190509392505050565b6000613aad826139a5565b9150819050919050565b6000602082019050613acc60008301846135f3565b92915050565b6000608082019050613ae760008301876135f3565b613af460208301866135f3565b613b016040830185613a54565b8181036060830152613b138184613628565b905095945050505050565b6000602082019050613b336000830184613619565b92915050565b6000602082019050613b4e6000830184613661565b92915050565b6000602082019050613b696000830184613670565b92915050565b60006020820190508181036000830152613b89818461367f565b905092915050565b60006020820190508181036000830152613baa816136e9565b9050919050565b60006020820190508181036000830152613bca8161370c565b9050919050565b60006020820190508181036000830152613bea8161372f565b9050919050565b60006020820190508181036000830152613c0a81613752565b9050919050565b60006020820190508181036000830152613c2a81613775565b9050919050565b60006020820190508181036000830152613c4a81613798565b9050919050565b60006020820190508181036000830152613c6a816137bb565b9050919050565b60006020820190508181036000830152613c8a816137de565b9050919050565b60006020820190508181036000830152613caa81613801565b9050919050565b60006020820190508181036000830152613cca81613824565b9050919050565b60006020820190508181036000830152613cea81613847565b9050919050565b60006020820190508181036000830152613d0a8161386a565b9050919050565b60006020820190508181036000830152613d2a8161388d565b9050919050565b60006020820190508181036000830152613d4a816138b0565b9050919050565b60006020820190508181036000830152613d6a816138d3565b9050919050565b60006020820190508181036000830152613d8a816138f6565b9050919050565b60006020820190508181036000830152613daa81613919565b9050919050565b60006020820190508181036000830152613dca8161393c565b9050919050565b60006020820190508181036000830152613dea8161395f565b9050919050565b60006020820190508181036000830152613e0a81613982565b9050919050565b60006020820190508181036000830152613e2a816139c8565b9050919050565b60006020820190508181036000830152613e4a816139eb565b9050919050565b60006020820190508181036000830152613e6a81613a0e565b9050919050565b60006020820190508181036000830152613e8a81613a31565b9050919050565b6000602082019050613ea66000830184613a54565b92915050565b6000613eb6613ec7565b9050613ec28282614210565b919050565b6000604051905090565b600067ffffffffffffffff821115613eec57613eeb61439b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f1857613f1761439b565b5b613f21826143ca565b9050602081019050919050565b600067ffffffffffffffff821115613f4957613f4861439b565b5b613f52826143ca565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fb88261416e565b9150613fc38361416e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ff857613ff76142df565b5b828201905092915050565b600061400e8261416e565b91506140198361416e565b9250826140295761402861430e565b5b828204905092915050565b600061403f8261416e565b915061404a8361416e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614083576140826142df565b5b828202905092915050565b60006140998261416e565b91506140a48361416e565b9250828210156140b7576140b66142df565b5b828203905092915050565b60006140cd8261414e565b9050919050565b60006140df8261414e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061413682614b07565b919050565b600081905061414982614b1b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061418382614128565b9050919050565b60006141958261413b565b9050919050565b82818337600083830152505050565b60005b838110156141c95780820151818401526020810190506141ae565b838111156141d8576000848401525b50505050565b600060028204905060018216806141f657607f821691505b6020821081141561420a5761420961436c565b5b50919050565b614219826143ca565b810181811067ffffffffffffffff821117156142385761423761439b565b5b80604052505050565b600061424c8261416e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561427f5761427e6142df565b5b600182019050919050565b60006142958261429c565b9050919050565b60006142a7826143db565b9050919050565b60006142b98261416e565b91506142c48361416e565b9250826142d4576142d361430e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752068617665206e6f206d6f7265206d696e7473206c6566742100000000600082015250565b7f596f75722061646472657373206973206e6f74206f6e2074686520776869746560008201527f6c69737421000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f455448207769746864726177616c206661696c65642100000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752061726520676f696e67206f76657220796f7572206d6178696d756d2060008201527f6d696e7420636f756e7421000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f206d696e74696e6720617420746869732074696d6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f75722061646472657373206973206e6f74206f6e2074686520726166666c60008201527f65206c6973742100000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206f6e6c792031206d6f726520596f6d6d734672656e732060008201527f4e4654206c65667420666f7220526166666c65204d696e742e20506c6561736560208201527f20676f206261636b20616e64206d696e74206f6e6c79203120596f6d6d73467260408201527f656e73204e46542e000000000000000000000000000000000000000000000000606082015250565b7f5468657265206973206f6e6c792031206d6f726520596f6d6d734672656e732060008201527f4e4654206c6566742e20506c6561736520676f206261636b20616e64206d696e60208201527f74206f6e6c79203120596f6d6d734672656e73204e46542e0000000000000000604082015250565b50565b7f5468657265206973206f6e6c792031206d6f726520596f6d6d734672656e732060008201527f4e4654206c65667420666f722057686974656c697374204d696e742e20506c6560208201527f61736520676f206261636b20616e64206d696e74206f6e6c79203120596f6d6d60408201527f734672656e73204e46542e000000000000000000000000000000000000000000606082015250565b7f416c6c206f6620596f6d6d734672656e732068617665206265656e20736f6c6460008201527f206f757421000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206d7573742070726f766964652074686520726967687420616d6f756e60008201527f74206f662045544820746f206d696e7421000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60028110614b1857614b1761433d565b5b50565b60048110614b2c57614b2b61433d565b5b50565b614b38816140c2565b8114614b4357600080fd5b50565b614b4f816140d4565b8114614b5a57600080fd5b50565b614b66816140e6565b8114614b7157600080fd5b50565b614b7d816140f2565b8114614b8857600080fd5b50565b614b94816140fc565b8114614b9f57600080fd5b50565b60028110614baf57600080fd5b50565b60048110614bbf57600080fd5b50565b614bcb8161416e565b8114614bd657600080fd5b5056fea26469706673582212203a7dface1045d75112205df8cc3ab8e027cd630957f67391c98e98e2f8e7020f64736f6c63430008040033697066733a2f2f62616679626569677979646969766634366c6b707a6d336e70696a6c7272737a78716337343261727667786e327436626f627a73776376343572612f

Deployed Bytecode

0x6080604052600436106102885760003560e01c806395d89b411161015a578063d40778d0116100c1578063e985e9c51161007a578063e985e9c514610981578063ebde2b37146109be578063ece0d256146109e9578063f2fde38b14610a26578063f3fef3a314610a4f578063fbfa77cf14610a6b57610288565b8063d40778d014610892578063d5abeb01146108ae578063d98d1d51146108d9578063dc53fd9214610904578063e56889de1461092f578063e63218b01461095857610288565b8063b677dd0b11610113578063b677dd0b14610784578063b88d4fde146107ad578063c051e38a146107d6578063c3ac4feb14610801578063c87b56dd1461082a578063d082e3811461086757610288565b806395d89b411461068a578063a0732422146106b5578063a22cb465146106e0578063a42a7bd914610709578063a4c5976414610732578063a611708e1461075b57610288565b806355f804b3116101fe57806370a08231116101b757806370a082311461058c578063715018a6146105c95780637b47ec1a146105e05780637ff0b3b11461060957806385209ee0146106345780638da5cb5b1461065f57610288565b806355f804b31461047e57806358f46285146104a75780635d82cf6e146104d25780636352211e146104fb5780636c0360eb146105385780636f8b44b01461056357610288565b80631d9c2989116102505780631d9c29891461038457806323b872dd146103ad57806335c6aaf8146103d65780633e8f09871461040157806342842e0e1461042c5780634edee1821461045557610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b314610332578063120f693d1461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906134e5565b610a96565b6040516102c19190613b1e565b60405180910390f35b3480156102d657600080fd5b506102df610b78565b6040516102ec9190613b6f565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906135ca565b610c0a565b6040516103299190613ab7565b60405180910390f35b34801561033e57600080fd5b50610359600480360381019061035491906133ee565b610c50565b005b34801561036757600080fd5b50610382600480360381019061037d91906135ca565b610d68565b005b34801561039057600080fd5b506103ab60048036038101906103a691906135ca565b610d7a565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906132e8565b610d8c565b005b3480156103e257600080fd5b506103eb610dec565b6040516103f89190613e91565b60405180910390f35b34801561040d57600080fd5b50610416610df2565b6040516104239190613e91565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906132e8565b610df8565b005b34801561046157600080fd5b5061047c60048036038101906104779190613560565b610e18565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613589565b610e73565b005b3480156104b357600080fd5b506104bc610e95565b6040516104c99190613e91565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f491906135ca565b610e9b565b005b34801561050757600080fd5b50610522600480360381019061051d91906135ca565b610ead565b60405161052f9190613ab7565b60405180910390f35b34801561054457600080fd5b5061054d610f5f565b60405161055a9190613b6f565b60405180910390f35b34801561056f57600080fd5b5061058a600480360381019061058591906135ca565b610fed565b005b34801561059857600080fd5b506105b360048036038101906105ae9190613247565b610fff565b6040516105c09190613e91565b60405180910390f35b3480156105d557600080fd5b506105de6110b7565b005b3480156105ec57600080fd5b50610607600480360381019061060291906135ca565b6110cb565b005b34801561061557600080fd5b5061061e6110df565b60405161062b9190613e91565b60405180910390f35b34801561064057600080fd5b506106496110e5565b6040516106569190613b39565b60405180910390f35b34801561066b57600080fd5b506106746110f8565b6040516106819190613ab7565b60405180910390f35b34801561069657600080fd5b5061069f611122565b6040516106ac9190613b6f565b60405180910390f35b3480156106c157600080fd5b506106ca6111b4565b6040516106d79190613e91565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906133b2565b6111ba565b005b34801561071557600080fd5b50610730600480360381019061072b91906135ca565b6111d0565b005b34801561073e57600080fd5b50610759600480360381019061075491906135ca565b6111e2565b005b34801561076757600080fd5b50610782600480360381019061077d91906135ca565b6111f4565b005b34801561079057600080fd5b506107ab60048036038101906107a691906135ca565b611206565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613337565b611218565b005b3480156107e257600080fd5b506107eb61127a565b6040516107f89190613b54565b60405180910390f35b34801561080d57600080fd5b50610828600480360381019061082391906135ca565b61128d565b005b34801561083657600080fd5b50610851600480360381019061084c91906135ca565b61129f565b60405161085e9190613b6f565b60405180910390f35b34801561087357600080fd5b5061087c611307565b6040516108899190613e91565b60405180910390f35b6108ac60048036038101906108a79190613491565b61130d565b005b3480156108ba57600080fd5b506108c3611cdc565b6040516108d09190613e91565b60405180910390f35b3480156108e557600080fd5b506108ee611ce2565b6040516108fb9190613e91565b60405180910390f35b34801561091057600080fd5b50610919611ce8565b6040516109269190613e91565b60405180910390f35b34801561093b57600080fd5b5061095660048036038101906109519190613537565b611cee565b005b34801561096457600080fd5b5061097f600480360381019061097a91906135ca565b611d49565b005b34801561098d57600080fd5b506109a860048036038101906109a391906132ac565b611d5b565b6040516109b59190613b1e565b60405180910390f35b3480156109ca57600080fd5b506109d3611def565b6040516109e09190613e91565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b919061342a565b611df5565b604051610a1d9190613b1e565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190613247565b611e0b565b005b610a696004803603810190610a649190613270565b611e8f565b005b348015610a7757600080fd5b50610a80611f48565b604051610a8d9190613e91565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b715750610b7082611f4e565b5b9050919050565b606060008054610b87906141de565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb3906141de565b8015610c005780601f10610bd557610100808354040283529160200191610c00565b820191906000526020600020905b815481529060010190602001808311610be357829003601f168201915b5050505050905090565b6000610c1582611fb8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5b82610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613d91565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ceb612003565b73ffffffffffffffffffffffffffffffffffffffff161480610d1a5750610d1981610d14612003565b611d5b565b5b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090613cd1565b60405180910390fd5b610d63838361200b565b505050565b610d706120c4565b8060088190555050565b610d826120c4565b80600b8190555050565b610d9d610d97612003565b82612142565b610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd390613e71565b60405180910390fd5b610de78383836121d7565b505050565b600c5481565b60095481565b610e1383838360405180602001604052806000815250611218565b505050565b610e206120c4565b80601660016101000a81548160ff02191690836003811115610e6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b610e7b6120c4565b8060129080519060200190610e91929190612f81565b5050565b600d5481565b610ea36120c4565b80600f8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90613d71565b60405180910390fd5b80915050919050565b60128054610f6c906141de565b80601f0160208091040260200160405190810160405280929190818152602001828054610f98906141de565b8015610fe55780601f10610fba57610100808354040283529160200191610fe5565b820191906000526020600020905b815481529060010190602001808311610fc857829003601f168201915b505050505081565b610ff56120c4565b8060078190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790613c91565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110bf6120c4565b6110c9600061243e565b565b6110d36120c4565b6110dc81612504565b50565b600b5481565b601660009054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611131906141de565b80601f016020809104026020016040519081016040528092919081815260200182805461115d906141de565b80156111aa5780601f1061117f576101008083540402835291602001916111aa565b820191906000526020600020905b81548152906001019060200180831161118d57829003601f168201915b5050505050905090565b60085481565b6111cc6111c5612003565b8383612621565b5050565b6111d86120c4565b80600e8190555050565b6111ea6120c4565b8060118190555050565b6111fc6120c4565b80600c8190555050565b61120e6120c4565b80600d8190555050565b611229611223612003565b83612142565b611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613e71565b60405180910390fd5b6112748484848461278e565b50505050565b601660019054906101000a900460ff1681565b6112956120c4565b8060098190555050565b60606112aa82611fb8565b60006112b46127ea565b905060008151116112d457604051806020016040528060008152506112ff565b806112de8461287c565b6040516020016112ef929190613a7e565b6040516020818303038152906040525b915050919050565b60105481565b818160006001811115611349577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660009054906101000a900460ff166001811115611391577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613d51565b60405180910390fd5b6000600381111561140b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660019054906101000a900460ff166003811115611453577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b90613d51565b60405180910390fd5b60006011546007546114a6919061408e565b90506000601054836114b89190613fad565b905081601054106114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f590613e31565b60405180910390fd5b81811115611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890613df1565b60405180910390fd5b6000339050600061155182610fff565b9050600085826115619190613fad565b90506001600381111561159d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660019054906101000a900460ff1660038111156115e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561178d5761161e87846040516020016116009190613a63565b60405160208183030381529060405280519060200120601354611df5565b61165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165490613db1565b60405180910390fd5b600a548411156116a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169990613dd1565b60405180910390fd5b60085482106116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90613c11565b60405180910390fd5b60085486111580156116fa57506008548111155b611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090613d31565b60405180910390fd5b856009546117479190614034565b3414611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f90613e51565b60405180910390fd5b611c6c565b600260038111156117c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660019054906101000a900460ff16600381111561180f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611afc57611848878460405160200161182a9190613a63565b60405160208183030381529060405280519060200120601454611df5565b80611882575061188187846040516020016118639190613a63565b60405160208183030381529060405280519060200120601554611df5565b5b6118c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b890613c31565b60405180910390fd5b600d54841115611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd90613e11565b60405180910390fd5b611939878460405160200161191b9190613a63565b60405160208183030381529060405280519060200120601454611df5565b156119da57600b548210611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990613c11565b60405180910390fd5b600b5486111580156119965750600b548111155b6119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90613d31565b60405180910390fd5b611aa8565b611a0d87846040516020016119ef9190613a63565b60405160208183030381529060405280519060200120601554611df5565b15611aa75760028210611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90613c11565b60405180910390fd5b60028611158015611a67575060028111155b611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d90613d31565b60405180910390fd5b5b5b85600c54611ab69190614034565b3414611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90613e51565b60405180910390fd5b611c6b565b600380811115611b35577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601660019054906101000a900460ff166003811115611b7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611c6a57600e548210611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe90613c11565b60405180910390fd5b600e548611158015611bdb5750600e548111155b611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1190613d31565b60405180910390fd5b85600f54611c289190614034565b3414611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6090613e51565b60405180910390fd5b5b5b5b600160106000828254611c7f9190613fad565b92505081905550600033905060006010549050611c9c8282612a29565b60028a1415611ccf57600160106000828254611cb89190613fad565b925050819055506010549050611cce8282612a29565b5b5050505050505050505050565b60075481565b600a5481565b600f5481565b611cf66120c4565b80601660006101000a81548160ff02191690836001811115611d41577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b611d516120c4565b80600a8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b6000611e02848385612a47565b90509392505050565b611e136120c4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a90613bb1565b60405180910390fd5b611e8c8161243e565b50565b611e976120c4565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611ebd90613aa2565b60006040518083038185875af1925050503d8060008114611efa576040519150601f19603f3d011682016040523d82523d6000602084013e611eff565b606091505b5050905080611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90613cb1565b60405180910390fd5b505050565b60115481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fc181612a5e565b612000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff790613d71565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661207e83610ead565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6120cc612003565b73ffffffffffffffffffffffffffffffffffffffff166120ea6110f8565b73ffffffffffffffffffffffffffffffffffffffff1614612140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213790613d11565b60405180910390fd5b565b60008061214e83610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612190575061218f8185611d5b565b5b806121ce57508373ffffffffffffffffffffffffffffffffffffffff166121b684610c0a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121f782610ead565b73ffffffffffffffffffffffffffffffffffffffff161461224d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224490613bd1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490613c51565b60405180910390fd5b6122c8838383612aca565b6122d360008261200b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612323919061408e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461237a9190613fad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612439838383612acf565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061250f82610ead565b905061251d81600084612aca565b61252860008361200b565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612578919061408e565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261d81600084612acf565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268790613c71565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127819190613b1e565b60405180910390a3505050565b6127998484846121d7565b6127a584848484612ad4565b6127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90613b91565b60405180910390fd5b50505050565b6060601280546127f9906141de565b80601f0160208091040260200160405190810160405280929190818152602001828054612825906141de565b80156128725780601f1061284757610100808354040283529160200191612872565b820191906000526020600020905b81548152906001019060200180831161285557829003601f168201915b5050505050905090565b606060008214156128c4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a24565b600082905060005b600082146128f65780806128df90614241565b915050600a826128ef9190614003565b91506128cc565b60008167ffffffffffffffff811115612938577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561296a5781602001600182028036833780820191505090505b5090505b60008514612a1d57600182612983919061408e565b9150600a8561299291906142ae565b603061299e9190613fad565b60f81b8183815181106129da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a169190614003565b945061296e565b8093505050505b919050565b612a43828260405180602001604052806000815250612c6b565b5050565b600082612a548584612cc6565b1490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6000612af58473ffffffffffffffffffffffffffffffffffffffff16612d42565b15612c5e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b1e612003565b8786866040518563ffffffff1660e01b8152600401612b409493929190613ad2565b602060405180830381600087803b158015612b5a57600080fd5b505af1925050508015612b8b57506040513d601f19601f82011682018060405250810190612b88919061350e565b60015b612c0e573d8060008114612bbb576040519150601f19603f3d011682016040523d82523d6000602084013e612bc0565b606091505b50600081511415612c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfd90613b91565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c63565b600190505b949350505050565b612c758383612d65565b612c826000848484612ad4565b612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890613b91565b60405180910390fd5b505050565b60008082905060005b8451811015612d3757612d2282868381518110612d15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612f3f565b91508080612d2f90614241565b915050612ccf565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcc90613cf1565b60405180910390fd5b612dde81612a5e565b15612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590613bf1565b60405180910390fd5b612e2a60008383612aca565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7a9190613fad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f3b60008383612acf565b5050565b6000818310612f5757612f528284612f6a565b612f62565b612f618383612f6a565b5b905092915050565b600082600052816020526040600020905092915050565b828054612f8d906141de565b90600052602060002090601f016020900481019282612faf5760008555612ff6565b82601f10612fc857805160ff1916838001178555612ff6565b82800160010185558215612ff6579182015b82811115612ff5578251825591602001919060010190612fda565b5b5090506130039190613007565b5090565b5b80821115613020576000816000905550600101613008565b5090565b600061303761303284613ed1565b613eac565b9050808382526020820190508285602086028201111561305657600080fd5b60005b85811015613086578161306c8882613175565b845260208401935060208301925050600181019050613059565b5050509392505050565b60006130a361309e84613efd565b613eac565b9050828152602081018484840111156130bb57600080fd5b6130c684828561419c565b509392505050565b60006130e16130dc84613f2e565b613eac565b9050828152602081018484840111156130f957600080fd5b61310484828561419c565b509392505050565b60008135905061311b81614b2f565b92915050565b60008135905061313081614b46565b92915050565b600082601f83011261314757600080fd5b8135613157848260208601613024565b91505092915050565b60008135905061316f81614b5d565b92915050565b60008135905061318481614b74565b92915050565b60008135905061319981614b8b565b92915050565b6000815190506131ae81614b8b565b92915050565b600082601f8301126131c557600080fd5b81356131d5848260208601613090565b91505092915050565b6000813590506131ed81614ba2565b92915050565b60008135905061320281614bb2565b92915050565b600082601f83011261321957600080fd5b81356132298482602086016130ce565b91505092915050565b60008135905061324181614bc2565b92915050565b60006020828403121561325957600080fd5b60006132678482850161310c565b91505092915050565b6000806040838503121561328357600080fd5b600061329185828601613121565b92505060206132a285828601613232565b9150509250929050565b600080604083850312156132bf57600080fd5b60006132cd8582860161310c565b92505060206132de8582860161310c565b9150509250929050565b6000806000606084860312156132fd57600080fd5b600061330b8682870161310c565b935050602061331c8682870161310c565b925050604061332d86828701613232565b9150509250925092565b6000806000806080858703121561334d57600080fd5b600061335b8782880161310c565b945050602061336c8782880161310c565b935050604061337d87828801613232565b925050606085013567ffffffffffffffff81111561339a57600080fd5b6133a6878288016131b4565b91505092959194509250565b600080604083850312156133c557600080fd5b60006133d38582860161310c565b92505060206133e485828601613160565b9150509250929050565b6000806040838503121561340157600080fd5b600061340f8582860161310c565b925050602061342085828601613232565b9150509250929050565b60008060006060848603121561343f57600080fd5b600084013567ffffffffffffffff81111561345957600080fd5b61346586828701613136565b935050602061347686828701613175565b925050604061348786828701613175565b9150509250925092565b600080604083850312156134a457600080fd5b600083013567ffffffffffffffff8111156134be57600080fd5b6134ca85828601613136565b92505060206134db85828601613232565b9150509250929050565b6000602082840312156134f757600080fd5b60006135058482850161318a565b91505092915050565b60006020828403121561352057600080fd5b600061352e8482850161319f565b91505092915050565b60006020828403121561354957600080fd5b6000613557848285016131de565b91505092915050565b60006020828403121561357257600080fd5b6000613580848285016131f3565b91505092915050565b60006020828403121561359b57600080fd5b600082013567ffffffffffffffff8111156135b557600080fd5b6135c184828501613208565b91505092915050565b6000602082840312156135dc57600080fd5b60006135ea84828501613232565b91505092915050565b6135fc816140c2565b82525050565b61361361360e826140c2565b61428a565b82525050565b613622816140e6565b82525050565b600061363382613f5f565b61363d8185613f75565b935061364d8185602086016141ab565b613656816143ca565b840191505092915050565b61366a81614178565b82525050565b6136798161418a565b82525050565b600061368a82613f6a565b6136948185613f91565b93506136a48185602086016141ab565b6136ad816143ca565b840191505092915050565b60006136c382613f6a565b6136cd8185613fa2565b93506136dd8185602086016141ab565b80840191505092915050565b60006136f6603283613f91565b9150613701826143e8565b604082019050919050565b6000613719602683613f91565b915061372482614437565b604082019050919050565b600061373c602583613f91565b915061374782614486565b604082019050919050565b600061375f601c83613f91565b915061376a826144d5565b602082019050919050565b6000613782601c83613f91565b915061378d826144fe565b602082019050919050565b60006137a5602583613f91565b91506137b082614527565b604082019050919050565b60006137c8602483613f91565b91506137d382614576565b604082019050919050565b60006137eb601983613f91565b91506137f6826145c5565b602082019050919050565b600061380e602983613f91565b9150613819826145ee565b604082019050919050565b6000613831601683613f91565b915061383c8261463d565b602082019050919050565b6000613854603e83613f91565b915061385f82614666565b604082019050919050565b6000613877602083613f91565b9150613882826146b5565b602082019050919050565b600061389a602083613f91565b91506138a5826146de565b602082019050919050565b60006138bd602b83613f91565b91506138c882614707565b604082019050919050565b60006138e0602183613f91565b91506138eb82614756565b604082019050919050565b6000613903601883613f91565b915061390e826147a5565b602082019050919050565b6000613926602183613f91565b9150613931826147ce565b604082019050919050565b6000613949602783613f91565b91506139548261481d565b604082019050919050565b600061396c606883613f91565b91506139778261486c565b608082019050919050565b600061398f605883613f91565b915061399a82614907565b606082019050919050565b60006139b2600083613f86565b91506139bd8261497c565b600082019050919050565b60006139d5606b83613f91565b91506139e08261497f565b608082019050919050565b60006139f8602583613f91565b9150613a0382614a1a565b604082019050919050565b6000613a1b603183613f91565b9150613a2682614a69565b604082019050919050565b6000613a3e602e83613f91565b9150613a4982614ab8565b604082019050919050565b613a5d8161416e565b82525050565b6000613a6f8284613602565b60148201915081905092915050565b6000613a8a82856136b8565b9150613a9682846136b8565b91508190509392505050565b6000613aad826139a5565b9150819050919050565b6000602082019050613acc60008301846135f3565b92915050565b6000608082019050613ae760008301876135f3565b613af460208301866135f3565b613b016040830185613a54565b8181036060830152613b138184613628565b905095945050505050565b6000602082019050613b336000830184613619565b92915050565b6000602082019050613b4e6000830184613661565b92915050565b6000602082019050613b696000830184613670565b92915050565b60006020820190508181036000830152613b89818461367f565b905092915050565b60006020820190508181036000830152613baa816136e9565b9050919050565b60006020820190508181036000830152613bca8161370c565b9050919050565b60006020820190508181036000830152613bea8161372f565b9050919050565b60006020820190508181036000830152613c0a81613752565b9050919050565b60006020820190508181036000830152613c2a81613775565b9050919050565b60006020820190508181036000830152613c4a81613798565b9050919050565b60006020820190508181036000830152613c6a816137bb565b9050919050565b60006020820190508181036000830152613c8a816137de565b9050919050565b60006020820190508181036000830152613caa81613801565b9050919050565b60006020820190508181036000830152613cca81613824565b9050919050565b60006020820190508181036000830152613cea81613847565b9050919050565b60006020820190508181036000830152613d0a8161386a565b9050919050565b60006020820190508181036000830152613d2a8161388d565b9050919050565b60006020820190508181036000830152613d4a816138b0565b9050919050565b60006020820190508181036000830152613d6a816138d3565b9050919050565b60006020820190508181036000830152613d8a816138f6565b9050919050565b60006020820190508181036000830152613daa81613919565b9050919050565b60006020820190508181036000830152613dca8161393c565b9050919050565b60006020820190508181036000830152613dea8161395f565b9050919050565b60006020820190508181036000830152613e0a81613982565b9050919050565b60006020820190508181036000830152613e2a816139c8565b9050919050565b60006020820190508181036000830152613e4a816139eb565b9050919050565b60006020820190508181036000830152613e6a81613a0e565b9050919050565b60006020820190508181036000830152613e8a81613a31565b9050919050565b6000602082019050613ea66000830184613a54565b92915050565b6000613eb6613ec7565b9050613ec28282614210565b919050565b6000604051905090565b600067ffffffffffffffff821115613eec57613eeb61439b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f1857613f1761439b565b5b613f21826143ca565b9050602081019050919050565b600067ffffffffffffffff821115613f4957613f4861439b565b5b613f52826143ca565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fb88261416e565b9150613fc38361416e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ff857613ff76142df565b5b828201905092915050565b600061400e8261416e565b91506140198361416e565b9250826140295761402861430e565b5b828204905092915050565b600061403f8261416e565b915061404a8361416e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614083576140826142df565b5b828202905092915050565b60006140998261416e565b91506140a48361416e565b9250828210156140b7576140b66142df565b5b828203905092915050565b60006140cd8261414e565b9050919050565b60006140df8261414e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061413682614b07565b919050565b600081905061414982614b1b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061418382614128565b9050919050565b60006141958261413b565b9050919050565b82818337600083830152505050565b60005b838110156141c95780820151818401526020810190506141ae565b838111156141d8576000848401525b50505050565b600060028204905060018216806141f657607f821691505b6020821081141561420a5761420961436c565b5b50919050565b614219826143ca565b810181811067ffffffffffffffff821117156142385761423761439b565b5b80604052505050565b600061424c8261416e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561427f5761427e6142df565b5b600182019050919050565b60006142958261429c565b9050919050565b60006142a7826143db565b9050919050565b60006142b98261416e565b91506142c48361416e565b9250826142d4576142d361430e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752068617665206e6f206d6f7265206d696e7473206c6566742100000000600082015250565b7f596f75722061646472657373206973206e6f74206f6e2074686520776869746560008201527f6c69737421000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f455448207769746864726177616c206661696c65642100000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752061726520676f696e67206f76657220796f7572206d6178696d756d2060008201527f6d696e7420636f756e7421000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f206d696e74696e6720617420746869732074696d6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f75722061646472657373206973206e6f74206f6e2074686520726166666c60008201527f65206c6973742100000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206f6e6c792031206d6f726520596f6d6d734672656e732060008201527f4e4654206c65667420666f7220526166666c65204d696e742e20506c6561736560208201527f20676f206261636b20616e64206d696e74206f6e6c79203120596f6d6d73467260408201527f656e73204e46542e000000000000000000000000000000000000000000000000606082015250565b7f5468657265206973206f6e6c792031206d6f726520596f6d6d734672656e732060008201527f4e4654206c6566742e20506c6561736520676f206261636b20616e64206d696e60208201527f74206f6e6c79203120596f6d6d734672656e73204e46542e0000000000000000604082015250565b50565b7f5468657265206973206f6e6c792031206d6f726520596f6d6d734672656e732060008201527f4e4654206c65667420666f722057686974656c697374204d696e742e20506c6560208201527f61736520676f206261636b20616e64206d696e74206f6e6c79203120596f6d6d60408201527f734672656e73204e46542e000000000000000000000000000000000000000000606082015250565b7f416c6c206f6620596f6d6d734672656e732068617665206265656e20736f6c6460008201527f206f757421000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206d7573742070726f766964652074686520726967687420616d6f756e60008201527f74206f662045544820746f206d696e7421000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60028110614b1857614b1761433d565b5b50565b60048110614b2c57614b2b61433d565b5b50565b614b38816140c2565b8114614b4357600080fd5b50565b614b4f816140d4565b8114614b5a57600080fd5b50565b614b66816140e6565b8114614b7157600080fd5b50565b614b7d816140f2565b8114614b8857600080fd5b50565b614b94816140fc565b8114614b9f57600080fd5b50565b60028110614baf57600080fd5b50565b60048110614bbf57600080fd5b50565b614bcb8161416e565b8114614bd657600080fd5b5056fea26469706673582212203a7dface1045d75112205df8cc3ab8e027cd630957f67391c98e98e2f8e7020f64736f6c63430008040033

Deployed Bytecode Sourcemap

46750:7902:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33495:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34422:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35935:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35452:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53314:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53726:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36635:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46986:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46868:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37042:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52821:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52580:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47026:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54322:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34133:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47207:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53203:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33864:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14031:103;;;;;;;;;;;;;:::i;:::-;;54563:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46942:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47573:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13383:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34591:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46827:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36178:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54174:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54454:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53886:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54030;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37298:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47614:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53462:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34766:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47144:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52024:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46796:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46905:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52688:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53594:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36404:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47066:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48590:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14289:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52934:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47178:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33495:305;33597:4;33649:25;33634:40;;;:11;:40;;;;:105;;;;33706:33;33691:48;;;:11;:48;;;;33634:105;:158;;;;33756:36;33780:11;33756:23;:36::i;:::-;33634:158;33614:178;;33495:305;;;:::o;34422:100::-;34476:13;34509:5;34502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34422:100;:::o;35935:171::-;36011:7;36031:23;36046:7;36031:14;:23::i;:::-;36074:15;:24;36090:7;36074:24;;;;;;;;;;;;;;;;;;;;;36067:31;;35935:171;;;:::o;35452:417::-;35533:13;35549:23;35564:7;35549:14;:23::i;:::-;35533:39;;35597:5;35591:11;;:2;:11;;;;35583:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35691:5;35675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35700:37;35717:5;35724:12;:10;:12::i;:::-;35700:16;:37::i;:::-;35675:62;35653:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;35840:21;35849:2;35853:7;35840:8;:21::i;:::-;35452:417;;;:::o;53314:140::-;13269:13;:11;:13::i;:::-;53426:20:::1;53404:19;:42;;;;53314:140:::0;:::o;53726:152::-;13269:13;:11;:13::i;:::-;53847:23:::1;53822:22;:48;;;;53726:152:::0;:::o;36635:336::-;36830:41;36849:12;:10;:12::i;:::-;36863:7;36830:18;:41::i;:::-;36822:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;36935:28;36945:4;36951:2;36955:7;36935:9;:28::i;:::-;36635:336;;;:::o;46986:33::-;;;;:::o;46868:30::-;;;;:::o;37042:185::-;37180:39;37197:4;37203:2;37207:7;37180:39;;;;;;;;;;;;:16;:39::i;:::-;37042:185;;;:::o;52821:105::-;13269:13;:11;:13::i;:::-;52908:10:::1;52896:9;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52821:105:::0;:::o;52580:100::-;13269:13;:11;:13::i;:::-;52663:9:::1;52653:7;:19;;;;;;;;;;;;:::i;:::-;;52580:100:::0;:::o;47026:33::-;;;;:::o;54322:124::-;13269:13;:11;:13::i;:::-;54422:16:::1;54404:15;:34;;;;54322:124:::0;:::o;34133:222::-;34205:7;34225:13;34241:7;:16;34249:7;34241:16;;;;;;;;;;;;;;;;;;;;;34225:32;;34293:1;34276:19;;:5;:19;;;;34268:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;34342:5;34335:12;;;34133:222;;;:::o;47207:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53203:100::-;13269:13;:11;:13::i;:::-;53285:10:::1;53273:9;:22;;;;53203:100:::0;:::o;33864:207::-;33936:7;33981:1;33964:19;;:5;:19;;;;33956:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34047:9;:16;34057:5;34047:16;;;;;;;;;;;;;;;;34040:23;;33864:207;;;:::o;14031:103::-;13269:13;:11;:13::i;:::-;14096:30:::1;14123:1;14096:18;:30::i;:::-;14031:103::o:0;54563:86::-;13269:13;:11;:13::i;:::-;54627:14:::1;54633:7;54627:5;:14::i;:::-;54563:86:::0;:::o;46942:37::-;;;;:::o;47573:34::-;;;;;;;;;;;;;:::o;13383:87::-;13429:7;13456:6;;;;;;;;;;;13449:13;;13383:87;:::o;34591:104::-;34647:13;34680:7;34673:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34591:104;:::o;46827:34::-;;;;:::o;36178:155::-;36273:52;36292:12;:10;:12::i;:::-;36306:8;36316;36273:18;:52::i;:::-;36178:155;;:::o;54174:140::-;13269:13;:11;:13::i;:::-;54286:20:::1;54264:19;:42;;;;54174:140:::0;:::o;54454:84::-;13269:13;:11;:13::i;:::-;54524:6:::1;54516:5;:14;;;;54454:84:::0;:::o;53886:136::-;13269:13;:11;:13::i;:::-;53995:19:::1;53974:18;:40;;;;53886:136:::0;:::o;54030:::-;13269:13;:11;:13::i;:::-;54139:19:::1;54118:18;:40;;;;54030:136:::0;:::o;37298:323::-;37472:41;37491:12;:10;:12::i;:::-;37505:7;37472:18;:41::i;:::-;37464:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37575:38;37589:4;37595:2;37599:7;37608:4;37575:13;:38::i;:::-;37298:323;;;;:::o;47614:26::-;;;;;;;;;;;;;:::o;53462:124::-;13269:13;:11;:13::i;:::-;53562:16:::1;53544:15;:34;;;;53462:124:::0;:::o;34766:281::-;34839:13;34865:23;34880:7;34865:14;:23::i;:::-;34901:21;34925:10;:8;:10::i;:::-;34901:34;;34977:1;34959:7;34953:21;:25;:86;;;;;;;;;;;;;;;;;35005:7;35014:18;:7;:16;:18::i;:::-;34988:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34953:86;34946:93;;;34766:281;;;:::o;47144:27::-;;;;:::o;52024:440::-;52120:5;52127:9;48870:18;48853:35;;;;;;;;;;;;;;;;:13;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;48845:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48958:15;48945:28;;;;;;;;;;;;;;;;:9;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;48937:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49024:27;49066:5;;49054:9;;:17;;;;:::i;:::-;49024:47;;49082:22;49119:12;;49107:9;:24;;;;:::i;:::-;49082:49;;49167:19;49152:12;;:34;49144:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;49265:19;49247:14;:37;;49239:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;49390:17;49410:10;49390:30;;49431:24;49458:20;49468:9;49458;:20::i;:::-;49431:47;;49489:24;49535:9;49516:16;:28;;;;:::i;:::-;49489:55;;49574:16;49561:29;;;;;;;;;;;;;;;;:9;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;49557:2438;;;49615:74;49631:5;49665:9;49648:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49638:38;;;;;;49678:10;;49615:15;:74::i;:::-;49607:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;49776:15;;49758:14;:33;;49750:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;49944:19;;49925:16;:38;49917:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;50035:19;;50022:9;:32;;50021:79;;;;;50080:19;;50060:16;:39;;50021:79;50013:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;50213:9;50195:15;;:27;;;;:::i;:::-;50181:9;:42;50173:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;49557:2438;;;50312:19;50299:32;;;;;;;;;;;;;;;;:9;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;50295:1700;;;50366:77;50382:5;50416:9;50399:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50389:38;;;;;;50429:13;;50366:15;:77::i;:::-;:165;;;;50447:84;50463:5;50497:9;50480:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50470:38;;;;;;50510:20;;50447:15;:84::i;:::-;50366:165;50358:215;;;;;;;;;;;;:::i;:::-;;;;;;;;;50616:18;;50598:14;:36;;50590:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;50767:77;50783:5;50817:9;50800:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50790:38;;;;;;50830:13;;50767:15;:77::i;:::-;50763:677;;;50892:22;;50873:16;:41;50865:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50990:22;;50977:9;:35;;50976:85;;;;;51038:22;;51018:16;:42;;50976:85;50968:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;50763:677;;;51137:84;51153:5;51187:9;51170:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;51160:38;;;;;;51200:20;;51137:15;:84::i;:::-;51133:307;;;51269:1;51250:16;:20;51242:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51346:1;51333:9;:14;;51332:43;;;;;51373:1;51353:16;:21;;51332:43;51324:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51133:307;50763:677;51499:9;51478:18;;:30;;;;:::i;:::-;51464:9;:45;51456:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;50295:1700;;;51598:16;51585:29;;;;;;;;;;;;;;;;:9;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;51581:414;;;51658:19;;51639:16;:38;51631:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;51749:19;;51736:9;:32;;51735:79;;;;;51794:19;;51774:16;:39;;51735:79;51727:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;51919:9;51901:15;;:27;;;;:::i;:::-;51887:9;:42;51879:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;51581:414;50295:1700;49557:2438;52165:1:::1;52149:12;;:17;;;;;;;:::i;:::-;;;;;;;;52179:18;52200:10;52179:31;;52221:15;52239:12;;52221:30;;52264;52274:10;52286:7;52264:9;:30::i;:::-;52324:1;52311:9;:14;52307:150;;;52358:1;52342:12;;:17;;;;;;;:::i;:::-;;;;;;;;52386:12;;52376:22;;52415:30;52425:10;52437:7;52415:9;:30::i;:::-;52307:150;52007:1;;52024:440:::0;;;;;;;;;:::o;46796:24::-;;;;:::o;46905:30::-;;;;:::o;47107:::-;;;;:::o;52688:125::-;13269:13;:11;:13::i;:::-;52791:14:::1;52775:13;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52688:125:::0;:::o;53594:124::-;13269:13;:11;:13::i;:::-;53694:16:::1;53676:15;:34;;;;53594:124:::0;:::o;36404:164::-;36501:4;36525:18;:25;36544:5;36525:25;;;;;;;;;;;;;;;:35;36551:8;36525:35;;;;;;;;;;;;;;;;;;;;;;;;;36518:42;;36404:164;;;;:::o;47066:34::-;;;;:::o;48590:167::-;48688:4;48712:37;48731:5;48738:4;48744;48712:18;:37::i;:::-;48705:44;;48590:167;;;;;:::o;14289:201::-;13269:13;:11;:13::i;:::-;14398:1:::1;14378:22;;:8;:22;;;;14370:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14454:28;14473:8;14454:18;:28::i;:::-;14289:201:::0;:::o;52934:226::-;13269:13;:11;:13::i;:::-;53039:12:::1;53057:13;:18;;53083:9;53057:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53038:59;;;53118:7;53110:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;13293:1;52934:226:::0;;:::o;47178:20::-;;;;:::o;26237:157::-;26322:4;26361:25;26346:40;;;:11;:40;;;;26339:47;;26237:157;;;:::o;43910:135::-;43992:16;44000:7;43992;:16::i;:::-;43984:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43910:135;:::o;11934:98::-;11987:7;12014:10;12007:17;;11934:98;:::o;43189:174::-;43291:2;43264:15;:24;43280:7;43264:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43347:7;43343:2;43309:46;;43318:23;43333:7;43318:14;:23::i;:::-;43309:46;;;;;;;;;;;;43189:174;;:::o;13548:132::-;13623:12;:10;:12::i;:::-;13612:23;;:7;:5;:7::i;:::-;:23;;;13604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13548:132::o;39422:264::-;39515:4;39532:13;39548:23;39563:7;39548:14;:23::i;:::-;39532:39;;39601:5;39590:16;;:7;:16;;;:52;;;;39610:32;39627:5;39634:7;39610:16;:32::i;:::-;39590:52;:87;;;;39670:7;39646:31;;:20;39658:7;39646:11;:20::i;:::-;:31;;;39590:87;39582:96;;;39422:264;;;;:::o;42445:625::-;42604:4;42577:31;;:23;42592:7;42577:14;:23::i;:::-;:31;;;42569:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42683:1;42669:16;;:2;:16;;;;42661:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42739:39;42760:4;42766:2;42770:7;42739:20;:39::i;:::-;42843:29;42860:1;42864:7;42843:8;:29::i;:::-;42904:1;42885:9;:15;42895:4;42885:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42933:1;42916:9;:13;42926:2;42916:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42964:2;42945:7;:16;42953:7;42945:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43003:7;42999:2;42984:27;;42993:4;42984:27;;;;;;;;;;;;43024:38;43044:4;43050:2;43054:7;43024:19;:38::i;:::-;42445:625;;;:::o;14650:191::-;14724:16;14743:6;;;;;;;;;;;14724:25;;14769:8;14760:6;;:17;;;;;;;;;;;;;;;;;;14824:8;14793:40;;14814:8;14793:40;;;;;;;;;;;;14650:191;;:::o;41688:420::-;41748:13;41764:23;41779:7;41764:14;:23::i;:::-;41748:39;;41800:48;41821:5;41836:1;41840:7;41800:20;:48::i;:::-;41889:29;41906:1;41910:7;41889:8;:29::i;:::-;41951:1;41931:9;:16;41941:5;41931:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;41970:7;:16;41978:7;41970:16;;;;;;;;;;;;41963:23;;;;;;;;;;;42032:7;42028:1;42004:36;;42013:5;42004:36;;;;;;;;;;;;42053:47;42073:5;42088:1;42092:7;42053:19;:47::i;:::-;41688:420;;:::o;43506:315::-;43661:8;43652:17;;:5;:17;;;;43644:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43748:8;43710:18;:25;43729:5;43710:25;;;;;;;;;;;;;;;:35;43736:8;43710:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43794:8;43772:41;;43787:5;43772:41;;;43804:8;43772:41;;;;;;:::i;:::-;;;;;;;;43506:315;;;:::o;38502:313::-;38658:28;38668:4;38674:2;38678:7;38658:9;:28::i;:::-;38705:47;38728:4;38734:2;38738:7;38747:4;38705:22;:47::i;:::-;38697:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38502:313;;;;:::o;52472:100::-;52524:13;52557:7;52550:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52472:100;:::o;9188:723::-;9244:13;9474:1;9465:5;:10;9461:53;;;9492:10;;;;;;;;;;;;;;;;;;;;;9461:53;9524:12;9539:5;9524:20;;9555:14;9580:78;9595:1;9587:4;:9;9580:78;;9613:8;;;;;:::i;:::-;;;;9644:2;9636:10;;;;;:::i;:::-;;;9580:78;;;9668:19;9700:6;9690:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9668:39;;9718:154;9734:1;9725:5;:10;9718:154;;9762:1;9752:11;;;;;:::i;:::-;;;9829:2;9821:5;:10;;;;:::i;:::-;9808:2;:24;;;;:::i;:::-;9795:39;;9778:6;9785;9778:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;9858:2;9849:11;;;;;:::i;:::-;;;9718:154;;;9896:6;9882:21;;;;;9188:723;;;;:::o;40028:110::-;40104:26;40114:2;40118:7;40104:26;;;;;;;;;;;;:9;:26::i;:::-;40028:110;;:::o;1252:190::-;1377:4;1430;1401:25;1414:5;1421:4;1401:12;:25::i;:::-;:33;1394:40;;1252:190;;;;;:::o;39128:127::-;39193:4;39245:1;39217:30;;:7;:16;39225:7;39217:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39210:37;;39128:127;;;:::o;46034:126::-;;;;:::o;46545:125::-;;;;:::o;44609:853::-;44763:4;44784:15;:2;:13;;;:15::i;:::-;44780:675;;;44836:2;44820:36;;;44857:12;:10;:12::i;:::-;44871:4;44877:7;44886:4;44820:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44816:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45078:1;45061:6;:13;:18;45057:328;;;45104:60;;;;;;;;;;:::i;:::-;;;;;;;;45057:328;45335:6;45329:13;45320:6;45316:2;45312:15;45305:38;44816:584;44952:41;;;44942:51;;;:6;:51;;;;44935:58;;;;;44780:675;45439:4;45432:11;;44609:853;;;;;;;:::o;40365:319::-;40494:18;40500:2;40504:7;40494:5;:18::i;:::-;40545:53;40576:1;40580:2;40584:7;40593:4;40545:22;:53::i;:::-;40523:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;40365:319;;;:::o;2119:296::-;2202:7;2222:20;2245:4;2222:27;;2265:9;2260:118;2284:5;:12;2280:1;:16;2260:118;;;2333:33;2343:12;2357:5;2363:1;2357:8;;;;;;;;;;;;;;;;;;;;;;2333:9;:33::i;:::-;2318:48;;2298:3;;;;;:::i;:::-;;;;2260:118;;;;2395:12;2388:19;;;2119:296;;;;:::o;16081:326::-;16141:4;16398:1;16376:7;:19;;;:23;16369:30;;16081:326;;;:::o;41020:439::-;41114:1;41100:16;;:2;:16;;;;41092:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41173:16;41181:7;41173;:16::i;:::-;41172:17;41164:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41235:45;41264:1;41268:2;41272:7;41235:20;:45::i;:::-;41310:1;41293:9;:13;41303:2;41293:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41341:2;41322:7;:16;41330:7;41322:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41386:7;41382:2;41361:33;;41378:1;41361:33;;;;;;;;;;;;41407:44;41435:1;41439:2;41443:7;41407:19;:44::i;:::-;41020:439;;:::o;8326:149::-;8389:7;8420:1;8416;:5;:51;;8447:20;8462:1;8465;8447:14;:20::i;:::-;8416:51;;;8424:20;8439:1;8442;8424:14;:20::i;:::-;8416:51;8409:58;;8326:149;;;;:::o;8483:268::-;8551:13;8658:1;8652:4;8645:15;8687:1;8681:4;8674:15;8728:4;8722;8712:21;8703:30;;8630:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1530:155::-;1584:5;1622:6;1609:20;1600:29;;1638:41;1673:5;1638:41;:::i;:::-;1590:95;;;;:::o;1708:303::-;1779:5;1828:3;1821:4;1813:6;1809:17;1805:27;1795:2;;1846:1;1843;1836:12;1795:2;1886:6;1873:20;1911:94;2001:3;1993:6;1986:4;1978:6;1974:17;1911:94;:::i;:::-;1902:103;;1785:226;;;;;:::o;2017:133::-;2060:5;2098:6;2085:20;2076:29;;2114:30;2138:5;2114:30;:::i;:::-;2066:84;;;;:::o;2156:139::-;2202:5;2240:6;2227:20;2218:29;;2256:33;2283:5;2256:33;:::i;:::-;2208:87;;;;:::o;2301:137::-;2346:5;2384:6;2371:20;2362:29;;2400:32;2426:5;2400:32;:::i;:::-;2352:86;;;;:::o;2444:141::-;2500:5;2531:6;2525:13;2516:22;;2547:32;2573:5;2547:32;:::i;:::-;2506:79;;;;:::o;2604:271::-;2659:5;2708:3;2701:4;2693:6;2689:17;2685:27;2675:2;;2726:1;2723;2716:12;2675:2;2766:6;2753:20;2791:78;2865:3;2857:6;2850:4;2842:6;2838:17;2791:78;:::i;:::-;2782:87;;2665:210;;;;;:::o;2881:175::-;2945:5;2983:6;2970:20;2961:29;;2999:51;3044:5;2999:51;:::i;:::-;2951:105;;;;:::o;3062:167::-;3122:5;3160:6;3147:20;3138:29;;3176:47;3217:5;3176:47;:::i;:::-;3128:101;;;;:::o;3249:273::-;3305:5;3354:3;3347:4;3339:6;3335:17;3331:27;3321:2;;3372:1;3369;3362:12;3321:2;3412:6;3399:20;3437:79;3512:3;3504:6;3497:4;3489:6;3485:17;3437:79;:::i;:::-;3428:88;;3311:211;;;;;:::o;3528:139::-;3574:5;3612:6;3599:20;3590:29;;3628:33;3655:5;3628:33;:::i;:::-;3580:87;;;;:::o;3673:262::-;3732:6;3781:2;3769:9;3760:7;3756:23;3752:32;3749:2;;;3797:1;3794;3787:12;3749:2;3840:1;3865:53;3910:7;3901:6;3890:9;3886:22;3865:53;:::i;:::-;3855:63;;3811:117;3739:196;;;;:::o;3941:423::-;4017:6;4025;4074:2;4062:9;4053:7;4049:23;4045:32;4042:2;;;4090:1;4087;4080:12;4042:2;4133:1;4158:61;4211:7;4202:6;4191:9;4187:22;4158:61;:::i;:::-;4148:71;;4104:125;4268:2;4294:53;4339:7;4330:6;4319:9;4315:22;4294:53;:::i;:::-;4284:63;;4239:118;4032:332;;;;;:::o;4370:407::-;4438:6;4446;4495:2;4483:9;4474:7;4470:23;4466:32;4463:2;;;4511:1;4508;4501:12;4463:2;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4453:324;;;;;:::o;4783:552::-;4860:6;4868;4876;4925:2;4913:9;4904:7;4900:23;4896:32;4893:2;;;4941:1;4938;4931:12;4893:2;4984:1;5009:53;5054:7;5045:6;5034:9;5030:22;5009:53;:::i;:::-;4999:63;;4955:117;5111:2;5137:53;5182:7;5173:6;5162:9;5158:22;5137:53;:::i;:::-;5127:63;;5082:118;5239:2;5265:53;5310:7;5301:6;5290:9;5286:22;5265:53;:::i;:::-;5255:63;;5210:118;4883:452;;;;;:::o;5341:809::-;5436:6;5444;5452;5460;5509:3;5497:9;5488:7;5484:23;5480:33;5477:2;;;5526:1;5523;5516:12;5477:2;5569:1;5594:53;5639:7;5630:6;5619:9;5615:22;5594:53;:::i;:::-;5584:63;;5540:117;5696:2;5722:53;5767:7;5758:6;5747:9;5743:22;5722:53;:::i;:::-;5712:63;;5667:118;5824:2;5850:53;5895:7;5886:6;5875:9;5871:22;5850:53;:::i;:::-;5840:63;;5795:118;5980:2;5969:9;5965:18;5952:32;6011:18;6003:6;6000:30;5997:2;;;6043:1;6040;6033:12;5997:2;6071:62;6125:7;6116:6;6105:9;6101:22;6071:62;:::i;:::-;6061:72;;5923:220;5467:683;;;;;;;:::o;6156:401::-;6221:6;6229;6278:2;6266:9;6257:7;6253:23;6249:32;6246:2;;;6294:1;6291;6284:12;6246:2;6337:1;6362:53;6407:7;6398:6;6387:9;6383:22;6362:53;:::i;:::-;6352:63;;6308:117;6464:2;6490:50;6532:7;6523:6;6512:9;6508:22;6490:50;:::i;:::-;6480:60;;6435:115;6236:321;;;;;:::o;6563:407::-;6631:6;6639;6688:2;6676:9;6667:7;6663:23;6659:32;6656:2;;;6704:1;6701;6694:12;6656:2;6747:1;6772:53;6817:7;6808:6;6797:9;6793:22;6772:53;:::i;:::-;6762:63;;6718:117;6874:2;6900:53;6945:7;6936:6;6925:9;6921:22;6900:53;:::i;:::-;6890:63;;6845:118;6646:324;;;;;:::o;6976:695::-;7078:6;7086;7094;7143:2;7131:9;7122:7;7118:23;7114:32;7111:2;;;7159:1;7156;7149:12;7111:2;7230:1;7219:9;7215:17;7202:31;7260:18;7252:6;7249:30;7246:2;;;7292:1;7289;7282:12;7246:2;7320:78;7390:7;7381:6;7370:9;7366:22;7320:78;:::i;:::-;7310:88;;7173:235;7447:2;7473:53;7518:7;7509:6;7498:9;7494:22;7473:53;:::i;:::-;7463:63;;7418:118;7575:2;7601:53;7646:7;7637:6;7626:9;7622:22;7601:53;:::i;:::-;7591:63;;7546:118;7101:570;;;;;:::o;7677:550::-;7770:6;7778;7827:2;7815:9;7806:7;7802:23;7798:32;7795:2;;;7843:1;7840;7833:12;7795:2;7914:1;7903:9;7899:17;7886:31;7944:18;7936:6;7933:30;7930:2;;;7976:1;7973;7966:12;7930:2;8004:78;8074:7;8065:6;8054:9;8050:22;8004:78;:::i;:::-;7994:88;;7857:235;8131:2;8157:53;8202:7;8193:6;8182:9;8178:22;8157:53;:::i;:::-;8147:63;;8102:118;7785:442;;;;;:::o;8233:260::-;8291:6;8340:2;8328:9;8319:7;8315:23;8311:32;8308:2;;;8356:1;8353;8346:12;8308:2;8399:1;8424:52;8468:7;8459:6;8448:9;8444:22;8424:52;:::i;:::-;8414:62;;8370:116;8298:195;;;;:::o;8499:282::-;8568:6;8617:2;8605:9;8596:7;8592:23;8588:32;8585:2;;;8633:1;8630;8623:12;8585:2;8676:1;8701:63;8756:7;8747:6;8736:9;8732:22;8701:63;:::i;:::-;8691:73;;8647:127;8575:206;;;;:::o;8787:298::-;8864:6;8913:2;8901:9;8892:7;8888:23;8884:32;8881:2;;;8929:1;8926;8919:12;8881:2;8972:1;8997:71;9060:7;9051:6;9040:9;9036:22;8997:71;:::i;:::-;8987:81;;8943:135;8871:214;;;;:::o;9091:290::-;9164:6;9213:2;9201:9;9192:7;9188:23;9184:32;9181:2;;;9229:1;9226;9219:12;9181:2;9272:1;9297:67;9356:7;9347:6;9336:9;9332:22;9297:67;:::i;:::-;9287:77;;9243:131;9171:210;;;;:::o;9387:375::-;9456:6;9505:2;9493:9;9484:7;9480:23;9476:32;9473:2;;;9521:1;9518;9511:12;9473:2;9592:1;9581:9;9577:17;9564:31;9622:18;9614:6;9611:30;9608:2;;;9654:1;9651;9644:12;9608:2;9682:63;9737:7;9728:6;9717:9;9713:22;9682:63;:::i;:::-;9672:73;;9535:220;9463:299;;;;:::o;9768:262::-;9827:6;9876:2;9864:9;9855:7;9851:23;9847:32;9844:2;;;9892:1;9889;9882:12;9844:2;9935:1;9960:53;10005:7;9996:6;9985:9;9981:22;9960:53;:::i;:::-;9950:63;;9906:117;9834:196;;;;:::o;10036:118::-;10123:24;10141:5;10123:24;:::i;:::-;10118:3;10111:37;10101:53;;:::o;10160:157::-;10265:45;10285:24;10303:5;10285:24;:::i;:::-;10265:45;:::i;:::-;10260:3;10253:58;10243:74;;:::o;10323:109::-;10404:21;10419:5;10404:21;:::i;:::-;10399:3;10392:34;10382:50;;:::o;10438:360::-;10524:3;10552:38;10584:5;10552:38;:::i;:::-;10606:70;10669:6;10664:3;10606:70;:::i;:::-;10599:77;;10685:52;10730:6;10725:3;10718:4;10711:5;10707:16;10685:52;:::i;:::-;10762:29;10784:6;10762:29;:::i;:::-;10757:3;10753:39;10746:46;;10528:270;;;;;:::o;10804:163::-;10907:53;10954:5;10907:53;:::i;:::-;10902:3;10895:66;10885:82;;:::o;10973:155::-;11072:49;11115:5;11072:49;:::i;:::-;11067:3;11060:62;11050:78;;:::o;11134:364::-;11222:3;11250:39;11283:5;11250:39;:::i;:::-;11305:71;11369:6;11364:3;11305:71;:::i;:::-;11298:78;;11385:52;11430:6;11425:3;11418:4;11411:5;11407:16;11385:52;:::i;:::-;11462:29;11484:6;11462:29;:::i;:::-;11457:3;11453:39;11446:46;;11226:272;;;;;:::o;11504:377::-;11610:3;11638:39;11671:5;11638:39;:::i;:::-;11693:89;11775:6;11770:3;11693:89;:::i;:::-;11686:96;;11791:52;11836:6;11831:3;11824:4;11817:5;11813:16;11791:52;:::i;:::-;11868:6;11863:3;11859:16;11852:23;;11614:267;;;;;:::o;11887:366::-;12029:3;12050:67;12114:2;12109:3;12050:67;:::i;:::-;12043:74;;12126:93;12215:3;12126:93;:::i;:::-;12244:2;12239:3;12235:12;12228:19;;12033:220;;;:::o;12259:366::-;12401:3;12422:67;12486:2;12481:3;12422:67;:::i;:::-;12415:74;;12498:93;12587:3;12498:93;:::i;:::-;12616:2;12611:3;12607:12;12600:19;;12405:220;;;:::o;12631:366::-;12773:3;12794:67;12858:2;12853:3;12794:67;:::i;:::-;12787:74;;12870:93;12959:3;12870:93;:::i;:::-;12988:2;12983:3;12979:12;12972:19;;12777:220;;;:::o;13003:366::-;13145:3;13166:67;13230:2;13225:3;13166:67;:::i;:::-;13159:74;;13242:93;13331:3;13242:93;:::i;:::-;13360:2;13355:3;13351:12;13344:19;;13149:220;;;:::o;13375:366::-;13517:3;13538:67;13602:2;13597:3;13538:67;:::i;:::-;13531:74;;13614:93;13703:3;13614:93;:::i;:::-;13732:2;13727:3;13723:12;13716:19;;13521:220;;;:::o;13747:366::-;13889:3;13910:67;13974:2;13969:3;13910:67;:::i;:::-;13903:74;;13986:93;14075:3;13986:93;:::i;:::-;14104:2;14099:3;14095:12;14088:19;;13893:220;;;:::o;14119:366::-;14261:3;14282:67;14346:2;14341:3;14282:67;:::i;:::-;14275:74;;14358:93;14447:3;14358:93;:::i;:::-;14476:2;14471:3;14467:12;14460:19;;14265:220;;;:::o;14491:366::-;14633:3;14654:67;14718:2;14713:3;14654:67;:::i;:::-;14647:74;;14730:93;14819:3;14730:93;:::i;:::-;14848:2;14843:3;14839:12;14832:19;;14637:220;;;:::o;14863:366::-;15005:3;15026:67;15090:2;15085:3;15026:67;:::i;:::-;15019:74;;15102:93;15191:3;15102:93;:::i;:::-;15220:2;15215:3;15211:12;15204:19;;15009:220;;;:::o;15235:366::-;15377:3;15398:67;15462:2;15457:3;15398:67;:::i;:::-;15391:74;;15474:93;15563:3;15474:93;:::i;:::-;15592:2;15587:3;15583:12;15576:19;;15381:220;;;:::o;15607:366::-;15749:3;15770:67;15834:2;15829:3;15770:67;:::i;:::-;15763:74;;15846:93;15935:3;15846:93;:::i;:::-;15964:2;15959:3;15955:12;15948:19;;15753:220;;;:::o;15979:366::-;16121:3;16142:67;16206:2;16201:3;16142:67;:::i;:::-;16135:74;;16218:93;16307:3;16218:93;:::i;:::-;16336:2;16331:3;16327:12;16320:19;;16125:220;;;:::o;16351:366::-;16493:3;16514:67;16578:2;16573:3;16514:67;:::i;:::-;16507:74;;16590:93;16679:3;16590:93;:::i;:::-;16708:2;16703:3;16699:12;16692:19;;16497:220;;;:::o;16723:366::-;16865:3;16886:67;16950:2;16945:3;16886:67;:::i;:::-;16879:74;;16962:93;17051:3;16962:93;:::i;:::-;17080:2;17075:3;17071:12;17064:19;;16869:220;;;:::o;17095:366::-;17237:3;17258:67;17322:2;17317:3;17258:67;:::i;:::-;17251:74;;17334:93;17423:3;17334:93;:::i;:::-;17452:2;17447:3;17443:12;17436:19;;17241:220;;;:::o;17467:366::-;17609:3;17630:67;17694:2;17689:3;17630:67;:::i;:::-;17623:74;;17706:93;17795:3;17706:93;:::i;:::-;17824:2;17819:3;17815:12;17808:19;;17613:220;;;:::o;17839:366::-;17981:3;18002:67;18066:2;18061:3;18002:67;:::i;:::-;17995:74;;18078:93;18167:3;18078:93;:::i;:::-;18196:2;18191:3;18187:12;18180:19;;17985:220;;;:::o;18211:366::-;18353:3;18374:67;18438:2;18433:3;18374:67;:::i;:::-;18367:74;;18450:93;18539:3;18450:93;:::i;:::-;18568:2;18563:3;18559:12;18552:19;;18357:220;;;:::o;18583:368::-;18725:3;18746:68;18810:3;18805;18746:68;:::i;:::-;18739:75;;18823:93;18912:3;18823:93;:::i;:::-;18941:3;18936;18932:13;18925:20;;18729:222;;;:::o;18957:366::-;19099:3;19120:67;19184:2;19179:3;19120:67;:::i;:::-;19113:74;;19196:93;19285:3;19196:93;:::i;:::-;19314:2;19309:3;19305:12;19298:19;;19103:220;;;:::o;19329:398::-;19488:3;19509:83;19590:1;19585:3;19509:83;:::i;:::-;19502:90;;19601:93;19690:3;19601:93;:::i;:::-;19719:1;19714:3;19710:11;19703:18;;19492:235;;;:::o;19733:368::-;19875:3;19896:68;19960:3;19955;19896:68;:::i;:::-;19889:75;;19973:93;20062:3;19973:93;:::i;:::-;20091:3;20086;20082:13;20075:20;;19879:222;;;:::o;20107:366::-;20249:3;20270:67;20334:2;20329:3;20270:67;:::i;:::-;20263:74;;20346:93;20435:3;20346:93;:::i;:::-;20464:2;20459:3;20455:12;20448:19;;20253:220;;;:::o;20479:366::-;20621:3;20642:67;20706:2;20701:3;20642:67;:::i;:::-;20635:74;;20718:93;20807:3;20718:93;:::i;:::-;20836:2;20831:3;20827:12;20820:19;;20625:220;;;:::o;20851:366::-;20993:3;21014:67;21078:2;21073:3;21014:67;:::i;:::-;21007:74;;21090:93;21179:3;21090:93;:::i;:::-;21208:2;21203:3;21199:12;21192:19;;20997:220;;;:::o;21223:118::-;21310:24;21328:5;21310:24;:::i;:::-;21305:3;21298:37;21288:53;;:::o;21347:256::-;21459:3;21474:75;21545:3;21536:6;21474:75;:::i;:::-;21574:2;21569:3;21565:12;21558:19;;21594:3;21587:10;;21463:140;;;;:::o;21609:435::-;21789:3;21811:95;21902:3;21893:6;21811:95;:::i;:::-;21804:102;;21923:95;22014:3;22005:6;21923:95;:::i;:::-;21916:102;;22035:3;22028:10;;21793:251;;;;;:::o;22050:379::-;22234:3;22256:147;22399:3;22256:147;:::i;:::-;22249:154;;22420:3;22413:10;;22238:191;;;:::o;22435:222::-;22528:4;22566:2;22555:9;22551:18;22543:26;;22579:71;22647:1;22636:9;22632:17;22623:6;22579:71;:::i;:::-;22533:124;;;;:::o;22663:640::-;22858:4;22896:3;22885:9;22881:19;22873:27;;22910:71;22978:1;22967:9;22963:17;22954:6;22910:71;:::i;:::-;22991:72;23059:2;23048:9;23044:18;23035:6;22991:72;:::i;:::-;23073;23141:2;23130:9;23126:18;23117:6;23073:72;:::i;:::-;23192:9;23186:4;23182:20;23177:2;23166:9;23162:18;23155:48;23220:76;23291:4;23282:6;23220:76;:::i;:::-;23212:84;;22863:440;;;;;;;:::o;23309:210::-;23396:4;23434:2;23423:9;23419:18;23411:26;;23447:65;23509:1;23498:9;23494:17;23485:6;23447:65;:::i;:::-;23401:118;;;;:::o;23525:254::-;23634:4;23672:2;23661:9;23657:18;23649:26;;23685:87;23769:1;23758:9;23754:17;23745:6;23685:87;:::i;:::-;23639:140;;;;:::o;23785:246::-;23890:4;23928:2;23917:9;23913:18;23905:26;;23941:83;24021:1;24010:9;24006:17;23997:6;23941:83;:::i;:::-;23895:136;;;;:::o;24037:313::-;24150:4;24188:2;24177:9;24173:18;24165:26;;24237:9;24231:4;24227:20;24223:1;24212:9;24208:17;24201:47;24265:78;24338:4;24329:6;24265:78;:::i;:::-;24257:86;;24155:195;;;;:::o;24356:419::-;24522:4;24560:2;24549:9;24545:18;24537:26;;24609:9;24603:4;24599:20;24595:1;24584:9;24580:17;24573:47;24637:131;24763:4;24637:131;:::i;:::-;24629:139;;24527:248;;;:::o;24781:419::-;24947:4;24985:2;24974:9;24970:18;24962:26;;25034:9;25028:4;25024:20;25020:1;25009:9;25005:17;24998:47;25062:131;25188:4;25062:131;:::i;:::-;25054:139;;24952:248;;;:::o;25206:419::-;25372:4;25410:2;25399:9;25395:18;25387:26;;25459:9;25453:4;25449:20;25445:1;25434:9;25430:17;25423:47;25487:131;25613:4;25487:131;:::i;:::-;25479:139;;25377:248;;;:::o;25631:419::-;25797:4;25835:2;25824:9;25820:18;25812:26;;25884:9;25878:4;25874:20;25870:1;25859:9;25855:17;25848:47;25912:131;26038:4;25912:131;:::i;:::-;25904:139;;25802:248;;;:::o;26056:419::-;26222:4;26260:2;26249:9;26245:18;26237:26;;26309:9;26303:4;26299:20;26295:1;26284:9;26280:17;26273:47;26337:131;26463:4;26337:131;:::i;:::-;26329:139;;26227:248;;;:::o;26481:419::-;26647:4;26685:2;26674:9;26670:18;26662:26;;26734:9;26728:4;26724:20;26720:1;26709:9;26705:17;26698:47;26762:131;26888:4;26762:131;:::i;:::-;26754:139;;26652:248;;;:::o;26906:419::-;27072:4;27110:2;27099:9;27095:18;27087:26;;27159:9;27153:4;27149:20;27145:1;27134:9;27130:17;27123:47;27187:131;27313:4;27187:131;:::i;:::-;27179:139;;27077:248;;;:::o;27331:419::-;27497:4;27535:2;27524:9;27520:18;27512:26;;27584:9;27578:4;27574:20;27570:1;27559:9;27555:17;27548:47;27612:131;27738:4;27612:131;:::i;:::-;27604:139;;27502:248;;;:::o;27756:419::-;27922:4;27960:2;27949:9;27945:18;27937:26;;28009:9;28003:4;27999:20;27995:1;27984:9;27980:17;27973:47;28037:131;28163:4;28037:131;:::i;:::-;28029:139;;27927:248;;;:::o;28181:419::-;28347:4;28385:2;28374:9;28370:18;28362:26;;28434:9;28428:4;28424:20;28420:1;28409:9;28405:17;28398:47;28462:131;28588:4;28462:131;:::i;:::-;28454:139;;28352:248;;;:::o;28606:419::-;28772:4;28810:2;28799:9;28795:18;28787:26;;28859:9;28853:4;28849:20;28845:1;28834:9;28830:17;28823:47;28887:131;29013:4;28887:131;:::i;:::-;28879:139;;28777:248;;;:::o;29031:419::-;29197:4;29235:2;29224:9;29220:18;29212:26;;29284:9;29278:4;29274:20;29270:1;29259:9;29255:17;29248:47;29312:131;29438:4;29312:131;:::i;:::-;29304:139;;29202:248;;;:::o;29456:419::-;29622:4;29660:2;29649:9;29645:18;29637:26;;29709:9;29703:4;29699:20;29695:1;29684:9;29680:17;29673:47;29737:131;29863:4;29737:131;:::i;:::-;29729:139;;29627:248;;;:::o;29881:419::-;30047:4;30085:2;30074:9;30070:18;30062:26;;30134:9;30128:4;30124:20;30120:1;30109:9;30105:17;30098:47;30162:131;30288:4;30162:131;:::i;:::-;30154:139;;30052:248;;;:::o;30306:419::-;30472:4;30510:2;30499:9;30495:18;30487:26;;30559:9;30553:4;30549:20;30545:1;30534:9;30530:17;30523:47;30587:131;30713:4;30587:131;:::i;:::-;30579:139;;30477:248;;;:::o;30731:419::-;30897:4;30935:2;30924:9;30920:18;30912:26;;30984:9;30978:4;30974:20;30970:1;30959:9;30955:17;30948:47;31012:131;31138:4;31012:131;:::i;:::-;31004:139;;30902:248;;;:::o;31156:419::-;31322:4;31360:2;31349:9;31345:18;31337:26;;31409:9;31403:4;31399:20;31395:1;31384:9;31380:17;31373:47;31437:131;31563:4;31437:131;:::i;:::-;31429:139;;31327:248;;;:::o;31581:419::-;31747:4;31785:2;31774:9;31770:18;31762:26;;31834:9;31828:4;31824:20;31820:1;31809:9;31805:17;31798:47;31862:131;31988:4;31862:131;:::i;:::-;31854:139;;31752:248;;;:::o;32006:419::-;32172:4;32210:2;32199:9;32195:18;32187:26;;32259:9;32253:4;32249:20;32245:1;32234:9;32230:17;32223:47;32287:131;32413:4;32287:131;:::i;:::-;32279:139;;32177:248;;;:::o;32431:419::-;32597:4;32635:2;32624:9;32620:18;32612:26;;32684:9;32678:4;32674:20;32670:1;32659:9;32655:17;32648:47;32712:131;32838:4;32712:131;:::i;:::-;32704:139;;32602:248;;;:::o;32856:419::-;33022:4;33060:2;33049:9;33045:18;33037:26;;33109:9;33103:4;33099:20;33095:1;33084:9;33080:17;33073:47;33137:131;33263:4;33137:131;:::i;:::-;33129:139;;33027:248;;;:::o;33281:419::-;33447:4;33485:2;33474:9;33470:18;33462:26;;33534:9;33528:4;33524:20;33520:1;33509:9;33505:17;33498:47;33562:131;33688:4;33562:131;:::i;:::-;33554:139;;33452:248;;;:::o;33706:419::-;33872:4;33910:2;33899:9;33895:18;33887:26;;33959:9;33953:4;33949:20;33945:1;33934:9;33930:17;33923:47;33987:131;34113:4;33987:131;:::i;:::-;33979:139;;33877:248;;;:::o;34131:419::-;34297:4;34335:2;34324:9;34320:18;34312:26;;34384:9;34378:4;34374:20;34370:1;34359:9;34355:17;34348:47;34412:131;34538:4;34412:131;:::i;:::-;34404:139;;34302:248;;;:::o;34556:222::-;34649:4;34687:2;34676:9;34672:18;34664:26;;34700:71;34768:1;34757:9;34753:17;34744:6;34700:71;:::i;:::-;34654:124;;;;:::o;34784:129::-;34818:6;34845:20;;:::i;:::-;34835:30;;34874:33;34902:4;34894:6;34874:33;:::i;:::-;34825:88;;;:::o;34919:75::-;34952:6;34985:2;34979:9;34969:19;;34959:35;:::o;35000:311::-;35077:4;35167:18;35159:6;35156:30;35153:2;;;35189:18;;:::i;:::-;35153:2;35239:4;35231:6;35227:17;35219:25;;35299:4;35293;35289:15;35281:23;;35082:229;;;:::o;35317:307::-;35378:4;35468:18;35460:6;35457:30;35454:2;;;35490:18;;:::i;:::-;35454:2;35528:29;35550:6;35528:29;:::i;:::-;35520:37;;35612:4;35606;35602:15;35594:23;;35383:241;;;:::o;35630:308::-;35692:4;35782:18;35774:6;35771:30;35768:2;;;35804:18;;:::i;:::-;35768:2;35842:29;35864:6;35842:29;:::i;:::-;35834:37;;35926:4;35920;35916:15;35908:23;;35697:241;;;:::o;35944:98::-;35995:6;36029:5;36023:12;36013:22;;36002:40;;;:::o;36048:99::-;36100:6;36134:5;36128:12;36118:22;;36107:40;;;:::o;36153:168::-;36236:11;36270:6;36265:3;36258:19;36310:4;36305:3;36301:14;36286:29;;36248:73;;;;:::o;36327:147::-;36428:11;36465:3;36450:18;;36440:34;;;;:::o;36480:169::-;36564:11;36598:6;36593:3;36586:19;36638:4;36633:3;36629:14;36614:29;;36576:73;;;;:::o;36655:148::-;36757:11;36794:3;36779:18;;36769:34;;;;:::o;36809:305::-;36849:3;36868:20;36886:1;36868:20;:::i;:::-;36863:25;;36902:20;36920:1;36902:20;:::i;:::-;36897:25;;37056:1;36988:66;36984:74;36981:1;36978:81;36975:2;;;37062:18;;:::i;:::-;36975:2;37106:1;37103;37099:9;37092:16;;36853:261;;;;:::o;37120:185::-;37160:1;37177:20;37195:1;37177:20;:::i;:::-;37172:25;;37211:20;37229:1;37211:20;:::i;:::-;37206:25;;37250:1;37240:2;;37255:18;;:::i;:::-;37240:2;37297:1;37294;37290:9;37285:14;;37162:143;;;;:::o;37311:348::-;37351:7;37374:20;37392:1;37374:20;:::i;:::-;37369:25;;37408:20;37426:1;37408:20;:::i;:::-;37403:25;;37596:1;37528:66;37524:74;37521:1;37518:81;37513:1;37506:9;37499:17;37495:105;37492:2;;;37603:18;;:::i;:::-;37492:2;37651:1;37648;37644:9;37633:20;;37359:300;;;;:::o;37665:191::-;37705:4;37725:20;37743:1;37725:20;:::i;:::-;37720:25;;37759:20;37777:1;37759:20;:::i;:::-;37754:25;;37798:1;37795;37792:8;37789:2;;;37803:18;;:::i;:::-;37789:2;37848:1;37845;37841:9;37833:17;;37710:146;;;;:::o;37862:96::-;37899:7;37928:24;37946:5;37928:24;:::i;:::-;37917:35;;37907:51;;;:::o;37964:104::-;38009:7;38038:24;38056:5;38038:24;:::i;:::-;38027:35;;38017:51;;;:::o;38074:90::-;38108:7;38151:5;38144:13;38137:21;38126:32;;38116:48;;;:::o;38170:77::-;38207:7;38236:5;38225:16;;38215:32;;;:::o;38253:149::-;38289:7;38329:66;38322:5;38318:78;38307:89;;38297:105;;;:::o;38408:147::-;38463:7;38492:5;38481:16;;38498:51;38543:5;38498:51;:::i;:::-;38471:84;;;:::o;38561:139::-;38612:7;38641:5;38630:16;;38647:47;38688:5;38647:47;:::i;:::-;38620:80;;;:::o;38706:126::-;38743:7;38783:42;38776:5;38772:54;38761:65;;38751:81;;;:::o;38838:77::-;38875:7;38904:5;38893:16;;38883:32;;;:::o;38921:147::-;38987:9;39020:42;39056:5;39020:42;:::i;:::-;39007:55;;38997:71;;;:::o;39074:139::-;39136:9;39169:38;39201:5;39169:38;:::i;:::-;39156:51;;39146:67;;;:::o;39219:154::-;39303:6;39298:3;39293;39280:30;39365:1;39356:6;39351:3;39347:16;39340:27;39270:103;;;:::o;39379:307::-;39447:1;39457:113;39471:6;39468:1;39465:13;39457:113;;;39556:1;39551:3;39547:11;39541:18;39537:1;39532:3;39528:11;39521:39;39493:2;39490:1;39486:10;39481:15;;39457:113;;;39588:6;39585:1;39582:13;39579:2;;;39668:1;39659:6;39654:3;39650:16;39643:27;39579:2;39428:258;;;;:::o;39692:320::-;39736:6;39773:1;39767:4;39763:12;39753:22;;39820:1;39814:4;39810:12;39841:18;39831:2;;39897:4;39889:6;39885:17;39875:27;;39831:2;39959;39951:6;39948:14;39928:18;39925:38;39922:2;;;39978:18;;:::i;:::-;39922:2;39743:269;;;;:::o;40018:281::-;40101:27;40123:4;40101:27;:::i;:::-;40093:6;40089:40;40231:6;40219:10;40216:22;40195:18;40183:10;40180:34;40177:62;40174:2;;;40242:18;;:::i;:::-;40174:2;40282:10;40278:2;40271:22;40061:238;;;:::o;40305:233::-;40344:3;40367:24;40385:5;40367:24;:::i;:::-;40358:33;;40413:66;40406:5;40403:77;40400:2;;;40483:18;;:::i;:::-;40400:2;40530:1;40523:5;40519:13;40512:20;;40348:190;;;:::o;40544:100::-;40583:7;40612:26;40632:5;40612:26;:::i;:::-;40601:37;;40591:53;;;:::o;40650:94::-;40689:7;40718:20;40732:5;40718:20;:::i;:::-;40707:31;;40697:47;;;:::o;40750:176::-;40782:1;40799:20;40817:1;40799:20;:::i;:::-;40794:25;;40833:20;40851:1;40833:20;:::i;:::-;40828:25;;40872:1;40862:2;;40877:18;;:::i;:::-;40862:2;40918:1;40915;40911:9;40906:14;;40784:142;;;;:::o;40932:180::-;40980:77;40977:1;40970:88;41077:4;41074:1;41067:15;41101:4;41098:1;41091:15;41118:180;41166:77;41163:1;41156:88;41263:4;41260:1;41253:15;41287:4;41284:1;41277:15;41304:180;41352:77;41349:1;41342:88;41449:4;41446:1;41439:15;41473:4;41470:1;41463:15;41490:180;41538:77;41535:1;41528:88;41635:4;41632:1;41625:15;41659:4;41656:1;41649:15;41676:180;41724:77;41721:1;41714:88;41821:4;41818:1;41811:15;41845:4;41842:1;41835:15;41862:102;41903:6;41954:2;41950:7;41945:2;41938:5;41934:14;41930:28;41920:38;;41910:54;;;:::o;41970:94::-;42003:8;42051:5;42047:2;42043:14;42022:35;;42012:52;;;:::o;42070:237::-;42210:34;42206:1;42198:6;42194:14;42187:58;42279:20;42274:2;42266:6;42262:15;42255:45;42176:131;:::o;42313:225::-;42453:34;42449:1;42441:6;42437:14;42430:58;42522:8;42517:2;42509:6;42505:15;42498:33;42419:119;:::o;42544:224::-;42684:34;42680:1;42672:6;42668:14;42661:58;42753:7;42748:2;42740:6;42736:15;42729:32;42650:118;:::o;42774:178::-;42914:30;42910:1;42902:6;42898:14;42891:54;42880:72;:::o;42958:178::-;43098:30;43094:1;43086:6;43082:14;43075:54;43064:72;:::o;43142:224::-;43282:34;43278:1;43270:6;43266:14;43259:58;43351:7;43346:2;43338:6;43334:15;43327:32;43248:118;:::o;43372:223::-;43512:34;43508:1;43500:6;43496:14;43489:58;43581:6;43576:2;43568:6;43564:15;43557:31;43478:117;:::o;43601:175::-;43741:27;43737:1;43729:6;43725:14;43718:51;43707:69;:::o;43782:228::-;43922:34;43918:1;43910:6;43906:14;43899:58;43991:11;43986:2;43978:6;43974:15;43967:36;43888:122;:::o;44016:172::-;44156:24;44152:1;44144:6;44140:14;44133:48;44122:66;:::o;44194:249::-;44334:34;44330:1;44322:6;44318:14;44311:58;44403:32;44398:2;44390:6;44386:15;44379:57;44300:143;:::o;44449:182::-;44589:34;44585:1;44577:6;44573:14;44566:58;44555:76;:::o;44637:182::-;44777:34;44773:1;44765:6;44761:14;44754:58;44743:76;:::o;44825:230::-;44965:34;44961:1;44953:6;44949:14;44942:58;45034:13;45029:2;45021:6;45017:15;45010:38;44931:124;:::o;45061:220::-;45201:34;45197:1;45189:6;45185:14;45178:58;45270:3;45265:2;45257:6;45253:15;45246:28;45167:114;:::o;45287:174::-;45427:26;45423:1;45415:6;45411:14;45404:50;45393:68;:::o;45467:220::-;45607:34;45603:1;45595:6;45591:14;45584:58;45676:3;45671:2;45663:6;45659:15;45652:28;45573:114;:::o;45693:226::-;45833:34;45829:1;45821:6;45817:14;45810:58;45902:9;45897:2;45889:6;45885:15;45878:34;45799:120;:::o;45925:365::-;46065:34;46061:1;46053:6;46049:14;46042:58;46134:34;46129:2;46121:6;46117:15;46110:59;46203:34;46198:2;46190:6;46186:15;46179:59;46272:10;46267:2;46259:6;46255:15;46248:35;46031:259;:::o;46296:312::-;46436:34;46432:1;46424:6;46420:14;46413:58;46505:34;46500:2;46492:6;46488:15;46481:59;46574:26;46569:2;46561:6;46557:15;46550:51;46402:206;:::o;46614:114::-;46720:8;:::o;46734:368::-;46874:34;46870:1;46862:6;46858:14;46851:58;46943:34;46938:2;46930:6;46926:15;46919:59;47012:34;47007:2;46999:6;46995:15;46988:59;47081:13;47076:2;47068:6;47064:15;47057:38;46840:262;:::o;47108:224::-;47248:34;47244:1;47236:6;47232:14;47225:58;47317:7;47312:2;47304:6;47300:15;47293:32;47214:118;:::o;47338:236::-;47478:34;47474:1;47466:6;47462:14;47455:58;47547:19;47542:2;47534:6;47530:15;47523:44;47444:130;:::o;47580:233::-;47720:34;47716:1;47708:6;47704:14;47697:58;47789:16;47784:2;47776:6;47772:15;47765:41;47686:127;:::o;47819:123::-;47910:1;47903:5;47900:12;47890:2;;47916:18;;:::i;:::-;47890:2;47880:62;:::o;47948:119::-;48035:1;48028:5;48025:12;48015:2;;48041:18;;:::i;:::-;48015:2;48005:62;:::o;48073:122::-;48146:24;48164:5;48146:24;:::i;:::-;48139:5;48136:35;48126:2;;48185:1;48182;48175:12;48126:2;48116:79;:::o;48201:138::-;48282:32;48308:5;48282:32;:::i;:::-;48275:5;48272:43;48262:2;;48329:1;48326;48319:12;48262:2;48252:87;:::o;48345:116::-;48415:21;48430:5;48415:21;:::i;:::-;48408:5;48405:32;48395:2;;48451:1;48448;48441:12;48395:2;48385:76;:::o;48467:122::-;48540:24;48558:5;48540:24;:::i;:::-;48533:5;48530:35;48520:2;;48579:1;48576;48569:12;48520:2;48510:79;:::o;48595:120::-;48667:23;48684:5;48667:23;:::i;:::-;48660:5;48657:34;48647:2;;48705:1;48702;48695:12;48647:2;48637:78;:::o;48721:117::-;48812:1;48805:5;48802:12;48792:2;;48828:1;48825;48818:12;48792:2;48782:56;:::o;48844:113::-;48931:1;48924:5;48921:12;48911:2;;48947:1;48944;48937:12;48911:2;48901:56;:::o;48963:122::-;49036:24;49054:5;49036:24;:::i;:::-;49029:5;49026:35;49016:2;;49075:1;49072;49065:12;49016:2;49006:79;:::o

Swarm Source

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