ETH Price: $3,399.67 (+1.95%)

Token

AwakenedKuma (AK)
 

Overview

Max Total Supply

2,174 AK

Holders

918

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 AK
0x2170Ed7Fd7bfbffa58b181A4C674F499270279fF
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:
AwakenedKuma

Compiler Version
v0.8.14+commit.80d49f37

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (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/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.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: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _burn(tokenId);
    }
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/kumaBoss1.sol


pragma solidity ^0.8.14;











contract AwakenedKuma is ERC721, ERC721Enumerable, ERC721Burnable, Ownable, ReentrancyGuard {
    uint256 public maxWLMint = 10;
    uint256 public maxPublicMint = 10;
    uint256 totalMaxSupply = 5569;

    using Counters for Counters.Counter;
    string private _baseTokenURI;
    string public ext = ".json";
    bytes32 public whitelistMerkleRoot;
    bytes32 public secCheck = 0xa29ca91f3abb3cc4828f55a8f47a2a5fd7610f868f6bc5f9f91e59d768663f2b;
    bool public publicSwitch = false;
    bool public whitelistSwitch = false;
    bool public holderSwitch = false;
    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("AwakenedKuma", "AK") {
    }

    function holderMint(bytes32[] calldata _merkleProof,bytes calldata checkID) external payable nonReentrant {
        // _tokenIdCounter.increment();
        require(holderSwitch == true,"Holder mint is paused");
        uint[] memory kumaID;
        kumaID = decodeID(checkID);
        require(totalSupply() + kumaID.length <= totalMaxSupply,"Max Kuma exceeded");
        require(whitelistValidity(_merkleProof), "Invalid proof");
        for(uint i; i < kumaID.length; i++ ){
            require(!_exists(kumaID[i]),"Kuma had Awakened");
            _safeMint(msg.sender, kumaID[i]);
        }
    }

    function wlMint(bytes32[] calldata _merkleProof, uint256 awakenNum) external payable nonReentrant{
        require(whitelistSwitch == true,"WL mint is paused");
        require(awakenNum > 0, "Mint qty should be over 0");
        require(awakenNum <= maxWLMint, "Max mint per transaction exceeded");
        require(totalSupply() + awakenNum <= totalMaxSupply,"Max Kuma exceeded");
        require(whitelistValidity(_merkleProof), "Invalid proof");
        uint256[] memory kumaID = new uint256[](awakenNum);
        uint256 tokenID = _tokenIdCounter.current();
        for(uint i; i< awakenNum; i++){
          while(tokenID < totalMaxSupply){
             if(!_exists(tokenID)){
                kumaID[i] = tokenID;
                _tokenIdCounter.increment();
                break;
             }
             _tokenIdCounter.increment();
            }
        }
        for(uint i; i < kumaID.length; i++ ){
            require(!_exists(kumaID[i]),"Kuma had Awakened");
            _safeMint(msg.sender, kumaID[i]);
        }

    }

    function publicMint(uint256 awakenNum) external payable nonReentrant{
        require(publicSwitch == true,"Public mint is paused");
        require(awakenNum <= maxPublicMint, "Max mint per transaction exceeded");
        require(totalSupply() + awakenNum <= totalMaxSupply,"Max Kuma exceeded");
        uint256[] memory kumaID = new uint256[](awakenNum);
        uint256 tokenID = _tokenIdCounter.current();
        for(uint i; i< awakenNum; i++){
          while(tokenID < totalMaxSupply){
             if(!_exists(tokenID)){
                kumaID[i] = tokenID;
                _tokenIdCounter.increment();
                break;
             }
             _tokenIdCounter.increment();
            }
        }
        for(uint i; i < kumaID.length; i++ ){
            require(!_exists(kumaID[i]),"Kuma had Awakened");
            _safeMint(msg.sender, kumaID[i]);
        }

    }

    function ownerMint(address to, uint256 awakenMint) external onlyOwner{
        require(totalSupply() + awakenMint <= totalMaxSupply, "Max mint per transaction exceeded");
        uint256[] memory kumaID = new uint256[](awakenMint);
        uint256 tokenID = _tokenIdCounter.current();
        for(uint i; i< awakenMint; i++){
          while(tokenID < totalMaxSupply){
             if(!_exists(tokenID)){
                kumaID[i] = tokenID;
                _tokenIdCounter.increment();
                break;
             }
             _tokenIdCounter.increment();
            }
        }
        for(uint i; i < kumaID.length; i++ ){
            require(!_exists(kumaID[i]),"Kuma had Awakened");
            _safeMint(to, kumaID[i]);
        }
    }
    
    function setTotalSupply(uint256 _totalMaxSupply) external onlyOwner {
      totalMaxSupply = _totalMaxSupply; 
    }
    
    function setSecCheck(bytes32 _secCheck) external onlyOwner{
      secCheck = _secCheck;
    }

    function pausePublicMint() external onlyOwner {
      publicSwitch = !publicSwitch; 
    }

    function pauseWhitelistMint() external onlyOwner {
      whitelistSwitch = !whitelistSwitch; 
    }

    function pauseHolderMint() external onlyOwner {
      holderSwitch = !holderSwitch; 
    }

    function decodeID(bytes calldata data) internal view returns(uint[] memory arr){
        bytes32 hash;
        uint sec;
        uint[] memory check;
        (sec, check) = abi.decode(data, (uint, uint[]));
        hash = keccak256(abi.encodePacked(sec));
        require(hash == secCheck, "The Hash is incorrect");
        arr = check;
    } 

    function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot) external onlyOwner {
        whitelistMerkleRoot = _whitelistMerkleRoot;
    }

    function whitelistValidity(bytes32[] calldata _merkleProof) public view returns (bool){
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, whitelistMerkleRoot, leaf), "Incorrect proof");
        return true; 
    }

    function burnKuma(uint256 tokenId) public onlyOwner {
        require(_exists(tokenId),"Kuma doesn't exist");
        _burn(tokenId);
    }

    function _baseURI() internal view virtual override returns (string memory) {
      return _baseTokenURI;
    }
    
    function setBaseURI(string calldata baseURI) public onlyOwner {
      _baseTokenURI = baseURI;
    }

 /**
  * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
  */
  function tokenURI(uint tokenId) public view virtual override returns (string memory) {
     require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
      string memory currentBaseURI = _baseURI();
      return bytes(currentBaseURI).length > 0
          ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), ext))
          : "";
  }

    // The following functions are overrides required by Solidity.

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnKuma","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ext","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bytes","name":"checkID","type":"bytes"}],"name":"holderMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"holderSwitch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWLMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"awakenMint","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseHolderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pausePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"awakenNum","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSwitch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"secCheck","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_secCheck","type":"bytes32"}],"name":"setSecCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalMaxSupply","type":"uint256"}],"name":"setTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSwitch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistValidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"awakenNum","type":"uint256"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600a600c55600a600d556115c1600e556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090805190602001906200006192919062000284565b507fa29ca91f3abb3cc4828f55a8f47a2a5fd7610f868f6bc5f9f91e59d768663f2b60001b6012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506000601360026101000a81548160ff021916908315150217905550348015620000e757600080fd5b506040518060400160405280600c81526020017f4177616b656e65644b756d6100000000000000000000000000000000000000008152506040518060400160405280600281526020017f414b00000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200016c92919062000284565b5080600190805190602001906200018592919062000284565b505050620001a86200019c620001b660201b60201c565b620001be60201b60201c565b6001600b8190555062000398565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002929062000363565b90600052602060002090601f016020900481019282620002b6576000855562000302565b82601f10620002d157805160ff191683800117855562000302565b8280016001018555821562000302579182015b8281111562000301578251825591602001919060010190620002e4565b5b50905062000311919062000315565b5090565b5b808211156200033057600081600090555060010162000316565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200037c57607f821691505b60208210810362000392576200039162000334565b5b50919050565b6151b780620003a86000396000f3fe6080604052600436106102465760003560e01c806359dca7c911610139578063aa98e0c6116100b6578063cabadaa01161007a578063cabadaa014610829578063cf9f23b514610854578063d63bdf671461087f578063e985e9c5146108aa578063f2fde38b146108e7578063f7ea7a3d1461091057610246565b8063aa98e0c614610744578063b88d4fde1461076f578063bcd25ee514610798578063bd32fb66146107c3578063c87b56dd146107ec57610246565b806372e171ba116100fd57806372e171ba1461067e578063872ea6e0146106a95780638da5cb5b146106c557806395d89b41146106f0578063a22cb4651461071b57610246565b806359dca7c9146105975780636352211e146105c257806364c4d4f6146105ff57806370a082311461062a578063715018a61461066757610246565b80632f745c59116101c757806342966c681161018b57806342966c68146104b657806347d8ffd3146104df578063484b973c146105085780634f6ccce71461053157806355f804b31461056e57610246565b80632f745c59146103e557806330a1aa23146104225780633169accd1461045f57806335ac3bcc1461047657806342842e0e1461048d57610246565b806318160ddd1161020e57806318160ddd14610330578063218022d41461035b57806322f74bcb1461038457806323b872dd146103a05780632db11544146103c957610246565b806301ffc9a71461024b578063056f8a3d1461028857806306fdde031461029f578063081812fc146102ca578063095ea7b314610307575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d919061358c565b610939565b60405161027f91906135d4565b60405180910390f35b34801561029457600080fd5b5061029d61094b565b005b3480156102ab57600080fd5b506102b461097f565b6040516102c19190613688565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906136e0565b610a11565b6040516102fe919061374e565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190613795565b610a57565b005b34801561033c57600080fd5b50610345610b6e565b60405161035291906137e4565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d9190613835565b610b7b565b005b61039e600480360381019061039991906138c7565b610b8d565b005b3480156103ac57600080fd5b506103c760048036038101906103c29190613927565b610ede565b005b6103e360048036038101906103de91906136e0565b610f3e565b005b3480156103f157600080fd5b5061040c60048036038101906104079190613795565b611201565b60405161041991906137e4565b60405180910390f35b34801561042e57600080fd5b506104496004803603810190610444919061397a565b6112a6565b60405161045691906135d4565b60405180910390f35b34801561046b57600080fd5b5061047461136a565b005b34801561048257600080fd5b5061048b61139e565b005b34801561049957600080fd5b506104b460048036038101906104af9190613927565b6113d2565b005b3480156104c257600080fd5b506104dd60048036038101906104d891906136e0565b6113f2565b005b3480156104eb57600080fd5b50610506600480360381019061050191906136e0565b61144e565b005b34801561051457600080fd5b5061052f600480360381019061052a9190613795565b6114aa565b005b34801561053d57600080fd5b50610558600480360381019061055391906136e0565b611686565b60405161056591906137e4565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613a1d565b6116f7565b005b3480156105a357600080fd5b506105ac611715565b6040516105b991906137e4565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e491906136e0565b61171b565b6040516105f6919061374e565b60405180910390f35b34801561060b57600080fd5b506106146117cc565b60405161062191906135d4565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190613a6a565b6117df565b60405161065e91906137e4565b60405180910390f35b34801561067357600080fd5b5061067c611896565b005b34801561068a57600080fd5b506106936118aa565b6040516106a09190613aa6565b60405180910390f35b6106c360048036038101906106be9190613b17565b6118b0565b005b3480156106d157600080fd5b506106da611ab8565b6040516106e7919061374e565b60405180910390f35b3480156106fc57600080fd5b50610705611ae2565b6040516107129190613688565b60405180910390f35b34801561072757600080fd5b50610742600480360381019061073d9190613bc4565b611b74565b005b34801561075057600080fd5b50610759611b8a565b6040516107669190613aa6565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190613d34565b611b90565b005b3480156107a457600080fd5b506107ad611bf2565b6040516107ba91906135d4565b60405180910390f35b3480156107cf57600080fd5b506107ea60048036038101906107e59190613835565b611c05565b005b3480156107f857600080fd5b50610813600480360381019061080e91906136e0565b611c17565b6040516108209190613688565b60405180910390f35b34801561083557600080fd5b5061083e611cc1565b60405161084b91906137e4565b60405180910390f35b34801561086057600080fd5b50610869611cc7565b6040516108769190613688565b60405180910390f35b34801561088b57600080fd5b50610894611d55565b6040516108a191906135d4565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc9190613db7565b611d68565b6040516108de91906135d4565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613a6a565b611dfc565b005b34801561091c57600080fd5b50610937600480360381019061093291906136e0565b611e7f565b005b600061094482611e91565b9050919050565b610953611f0b565b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b60606000805461098e90613e26565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba90613e26565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b5050505050905090565b6000610a1c82611f89565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a628261171b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990613ec9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af1611fd4565b73ffffffffffffffffffffffffffffffffffffffff161480610b205750610b1f81610b1a611fd4565b611d68565b5b610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5690613f5b565b60405180910390fd5b610b698383611fdc565b505050565b6000600880549050905090565b610b83611f0b565b8060128190555050565b6002600b5403610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613fc7565b60405180910390fd5b6002600b8190555060011515601360019054906101000a900460ff16151514610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790614033565b60405180910390fd5b60008111610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a9061409f565b60405180910390fd5b600c54811115610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caf90614131565b60405180910390fd5b600e5481610cc4610b6e565b610cce9190614180565b1115610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614222565b60405180910390fd5b610d1983836112a6565b610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f9061428e565b60405180910390fd5b60008167ffffffffffffffff811115610d7457610d73613c09565b5b604051908082528060200260200182016040528015610da25781602001602082028036833780820191505090505b5090506000610db16014612095565b905060005b83811015610e27575b600e54821015610e1457610dd2826120a3565b610e055781838281518110610dea57610de96142ae565b5b602002602001018181525050610e00601461210f565b610e14565b610e0f601461210f565b610dbf565b8080610e1f906142dd565b915050610db6565b5060005b8251811015610ece57610e57838281518110610e4a57610e496142ae565b5b60200260200101516120a3565b15610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90614371565b60405180910390fd5b610ebb33848381518110610eae57610ead6142ae565b5b6020026020010151612125565b8080610ec6906142dd565b915050610e2b565b5050506001600b81905550505050565b610eef610ee9611fd4565b82612143565b610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590614403565b60405180910390fd5b610f398383836121d8565b505050565b6002600b5403610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90613fc7565b60405180910390fd5b6002600b8190555060011515601360009054906101000a900460ff16151514610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd89061446f565b60405180910390fd5b600d54811115611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90614131565b60405180910390fd5b600e5481611032610b6e565b61103c9190614180565b111561107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490614222565b60405180910390fd5b60008167ffffffffffffffff81111561109957611098613c09565b5b6040519080825280602002602001820160405280156110c75781602001602082028036833780820191505090505b50905060006110d66014612095565b905060005b8381101561114c575b600e54821015611139576110f7826120a3565b61112a578183828151811061110f5761110e6142ae565b5b602002602001018181525050611125601461210f565b611139565b611134601461210f565b6110e4565b8080611144906142dd565b9150506110db565b5060005b82518110156111f35761117c83828151811061116f5761116e6142ae565b5b60200260200101516120a3565b156111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614371565b60405180910390fd5b6111e0338483815181106111d3576111d26142ae565b5b6020026020010151612125565b80806111eb906142dd565b915050611150565b5050506001600b8190555050565b600061120c836117df565b821061124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124490614501565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080336040516020016112ba9190614569565b604051602081830303815290604052805190602001209050611320848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506011548361243e565b61135f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611356906145d0565b60405180910390fd5b600191505092915050565b611372611f0b565b601360029054906101000a900460ff1615601360026101000a81548160ff021916908315150217905550565b6113a6611f0b565b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b6113ed83838360405180602001604052806000815250611b90565b505050565b6114036113fd611fd4565b82612143565b611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614403565b60405180910390fd5b61144b81612455565b50565b611456611f0b565b61145f816120a3565b61149e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114959061463c565b60405180910390fd5b6114a781612455565b50565b6114b2611f0b565b600e54816114be610b6e565b6114c89190614180565b1115611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614131565b60405180910390fd5b60008167ffffffffffffffff81111561152557611524613c09565b5b6040519080825280602002602001820160405280156115535781602001602082028036833780820191505090505b50905060006115626014612095565b905060005b838110156115d8575b600e548210156115c557611583826120a3565b6115b6578183828151811061159b5761159a6142ae565b5b6020026020010181815250506115b1601461210f565b6115c5565b6115c0601461210f565b611570565b80806115d0906142dd565b915050611567565b5060005b825181101561167f576116088382815181106115fb576115fa6142ae565b5b60200260200101516120a3565b15611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90614371565b60405180910390fd5b61166c8584838151811061165f5761165e6142ae565b5b6020026020010151612125565b8080611677906142dd565b9150506115dc565b5050505050565b6000611690610b6e565b82106116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c8906146ce565b60405180910390fd5b600882815481106116e5576116e46142ae565b5b90600052602060002001549050919050565b6116ff611f0b565b8181600f919061171092919061347d565b505050565b600c5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba9061473a565b60405180910390fd5b80915050919050565b601360029054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611846906147cc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61189e611f0b565b6118a86000612572565b565b60125481565b6002600b54036118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90613fc7565b60405180910390fd5b6002600b8190555060011515601360029054906101000a900460ff16151514611953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194a90614838565b60405180910390fd5b606061195f8383612638565b9050600e54815161196e610b6e565b6119789190614180565b11156119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090614222565b60405180910390fd5b6119c385856112a6565b611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f99061428e565b60405180910390fd5b60005b8151811015611aa857611a31828281518110611a2457611a236142ae565b5b60200260200101516120a3565b15611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614371565b60405180910390fd5b611a9533838381518110611a8857611a876142ae565b5b6020026020010151612125565b8080611aa0906142dd565b915050611a05565b50506001600b8190555050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611af190613e26565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1d90613e26565b8015611b6a5780601f10611b3f57610100808354040283529160200191611b6a565b820191906000526020600020905b815481529060010190602001808311611b4d57829003601f168201915b5050505050905090565b611b86611b7f611fd4565b83836126cf565b5050565b60115481565b611ba1611b9b611fd4565b83612143565b611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd790614403565b60405180910390fd5b611bec8484848461283b565b50505050565b601360019054906101000a900460ff1681565b611c0d611f0b565b8060118190555050565b6060611c22826120a3565b611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c58906148ca565b60405180910390fd5b6000611c6b612897565b90506000815111611c8b5760405180602001604052806000815250611cb9565b80611c9584612929565b6010604051602001611ca9939291906149ba565b6040516020818303038152906040525b915050919050565b600d5481565b60108054611cd490613e26565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0090613e26565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e04611f0b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90614a5d565b60405180910390fd5b611e7c81612572565b50565b611e87611f0b565b80600e8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f045750611f0382612a89565b5b9050919050565b611f13611fd4565b73ffffffffffffffffffffffffffffffffffffffff16611f31611ab8565b73ffffffffffffffffffffffffffffffffffffffff1614611f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7e90614ac9565b60405180910390fd5b565b611f92816120a3565b611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc89061473a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661204f8361171b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001816000016000828254019250508190555050565b61213f828260405180602001604052806000815250612b6b565b5050565b60008061214f8361171b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061219157506121908185611d68565b5b806121cf57508373ffffffffffffffffffffffffffffffffffffffff166121b784610a11565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121f88261171b565b73ffffffffffffffffffffffffffffffffffffffff161461224e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224590614b5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490614bed565b60405180910390fd5b6122c8838383612bc6565b6122d3600082611fdc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123239190614c0d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461237a9190614180565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612439838383612bd6565b505050565b60008261244b8584612bdb565b1490509392505050565b60006124608261171b565b905061246e81600084612bc6565b612479600083611fdc565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c99190614c0d565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461256e81600084612bd6565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000806060858581019061264e9190614d04565b8092508193505050816040516020016126679190614d81565b60405160208183030381529060405280519060200120925060125483146126c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ba90614de8565b60405180910390fd5b80935050505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361273d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273490614e54565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282e91906135d4565b60405180910390a3505050565b6128468484846121d8565b61285284848484612c31565b612891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288890614ee6565b60405180910390fd5b50505050565b6060600f80546128a690613e26565b80601f01602080910402602001604051908101604052809291908181526020018280546128d290613e26565b801561291f5780601f106128f45761010080835404028352916020019161291f565b820191906000526020600020905b81548152906001019060200180831161290257829003601f168201915b5050505050905090565b606060008203612970576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a84565b600082905060005b600082146129a257808061298b906142dd565b915050600a8261299b9190614f35565b9150612978565b60008167ffffffffffffffff8111156129be576129bd613c09565b5b6040519080825280601f01601f1916602001820160405280156129f05781602001600182028036833780820191505090505b5090505b60008514612a7d57600182612a099190614c0d565b9150600a85612a189190614f66565b6030612a249190614180565b60f81b818381518110612a3a57612a396142ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a769190614f35565b94506129f4565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b5457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b645750612b6382612db8565b5b9050919050565b612b758383612e22565b612b826000848484612c31565b612bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb890614ee6565b60405180910390fd5b505050565b612bd1838383612ffb565b505050565b505050565b60008082905060005b8451811015612c2657612c1182868381518110612c0457612c036142ae565b5b602002602001015161310d565b91508080612c1e906142dd565b915050612be4565b508091505092915050565b6000612c528473ffffffffffffffffffffffffffffffffffffffff16613138565b15612dab578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c7b611fd4565b8786866040518563ffffffff1660e01b8152600401612c9d9493929190614fec565b6020604051808303816000875af1925050508015612cd957506040513d601f19601f82011682018060405250810190612cd6919061504d565b60015b612d5b573d8060008114612d09576040519150601f19603f3d011682016040523d82523d6000602084013e612d0e565b606091505b506000815103612d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4a90614ee6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612db0565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e88906150c6565b60405180910390fd5b612e9a816120a3565b15612eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed190615132565b60405180910390fd5b612ee660008383612bc6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f369190614180565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ff760008383612bd6565b5050565b61300683838361315b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036130485761304381613160565b613087565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130865761308583826131a9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130c9576130c481613316565b613108565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131075761310682826133e7565b5b5b505050565b6000818310613125576131208284613466565b613130565b61312f8383613466565b5b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131b6846117df565b6131c09190614c0d565b90506000600760008481526020019081526020016000205490508181146132a5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061332a9190614c0d565b905060006009600084815260200190815260200160002054905060006008838154811061335a576133596142ae565b5b90600052602060002001549050806008838154811061337c5761337b6142ae565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133cb576133ca615152565b5b6001900381819060005260206000200160009055905550505050565b60006133f2836117df565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b82805461348990613e26565b90600052602060002090601f0160209004810192826134ab57600085556134f2565b82601f106134c457803560ff19168380011785556134f2565b828001600101855582156134f2579182015b828111156134f15782358255916020019190600101906134d6565b5b5090506134ff9190613503565b5090565b5b8082111561351c576000816000905550600101613504565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61356981613534565b811461357457600080fd5b50565b60008135905061358681613560565b92915050565b6000602082840312156135a2576135a161352a565b5b60006135b084828501613577565b91505092915050565b60008115159050919050565b6135ce816135b9565b82525050565b60006020820190506135e960008301846135c5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561362957808201518184015260208101905061360e565b83811115613638576000848401525b50505050565b6000601f19601f8301169050919050565b600061365a826135ef565b61366481856135fa565b935061367481856020860161360b565b61367d8161363e565b840191505092915050565b600060208201905081810360008301526136a2818461364f565b905092915050565b6000819050919050565b6136bd816136aa565b81146136c857600080fd5b50565b6000813590506136da816136b4565b92915050565b6000602082840312156136f6576136f561352a565b5b6000613704848285016136cb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137388261370d565b9050919050565b6137488161372d565b82525050565b6000602082019050613763600083018461373f565b92915050565b6137728161372d565b811461377d57600080fd5b50565b60008135905061378f81613769565b92915050565b600080604083850312156137ac576137ab61352a565b5b60006137ba85828601613780565b92505060206137cb858286016136cb565b9150509250929050565b6137de816136aa565b82525050565b60006020820190506137f960008301846137d5565b92915050565b6000819050919050565b613812816137ff565b811461381d57600080fd5b50565b60008135905061382f81613809565b92915050565b60006020828403121561384b5761384a61352a565b5b600061385984828501613820565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261388757613886613862565b5b8235905067ffffffffffffffff8111156138a4576138a3613867565b5b6020830191508360208202830111156138c0576138bf61386c565b5b9250929050565b6000806000604084860312156138e0576138df61352a565b5b600084013567ffffffffffffffff8111156138fe576138fd61352f565b5b61390a86828701613871565b9350935050602061391d868287016136cb565b9150509250925092565b6000806000606084860312156139405761393f61352a565b5b600061394e86828701613780565b935050602061395f86828701613780565b9250506040613970868287016136cb565b9150509250925092565b600080602083850312156139915761399061352a565b5b600083013567ffffffffffffffff8111156139af576139ae61352f565b5b6139bb85828601613871565b92509250509250929050565b60008083601f8401126139dd576139dc613862565b5b8235905067ffffffffffffffff8111156139fa576139f9613867565b5b602083019150836001820283011115613a1657613a1561386c565b5b9250929050565b60008060208385031215613a3457613a3361352a565b5b600083013567ffffffffffffffff811115613a5257613a5161352f565b5b613a5e858286016139c7565b92509250509250929050565b600060208284031215613a8057613a7f61352a565b5b6000613a8e84828501613780565b91505092915050565b613aa0816137ff565b82525050565b6000602082019050613abb6000830184613a97565b92915050565b60008083601f840112613ad757613ad6613862565b5b8235905067ffffffffffffffff811115613af457613af3613867565b5b602083019150836001820283011115613b1057613b0f61386c565b5b9250929050565b60008060008060408587031215613b3157613b3061352a565b5b600085013567ffffffffffffffff811115613b4f57613b4e61352f565b5b613b5b87828801613871565b9450945050602085013567ffffffffffffffff811115613b7e57613b7d61352f565b5b613b8a87828801613ac1565b925092505092959194509250565b613ba1816135b9565b8114613bac57600080fd5b50565b600081359050613bbe81613b98565b92915050565b60008060408385031215613bdb57613bda61352a565b5b6000613be985828601613780565b9250506020613bfa85828601613baf565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c418261363e565b810181811067ffffffffffffffff82111715613c6057613c5f613c09565b5b80604052505050565b6000613c73613520565b9050613c7f8282613c38565b919050565b600067ffffffffffffffff821115613c9f57613c9e613c09565b5b613ca88261363e565b9050602081019050919050565b82818337600083830152505050565b6000613cd7613cd284613c84565b613c69565b905082815260208101848484011115613cf357613cf2613c04565b5b613cfe848285613cb5565b509392505050565b600082601f830112613d1b57613d1a613862565b5b8135613d2b848260208601613cc4565b91505092915050565b60008060008060808587031215613d4e57613d4d61352a565b5b6000613d5c87828801613780565b9450506020613d6d87828801613780565b9350506040613d7e878288016136cb565b925050606085013567ffffffffffffffff811115613d9f57613d9e61352f565b5b613dab87828801613d06565b91505092959194509250565b60008060408385031215613dce57613dcd61352a565b5b6000613ddc85828601613780565b9250506020613ded85828601613780565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e3e57607f821691505b602082108103613e5157613e50613df7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb36021836135fa565b9150613ebe82613e57565b604082019050919050565b60006020820190508181036000830152613ee281613ea6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613f45603e836135fa565b9150613f5082613ee9565b604082019050919050565b60006020820190508181036000830152613f7481613f38565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fb1601f836135fa565b9150613fbc82613f7b565b602082019050919050565b60006020820190508181036000830152613fe081613fa4565b9050919050565b7f574c206d696e7420697320706175736564000000000000000000000000000000600082015250565b600061401d6011836135fa565b915061402882613fe7565b602082019050919050565b6000602082019050818103600083015261404c81614010565b9050919050565b7f4d696e74207174792073686f756c64206265206f766572203000000000000000600082015250565b60006140896019836135fa565b915061409482614053565b602082019050919050565b600060208201905081810360008301526140b88161407c565b9050919050565b7f4d6178206d696e7420706572207472616e73616374696f6e206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061411b6021836135fa565b9150614126826140bf565b604082019050919050565b6000602082019050818103600083015261414a8161410e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061418b826136aa565b9150614196836136aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141cb576141ca614151565b5b828201905092915050565b7f4d6178204b756d61206578636565646564000000000000000000000000000000600082015250565b600061420c6011836135fa565b9150614217826141d6565b602082019050919050565b6000602082019050818103600083015261423b816141ff565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614278600d836135fa565b915061428382614242565b602082019050919050565b600060208201905081810360008301526142a78161426b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006142e8826136aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361431a57614319614151565b5b600182019050919050565b7f4b756d6120686164204177616b656e6564000000000000000000000000000000600082015250565b600061435b6011836135fa565b915061436682614325565b602082019050919050565b6000602082019050818103600083015261438a8161434e565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006143ed602e836135fa565b91506143f882614391565b604082019050919050565b6000602082019050818103600083015261441c816143e0565b9050919050565b7f5075626c6963206d696e74206973207061757365640000000000000000000000600082015250565b60006144596015836135fa565b915061446482614423565b602082019050919050565b600060208201905081810360008301526144888161444c565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006144eb602b836135fa565b91506144f68261448f565b604082019050919050565b6000602082019050818103600083015261451a816144de565b9050919050565b60008160601b9050919050565b600061453982614521565b9050919050565b600061454b8261452e565b9050919050565b61456361455e8261372d565b614540565b82525050565b60006145758284614552565b60148201915081905092915050565b7f496e636f72726563742070726f6f660000000000000000000000000000000000600082015250565b60006145ba600f836135fa565b91506145c582614584565b602082019050919050565b600060208201905081810360008301526145e9816145ad565b9050919050565b7f4b756d6120646f65736e27742065786973740000000000000000000000000000600082015250565b60006146266012836135fa565b9150614631826145f0565b602082019050919050565b6000602082019050818103600083015261465581614619565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006146b8602c836135fa565b91506146c38261465c565b604082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006147246018836135fa565b915061472f826146ee565b602082019050919050565b6000602082019050818103600083015261475381614717565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006147b66029836135fa565b91506147c18261475a565b604082019050919050565b600060208201905081810360008301526147e5816147a9565b9050919050565b7f486f6c646572206d696e74206973207061757365640000000000000000000000600082015250565b60006148226015836135fa565b915061482d826147ec565b602082019050919050565b6000602082019050818103600083015261485181614815565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148b4602f836135fa565b91506148bf82614858565b604082019050919050565b600060208201905081810360008301526148e3816148a7565b9050919050565b600081905092915050565b6000614900826135ef565b61490a81856148ea565b935061491a81856020860161360b565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461494881613e26565b61495281866148ea565b9450600182166000811461496d576001811461497e576149b1565b60ff198316865281860193506149b1565b61498785614926565b60005b838110156149a95781548189015260018201915060208101905061498a565b838801955050505b50505092915050565b60006149c682866148f5565b91506149d282856148f5565b91506149de828461493b565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a476026836135fa565b9150614a52826149eb565b604082019050919050565b60006020820190508181036000830152614a7681614a3a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ab36020836135fa565b9150614abe82614a7d565b602082019050919050565b60006020820190508181036000830152614ae281614aa6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b456025836135fa565b9150614b5082614ae9565b604082019050919050565b60006020820190508181036000830152614b7481614b38565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614bd76024836135fa565b9150614be282614b7b565b604082019050919050565b60006020820190508181036000830152614c0681614bca565b9050919050565b6000614c18826136aa565b9150614c23836136aa565b925082821015614c3657614c35614151565b5b828203905092915050565b600067ffffffffffffffff821115614c5c57614c5b613c09565b5b602082029050602081019050919050565b6000614c80614c7b84614c41565b613c69565b90508083825260208201905060208402830185811115614ca357614ca261386c565b5b835b81811015614ccc5780614cb888826136cb565b845260208401935050602081019050614ca5565b5050509392505050565b600082601f830112614ceb57614cea613862565b5b8135614cfb848260208601614c6d565b91505092915050565b60008060408385031215614d1b57614d1a61352a565b5b6000614d29858286016136cb565b925050602083013567ffffffffffffffff811115614d4a57614d4961352f565b5b614d5685828601614cd6565b9150509250929050565b6000819050919050565b614d7b614d76826136aa565b614d60565b82525050565b6000614d8d8284614d6a565b60208201915081905092915050565b7f546865204861736820697320696e636f72726563740000000000000000000000600082015250565b6000614dd26015836135fa565b9150614ddd82614d9c565b602082019050919050565b60006020820190508181036000830152614e0181614dc5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e3e6019836135fa565b9150614e4982614e08565b602082019050919050565b60006020820190508181036000830152614e6d81614e31565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614ed06032836135fa565b9150614edb82614e74565b604082019050919050565b60006020820190508181036000830152614eff81614ec3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f40826136aa565b9150614f4b836136aa565b925082614f5b57614f5a614f06565b5b828204905092915050565b6000614f71826136aa565b9150614f7c836136aa565b925082614f8c57614f8b614f06565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614fbe82614f97565b614fc88185614fa2565b9350614fd881856020860161360b565b614fe18161363e565b840191505092915050565b6000608082019050615001600083018761373f565b61500e602083018661373f565b61501b60408301856137d5565b818103606083015261502d8184614fb3565b905095945050505050565b60008151905061504781613560565b92915050565b6000602082840312156150635761506261352a565b5b600061507184828501615038565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006150b06020836135fa565b91506150bb8261507a565b602082019050919050565b600060208201905081810360008301526150df816150a3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061511c601c836135fa565b9150615127826150e6565b602082019050919050565b6000602082019050818103600083015261514b8161510f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212201ca0e615e8bf3819002d9e844bf5e7c9c048846776f955006d082b7e21e4e17264736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106102465760003560e01c806359dca7c911610139578063aa98e0c6116100b6578063cabadaa01161007a578063cabadaa014610829578063cf9f23b514610854578063d63bdf671461087f578063e985e9c5146108aa578063f2fde38b146108e7578063f7ea7a3d1461091057610246565b8063aa98e0c614610744578063b88d4fde1461076f578063bcd25ee514610798578063bd32fb66146107c3578063c87b56dd146107ec57610246565b806372e171ba116100fd57806372e171ba1461067e578063872ea6e0146106a95780638da5cb5b146106c557806395d89b41146106f0578063a22cb4651461071b57610246565b806359dca7c9146105975780636352211e146105c257806364c4d4f6146105ff57806370a082311461062a578063715018a61461066757610246565b80632f745c59116101c757806342966c681161018b57806342966c68146104b657806347d8ffd3146104df578063484b973c146105085780634f6ccce71461053157806355f804b31461056e57610246565b80632f745c59146103e557806330a1aa23146104225780633169accd1461045f57806335ac3bcc1461047657806342842e0e1461048d57610246565b806318160ddd1161020e57806318160ddd14610330578063218022d41461035b57806322f74bcb1461038457806323b872dd146103a05780632db11544146103c957610246565b806301ffc9a71461024b578063056f8a3d1461028857806306fdde031461029f578063081812fc146102ca578063095ea7b314610307575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d919061358c565b610939565b60405161027f91906135d4565b60405180910390f35b34801561029457600080fd5b5061029d61094b565b005b3480156102ab57600080fd5b506102b461097f565b6040516102c19190613688565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906136e0565b610a11565b6040516102fe919061374e565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190613795565b610a57565b005b34801561033c57600080fd5b50610345610b6e565b60405161035291906137e4565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d9190613835565b610b7b565b005b61039e600480360381019061039991906138c7565b610b8d565b005b3480156103ac57600080fd5b506103c760048036038101906103c29190613927565b610ede565b005b6103e360048036038101906103de91906136e0565b610f3e565b005b3480156103f157600080fd5b5061040c60048036038101906104079190613795565b611201565b60405161041991906137e4565b60405180910390f35b34801561042e57600080fd5b506104496004803603810190610444919061397a565b6112a6565b60405161045691906135d4565b60405180910390f35b34801561046b57600080fd5b5061047461136a565b005b34801561048257600080fd5b5061048b61139e565b005b34801561049957600080fd5b506104b460048036038101906104af9190613927565b6113d2565b005b3480156104c257600080fd5b506104dd60048036038101906104d891906136e0565b6113f2565b005b3480156104eb57600080fd5b50610506600480360381019061050191906136e0565b61144e565b005b34801561051457600080fd5b5061052f600480360381019061052a9190613795565b6114aa565b005b34801561053d57600080fd5b50610558600480360381019061055391906136e0565b611686565b60405161056591906137e4565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613a1d565b6116f7565b005b3480156105a357600080fd5b506105ac611715565b6040516105b991906137e4565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e491906136e0565b61171b565b6040516105f6919061374e565b60405180910390f35b34801561060b57600080fd5b506106146117cc565b60405161062191906135d4565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190613a6a565b6117df565b60405161065e91906137e4565b60405180910390f35b34801561067357600080fd5b5061067c611896565b005b34801561068a57600080fd5b506106936118aa565b6040516106a09190613aa6565b60405180910390f35b6106c360048036038101906106be9190613b17565b6118b0565b005b3480156106d157600080fd5b506106da611ab8565b6040516106e7919061374e565b60405180910390f35b3480156106fc57600080fd5b50610705611ae2565b6040516107129190613688565b60405180910390f35b34801561072757600080fd5b50610742600480360381019061073d9190613bc4565b611b74565b005b34801561075057600080fd5b50610759611b8a565b6040516107669190613aa6565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190613d34565b611b90565b005b3480156107a457600080fd5b506107ad611bf2565b6040516107ba91906135d4565b60405180910390f35b3480156107cf57600080fd5b506107ea60048036038101906107e59190613835565b611c05565b005b3480156107f857600080fd5b50610813600480360381019061080e91906136e0565b611c17565b6040516108209190613688565b60405180910390f35b34801561083557600080fd5b5061083e611cc1565b60405161084b91906137e4565b60405180910390f35b34801561086057600080fd5b50610869611cc7565b6040516108769190613688565b60405180910390f35b34801561088b57600080fd5b50610894611d55565b6040516108a191906135d4565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc9190613db7565b611d68565b6040516108de91906135d4565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613a6a565b611dfc565b005b34801561091c57600080fd5b50610937600480360381019061093291906136e0565b611e7f565b005b600061094482611e91565b9050919050565b610953611f0b565b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b60606000805461098e90613e26565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba90613e26565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b5050505050905090565b6000610a1c82611f89565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a628261171b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990613ec9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af1611fd4565b73ffffffffffffffffffffffffffffffffffffffff161480610b205750610b1f81610b1a611fd4565b611d68565b5b610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5690613f5b565b60405180910390fd5b610b698383611fdc565b505050565b6000600880549050905090565b610b83611f0b565b8060128190555050565b6002600b5403610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613fc7565b60405180910390fd5b6002600b8190555060011515601360019054906101000a900460ff16151514610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790614033565b60405180910390fd5b60008111610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a9061409f565b60405180910390fd5b600c54811115610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caf90614131565b60405180910390fd5b600e5481610cc4610b6e565b610cce9190614180565b1115610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614222565b60405180910390fd5b610d1983836112a6565b610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f9061428e565b60405180910390fd5b60008167ffffffffffffffff811115610d7457610d73613c09565b5b604051908082528060200260200182016040528015610da25781602001602082028036833780820191505090505b5090506000610db16014612095565b905060005b83811015610e27575b600e54821015610e1457610dd2826120a3565b610e055781838281518110610dea57610de96142ae565b5b602002602001018181525050610e00601461210f565b610e14565b610e0f601461210f565b610dbf565b8080610e1f906142dd565b915050610db6565b5060005b8251811015610ece57610e57838281518110610e4a57610e496142ae565b5b60200260200101516120a3565b15610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90614371565b60405180910390fd5b610ebb33848381518110610eae57610ead6142ae565b5b6020026020010151612125565b8080610ec6906142dd565b915050610e2b565b5050506001600b81905550505050565b610eef610ee9611fd4565b82612143565b610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590614403565b60405180910390fd5b610f398383836121d8565b505050565b6002600b5403610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90613fc7565b60405180910390fd5b6002600b8190555060011515601360009054906101000a900460ff16151514610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd89061446f565b60405180910390fd5b600d54811115611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90614131565b60405180910390fd5b600e5481611032610b6e565b61103c9190614180565b111561107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490614222565b60405180910390fd5b60008167ffffffffffffffff81111561109957611098613c09565b5b6040519080825280602002602001820160405280156110c75781602001602082028036833780820191505090505b50905060006110d66014612095565b905060005b8381101561114c575b600e54821015611139576110f7826120a3565b61112a578183828151811061110f5761110e6142ae565b5b602002602001018181525050611125601461210f565b611139565b611134601461210f565b6110e4565b8080611144906142dd565b9150506110db565b5060005b82518110156111f35761117c83828151811061116f5761116e6142ae565b5b60200260200101516120a3565b156111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614371565b60405180910390fd5b6111e0338483815181106111d3576111d26142ae565b5b6020026020010151612125565b80806111eb906142dd565b915050611150565b5050506001600b8190555050565b600061120c836117df565b821061124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124490614501565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080336040516020016112ba9190614569565b604051602081830303815290604052805190602001209050611320848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506011548361243e565b61135f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611356906145d0565b60405180910390fd5b600191505092915050565b611372611f0b565b601360029054906101000a900460ff1615601360026101000a81548160ff021916908315150217905550565b6113a6611f0b565b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b6113ed83838360405180602001604052806000815250611b90565b505050565b6114036113fd611fd4565b82612143565b611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614403565b60405180910390fd5b61144b81612455565b50565b611456611f0b565b61145f816120a3565b61149e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114959061463c565b60405180910390fd5b6114a781612455565b50565b6114b2611f0b565b600e54816114be610b6e565b6114c89190614180565b1115611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614131565b60405180910390fd5b60008167ffffffffffffffff81111561152557611524613c09565b5b6040519080825280602002602001820160405280156115535781602001602082028036833780820191505090505b50905060006115626014612095565b905060005b838110156115d8575b600e548210156115c557611583826120a3565b6115b6578183828151811061159b5761159a6142ae565b5b6020026020010181815250506115b1601461210f565b6115c5565b6115c0601461210f565b611570565b80806115d0906142dd565b915050611567565b5060005b825181101561167f576116088382815181106115fb576115fa6142ae565b5b60200260200101516120a3565b15611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90614371565b60405180910390fd5b61166c8584838151811061165f5761165e6142ae565b5b6020026020010151612125565b8080611677906142dd565b9150506115dc565b5050505050565b6000611690610b6e565b82106116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c8906146ce565b60405180910390fd5b600882815481106116e5576116e46142ae565b5b90600052602060002001549050919050565b6116ff611f0b565b8181600f919061171092919061347d565b505050565b600c5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba9061473a565b60405180910390fd5b80915050919050565b601360029054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611846906147cc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61189e611f0b565b6118a86000612572565b565b60125481565b6002600b54036118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90613fc7565b60405180910390fd5b6002600b8190555060011515601360029054906101000a900460ff16151514611953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194a90614838565b60405180910390fd5b606061195f8383612638565b9050600e54815161196e610b6e565b6119789190614180565b11156119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090614222565b60405180910390fd5b6119c385856112a6565b611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f99061428e565b60405180910390fd5b60005b8151811015611aa857611a31828281518110611a2457611a236142ae565b5b60200260200101516120a3565b15611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614371565b60405180910390fd5b611a9533838381518110611a8857611a876142ae565b5b6020026020010151612125565b8080611aa0906142dd565b915050611a05565b50506001600b8190555050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611af190613e26565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1d90613e26565b8015611b6a5780601f10611b3f57610100808354040283529160200191611b6a565b820191906000526020600020905b815481529060010190602001808311611b4d57829003601f168201915b5050505050905090565b611b86611b7f611fd4565b83836126cf565b5050565b60115481565b611ba1611b9b611fd4565b83612143565b611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd790614403565b60405180910390fd5b611bec8484848461283b565b50505050565b601360019054906101000a900460ff1681565b611c0d611f0b565b8060118190555050565b6060611c22826120a3565b611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c58906148ca565b60405180910390fd5b6000611c6b612897565b90506000815111611c8b5760405180602001604052806000815250611cb9565b80611c9584612929565b6010604051602001611ca9939291906149ba565b6040516020818303038152906040525b915050919050565b600d5481565b60108054611cd490613e26565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0090613e26565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e04611f0b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90614a5d565b60405180910390fd5b611e7c81612572565b50565b611e87611f0b565b80600e8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f045750611f0382612a89565b5b9050919050565b611f13611fd4565b73ffffffffffffffffffffffffffffffffffffffff16611f31611ab8565b73ffffffffffffffffffffffffffffffffffffffff1614611f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7e90614ac9565b60405180910390fd5b565b611f92816120a3565b611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc89061473a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661204f8361171b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001816000016000828254019250508190555050565b61213f828260405180602001604052806000815250612b6b565b5050565b60008061214f8361171b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061219157506121908185611d68565b5b806121cf57508373ffffffffffffffffffffffffffffffffffffffff166121b784610a11565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121f88261171b565b73ffffffffffffffffffffffffffffffffffffffff161461224e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224590614b5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490614bed565b60405180910390fd5b6122c8838383612bc6565b6122d3600082611fdc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123239190614c0d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461237a9190614180565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612439838383612bd6565b505050565b60008261244b8584612bdb565b1490509392505050565b60006124608261171b565b905061246e81600084612bc6565b612479600083611fdc565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c99190614c0d565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461256e81600084612bd6565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000806060858581019061264e9190614d04565b8092508193505050816040516020016126679190614d81565b60405160208183030381529060405280519060200120925060125483146126c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ba90614de8565b60405180910390fd5b80935050505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361273d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273490614e54565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282e91906135d4565b60405180910390a3505050565b6128468484846121d8565b61285284848484612c31565b612891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288890614ee6565b60405180910390fd5b50505050565b6060600f80546128a690613e26565b80601f01602080910402602001604051908101604052809291908181526020018280546128d290613e26565b801561291f5780601f106128f45761010080835404028352916020019161291f565b820191906000526020600020905b81548152906001019060200180831161290257829003601f168201915b5050505050905090565b606060008203612970576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a84565b600082905060005b600082146129a257808061298b906142dd565b915050600a8261299b9190614f35565b9150612978565b60008167ffffffffffffffff8111156129be576129bd613c09565b5b6040519080825280601f01601f1916602001820160405280156129f05781602001600182028036833780820191505090505b5090505b60008514612a7d57600182612a099190614c0d565b9150600a85612a189190614f66565b6030612a249190614180565b60f81b818381518110612a3a57612a396142ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a769190614f35565b94506129f4565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b5457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b645750612b6382612db8565b5b9050919050565b612b758383612e22565b612b826000848484612c31565b612bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb890614ee6565b60405180910390fd5b505050565b612bd1838383612ffb565b505050565b505050565b60008082905060005b8451811015612c2657612c1182868381518110612c0457612c036142ae565b5b602002602001015161310d565b91508080612c1e906142dd565b915050612be4565b508091505092915050565b6000612c528473ffffffffffffffffffffffffffffffffffffffff16613138565b15612dab578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c7b611fd4565b8786866040518563ffffffff1660e01b8152600401612c9d9493929190614fec565b6020604051808303816000875af1925050508015612cd957506040513d601f19601f82011682018060405250810190612cd6919061504d565b60015b612d5b573d8060008114612d09576040519150601f19603f3d011682016040523d82523d6000602084013e612d0e565b606091505b506000815103612d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4a90614ee6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612db0565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e88906150c6565b60405180910390fd5b612e9a816120a3565b15612eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed190615132565b60405180910390fd5b612ee660008383612bc6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f369190614180565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ff760008383612bd6565b5050565b61300683838361315b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036130485761304381613160565b613087565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130865761308583826131a9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130c9576130c481613316565b613108565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131075761310682826133e7565b5b5b505050565b6000818310613125576131208284613466565b613130565b61312f8383613466565b5b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131b6846117df565b6131c09190614c0d565b90506000600760008481526020019081526020016000205490508181146132a5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061332a9190614c0d565b905060006009600084815260200190815260200160002054905060006008838154811061335a576133596142ae565b5b90600052602060002001549050806008838154811061337c5761337b6142ae565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133cb576133ca615152565b5b6001900381819060005260206000200160009055905550505050565b60006133f2836117df565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b82805461348990613e26565b90600052602060002090601f0160209004810192826134ab57600085556134f2565b82601f106134c457803560ff19168380011785556134f2565b828001600101855582156134f2579182015b828111156134f15782358255916020019190600101906134d6565b5b5090506134ff9190613503565b5090565b5b8082111561351c576000816000905550600101613504565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61356981613534565b811461357457600080fd5b50565b60008135905061358681613560565b92915050565b6000602082840312156135a2576135a161352a565b5b60006135b084828501613577565b91505092915050565b60008115159050919050565b6135ce816135b9565b82525050565b60006020820190506135e960008301846135c5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561362957808201518184015260208101905061360e565b83811115613638576000848401525b50505050565b6000601f19601f8301169050919050565b600061365a826135ef565b61366481856135fa565b935061367481856020860161360b565b61367d8161363e565b840191505092915050565b600060208201905081810360008301526136a2818461364f565b905092915050565b6000819050919050565b6136bd816136aa565b81146136c857600080fd5b50565b6000813590506136da816136b4565b92915050565b6000602082840312156136f6576136f561352a565b5b6000613704848285016136cb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137388261370d565b9050919050565b6137488161372d565b82525050565b6000602082019050613763600083018461373f565b92915050565b6137728161372d565b811461377d57600080fd5b50565b60008135905061378f81613769565b92915050565b600080604083850312156137ac576137ab61352a565b5b60006137ba85828601613780565b92505060206137cb858286016136cb565b9150509250929050565b6137de816136aa565b82525050565b60006020820190506137f960008301846137d5565b92915050565b6000819050919050565b613812816137ff565b811461381d57600080fd5b50565b60008135905061382f81613809565b92915050565b60006020828403121561384b5761384a61352a565b5b600061385984828501613820565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261388757613886613862565b5b8235905067ffffffffffffffff8111156138a4576138a3613867565b5b6020830191508360208202830111156138c0576138bf61386c565b5b9250929050565b6000806000604084860312156138e0576138df61352a565b5b600084013567ffffffffffffffff8111156138fe576138fd61352f565b5b61390a86828701613871565b9350935050602061391d868287016136cb565b9150509250925092565b6000806000606084860312156139405761393f61352a565b5b600061394e86828701613780565b935050602061395f86828701613780565b9250506040613970868287016136cb565b9150509250925092565b600080602083850312156139915761399061352a565b5b600083013567ffffffffffffffff8111156139af576139ae61352f565b5b6139bb85828601613871565b92509250509250929050565b60008083601f8401126139dd576139dc613862565b5b8235905067ffffffffffffffff8111156139fa576139f9613867565b5b602083019150836001820283011115613a1657613a1561386c565b5b9250929050565b60008060208385031215613a3457613a3361352a565b5b600083013567ffffffffffffffff811115613a5257613a5161352f565b5b613a5e858286016139c7565b92509250509250929050565b600060208284031215613a8057613a7f61352a565b5b6000613a8e84828501613780565b91505092915050565b613aa0816137ff565b82525050565b6000602082019050613abb6000830184613a97565b92915050565b60008083601f840112613ad757613ad6613862565b5b8235905067ffffffffffffffff811115613af457613af3613867565b5b602083019150836001820283011115613b1057613b0f61386c565b5b9250929050565b60008060008060408587031215613b3157613b3061352a565b5b600085013567ffffffffffffffff811115613b4f57613b4e61352f565b5b613b5b87828801613871565b9450945050602085013567ffffffffffffffff811115613b7e57613b7d61352f565b5b613b8a87828801613ac1565b925092505092959194509250565b613ba1816135b9565b8114613bac57600080fd5b50565b600081359050613bbe81613b98565b92915050565b60008060408385031215613bdb57613bda61352a565b5b6000613be985828601613780565b9250506020613bfa85828601613baf565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c418261363e565b810181811067ffffffffffffffff82111715613c6057613c5f613c09565b5b80604052505050565b6000613c73613520565b9050613c7f8282613c38565b919050565b600067ffffffffffffffff821115613c9f57613c9e613c09565b5b613ca88261363e565b9050602081019050919050565b82818337600083830152505050565b6000613cd7613cd284613c84565b613c69565b905082815260208101848484011115613cf357613cf2613c04565b5b613cfe848285613cb5565b509392505050565b600082601f830112613d1b57613d1a613862565b5b8135613d2b848260208601613cc4565b91505092915050565b60008060008060808587031215613d4e57613d4d61352a565b5b6000613d5c87828801613780565b9450506020613d6d87828801613780565b9350506040613d7e878288016136cb565b925050606085013567ffffffffffffffff811115613d9f57613d9e61352f565b5b613dab87828801613d06565b91505092959194509250565b60008060408385031215613dce57613dcd61352a565b5b6000613ddc85828601613780565b9250506020613ded85828601613780565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e3e57607f821691505b602082108103613e5157613e50613df7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb36021836135fa565b9150613ebe82613e57565b604082019050919050565b60006020820190508181036000830152613ee281613ea6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613f45603e836135fa565b9150613f5082613ee9565b604082019050919050565b60006020820190508181036000830152613f7481613f38565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fb1601f836135fa565b9150613fbc82613f7b565b602082019050919050565b60006020820190508181036000830152613fe081613fa4565b9050919050565b7f574c206d696e7420697320706175736564000000000000000000000000000000600082015250565b600061401d6011836135fa565b915061402882613fe7565b602082019050919050565b6000602082019050818103600083015261404c81614010565b9050919050565b7f4d696e74207174792073686f756c64206265206f766572203000000000000000600082015250565b60006140896019836135fa565b915061409482614053565b602082019050919050565b600060208201905081810360008301526140b88161407c565b9050919050565b7f4d6178206d696e7420706572207472616e73616374696f6e206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061411b6021836135fa565b9150614126826140bf565b604082019050919050565b6000602082019050818103600083015261414a8161410e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061418b826136aa565b9150614196836136aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141cb576141ca614151565b5b828201905092915050565b7f4d6178204b756d61206578636565646564000000000000000000000000000000600082015250565b600061420c6011836135fa565b9150614217826141d6565b602082019050919050565b6000602082019050818103600083015261423b816141ff565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614278600d836135fa565b915061428382614242565b602082019050919050565b600060208201905081810360008301526142a78161426b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006142e8826136aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361431a57614319614151565b5b600182019050919050565b7f4b756d6120686164204177616b656e6564000000000000000000000000000000600082015250565b600061435b6011836135fa565b915061436682614325565b602082019050919050565b6000602082019050818103600083015261438a8161434e565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006143ed602e836135fa565b91506143f882614391565b604082019050919050565b6000602082019050818103600083015261441c816143e0565b9050919050565b7f5075626c6963206d696e74206973207061757365640000000000000000000000600082015250565b60006144596015836135fa565b915061446482614423565b602082019050919050565b600060208201905081810360008301526144888161444c565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006144eb602b836135fa565b91506144f68261448f565b604082019050919050565b6000602082019050818103600083015261451a816144de565b9050919050565b60008160601b9050919050565b600061453982614521565b9050919050565b600061454b8261452e565b9050919050565b61456361455e8261372d565b614540565b82525050565b60006145758284614552565b60148201915081905092915050565b7f496e636f72726563742070726f6f660000000000000000000000000000000000600082015250565b60006145ba600f836135fa565b91506145c582614584565b602082019050919050565b600060208201905081810360008301526145e9816145ad565b9050919050565b7f4b756d6120646f65736e27742065786973740000000000000000000000000000600082015250565b60006146266012836135fa565b9150614631826145f0565b602082019050919050565b6000602082019050818103600083015261465581614619565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006146b8602c836135fa565b91506146c38261465c565b604082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006147246018836135fa565b915061472f826146ee565b602082019050919050565b6000602082019050818103600083015261475381614717565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006147b66029836135fa565b91506147c18261475a565b604082019050919050565b600060208201905081810360008301526147e5816147a9565b9050919050565b7f486f6c646572206d696e74206973207061757365640000000000000000000000600082015250565b60006148226015836135fa565b915061482d826147ec565b602082019050919050565b6000602082019050818103600083015261485181614815565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148b4602f836135fa565b91506148bf82614858565b604082019050919050565b600060208201905081810360008301526148e3816148a7565b9050919050565b600081905092915050565b6000614900826135ef565b61490a81856148ea565b935061491a81856020860161360b565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461494881613e26565b61495281866148ea565b9450600182166000811461496d576001811461497e576149b1565b60ff198316865281860193506149b1565b61498785614926565b60005b838110156149a95781548189015260018201915060208101905061498a565b838801955050505b50505092915050565b60006149c682866148f5565b91506149d282856148f5565b91506149de828461493b565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a476026836135fa565b9150614a52826149eb565b604082019050919050565b60006020820190508181036000830152614a7681614a3a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ab36020836135fa565b9150614abe82614a7d565b602082019050919050565b60006020820190508181036000830152614ae281614aa6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b456025836135fa565b9150614b5082614ae9565b604082019050919050565b60006020820190508181036000830152614b7481614b38565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614bd76024836135fa565b9150614be282614b7b565b604082019050919050565b60006020820190508181036000830152614c0681614bca565b9050919050565b6000614c18826136aa565b9150614c23836136aa565b925082821015614c3657614c35614151565b5b828203905092915050565b600067ffffffffffffffff821115614c5c57614c5b613c09565b5b602082029050602081019050919050565b6000614c80614c7b84614c41565b613c69565b90508083825260208201905060208402830185811115614ca357614ca261386c565b5b835b81811015614ccc5780614cb888826136cb565b845260208401935050602081019050614ca5565b5050509392505050565b600082601f830112614ceb57614cea613862565b5b8135614cfb848260208601614c6d565b91505092915050565b60008060408385031215614d1b57614d1a61352a565b5b6000614d29858286016136cb565b925050602083013567ffffffffffffffff811115614d4a57614d4961352f565b5b614d5685828601614cd6565b9150509250929050565b6000819050919050565b614d7b614d76826136aa565b614d60565b82525050565b6000614d8d8284614d6a565b60208201915081905092915050565b7f546865204861736820697320696e636f72726563740000000000000000000000600082015250565b6000614dd26015836135fa565b9150614ddd82614d9c565b602082019050919050565b60006020820190508181036000830152614e0181614dc5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e3e6019836135fa565b9150614e4982614e08565b602082019050919050565b60006020820190508181036000830152614e6d81614e31565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614ed06032836135fa565b9150614edb82614e74565b604082019050919050565b60006020820190508181036000830152614eff81614ec3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f40826136aa565b9150614f4b836136aa565b925082614f5b57614f5a614f06565b5b828204905092915050565b6000614f71826136aa565b9150614f7c836136aa565b925082614f8c57614f8b614f06565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614fbe82614f97565b614fc88185614fa2565b9350614fd881856020860161360b565b614fe18161363e565b840191505092915050565b6000608082019050615001600083018761373f565b61500e602083018661373f565b61501b60408301856137d5565b818103606083015261502d8184614fb3565b905095945050505050565b60008151905061504781613560565b92915050565b6000602082840312156150635761506261352a565b5b600061507184828501615038565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006150b06020836135fa565b91506150bb8261507a565b602082019050919050565b600060208201905081810360008301526150df816150a3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061511c601c836135fa565b9150615127826150e6565b602082019050919050565b6000602082019050818103600083015261514b8161510f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212201ca0e615e8bf3819002d9e844bf5e7c9c048846776f955006d082b7e21e4e17264736f6c634300080e0033

Deployed Bytecode Sourcemap

59981:6763:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66529:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64288:92;;;;;;;;;;;;;:::i;:::-;;39693:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41206:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40723:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54387:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64185:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61291:1060;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41906:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62359:906;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54055:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65106:280;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64497:92;;;;;;;;;;;;;:::i;:::-;;64388:101;;;;;;;;;;;;;:::i;:::-;;42313:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52486:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65394:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63273:770;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54577:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65668:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60080:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39404:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60526:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39135:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18222:103;;;;;;;;;;;;;:::i;:::-;;60346:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60673:610;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17574:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39862:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41449:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60305:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42569:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60484:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64956:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65865:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60116:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60271:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60445:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41675:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18480:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64055:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66529:212;66668:4;66697:36;66721:11;66697:23;:36::i;:::-;66690:43;;66529:212;;;:::o;64288:92::-;17460:13;:11;:13::i;:::-;64359:12:::1;;;;;;;;;;;64358:13;64343:12;;:28;;;;;;;;;;;;;;;;;;64288:92::o:0;39693:100::-;39747:13;39780:5;39773:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39693:100;:::o;41206:171::-;41282:7;41302:23;41317:7;41302:14;:23::i;:::-;41345:15;:24;41361:7;41345:24;;;;;;;;;;;;;;;;;;;;;41338:31;;41206:171;;;:::o;40723:417::-;40804:13;40820:23;40835:7;40820:14;:23::i;:::-;40804:39;;40868:5;40862:11;;:2;:11;;;40854:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40962:5;40946:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40971:37;40988:5;40995:12;:10;:12::i;:::-;40971:16;:37::i;:::-;40946:62;40924:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;41111:21;41120:2;41124:7;41111:8;:21::i;:::-;40793:347;40723:417;;:::o;54387:113::-;54448:7;54475:10;:17;;;;54468:24;;54387:113;:::o;64185:95::-;17460:13;:11;:13::i;:::-;64263:9:::1;64252:8;:20;;;;64185:95:::0;:::o;61291:1060::-;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;61426:4:::1;61407:23;;:15;;;;;;;;;;;:23;;;61399:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;61482:1;61470:9;:13;61462:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;61545:9;;61532;:22;;61524:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61640:14;;61627:9;61611:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:43;;61603:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;61694:31;61712:12;;61694:17;:31::i;:::-;61686:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61754:23;61794:9;61780:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61754:50;;61815:15;61833:25;:15;:23;:25::i;:::-;61815:43;;61873:6;61869:305;61884:9;61881:1;:12;61869:305;;;61912:251;61928:14;;61918:7;:24;61912:251;;;61963:16;61971:7;61963;:16::i;:::-;61959:146;;62011:7;61999:6;62006:1;61999:9;;;;;;;;:::i;:::-;;;;;;;:19;;;::::0;::::1;62037:27;:15;:25;:27::i;:::-;62083:5;;61959:146;62120:27;:15;:25;:27::i;:::-;61912:251;;;61895:3;;;;;:::i;:::-;;;;61869:305;;;;62188:6;62184:158;62200:6;:13;62196:1;:17;62184:158;;;62244:18;62252:6;62259:1;62252:9;;;;;;;;:::i;:::-;;;;;;;;62244:7;:18::i;:::-;62243:19;62235:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;62298:32;62308:10;62320:6;62327:1;62320:9;;;;;;;;:::i;:::-;;;;;;;;62298;:32::i;:::-;62215:3;;;;;:::i;:::-;;;;62184:158;;;;61388:963;;1768:1:::0;2722:7;:22;;;;61291:1060;;;:::o;41906:336::-;42101:41;42120:12;:10;:12::i;:::-;42134:7;42101:18;:41::i;:::-;42093:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;42206:28;42216:4;42222:2;42226:7;42206:9;:28::i;:::-;41906:336;;;:::o;62359:906::-;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;62462:4:::1;62446:20;;:12;;;;;;;;;;;:20;;;62438:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;62523:13;;62510:9;:26;;62502:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;62622:14;;62609:9;62593:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:43;;62585:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;62668:23;62708:9;62694:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62668:50;;62729:15;62747:25;:15;:23;:25::i;:::-;62729:43;;62787:6;62783:305;62798:9;62795:1;:12;62783:305;;;62826:251;62842:14;;62832:7;:24;62826:251;;;62877:16;62885:7;62877;:16::i;:::-;62873:146;;62925:7;62913:6;62920:1;62913:9;;;;;;;;:::i;:::-;;;;;;;:19;;;::::0;::::1;62951:27;:15;:25;:27::i;:::-;62997:5;;62873:146;63034:27;:15;:25;:27::i;:::-;62826:251;;;62809:3;;;;;:::i;:::-;;;;62783:305;;;;63102:6;63098:158;63114:6;:13;63110:1;:17;63098:158;;;63158:18;63166:6;63173:1;63166:9;;;;;;;;:::i;:::-;;;;;;;;63158:7;:18::i;:::-;63157:19;63149:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;63212:32;63222:10;63234:6;63241:1;63234:9;;;;;;;;:::i;:::-;;;;;;;;63212;:32::i;:::-;63129:3;;;;;:::i;:::-;;;;63098:158;;;;62427:838;;1768:1:::0;2722:7;:22;;;;62359:906;:::o;54055:256::-;54152:7;54188:23;54205:5;54188:16;:23::i;:::-;54180:5;:31;54172:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;54277:12;:19;54290:5;54277:19;;;;;;;;;;;;;;;:26;54297:5;54277:26;;;;;;;;;;;;54270:33;;54055:256;;;;:::o;65106:280::-;65187:4;65203:12;65245:10;65228:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;65218:39;;;;;;65203:54;;65276:59;65295:12;;65276:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65309:19;;65330:4;65276:18;:59::i;:::-;65268:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;65373:4;65366:11;;;65106:280;;;;:::o;64497:92::-;17460:13;:11;:13::i;:::-;64568:12:::1;;;;;;;;;;;64567:13;64552:12;;:28;;;;;;;;;;;;;;;;;;64497:92::o:0;64388:101::-;17460:13;:11;:13::i;:::-;64465:15:::1;;;;;;;;;;;64464:16;64446:15;;:34;;;;;;;;;;;;;;;;;;64388:101::o:0;42313:185::-;42451:39;42468:4;42474:2;42478:7;42451:39;;;;;;;;;;;;:16;:39::i;:::-;42313:185;;;:::o;52486:243::-;52604:41;52623:12;:10;:12::i;:::-;52637:7;52604:18;:41::i;:::-;52596:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;52707:14;52713:7;52707:5;:14::i;:::-;52486:243;:::o;65394:142::-;17460:13;:11;:13::i;:::-;65465:16:::1;65473:7;65465;:16::i;:::-;65457:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;65514:14;65520:7;65514:5;:14::i;:::-;65394:142:::0;:::o;63273:770::-;17460:13;:11;:13::i;:::-;63391:14:::1;;63377:10;63361:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:44;;63353:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;63454:23;63494:10;63480:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63454:51;;63516:15;63534:25;:15;:23;:25::i;:::-;63516:43;;63574:6;63570:306;63585:10;63582:1;:13;63570:306;;;63614:251;63630:14;;63620:7;:24;63614:251;;;63665:16;63673:7;63665;:16::i;:::-;63661:146;;63713:7;63701:6;63708:1;63701:9;;;;;;;;:::i;:::-;;;;;;;:19;;;::::0;::::1;63739:27;:15;:25;:27::i;:::-;63785:5;;63661:146;63822:27;:15;:25;:27::i;:::-;63614:251;;;63597:3;;;;;:::i;:::-;;;;63570:306;;;;63890:6;63886:150;63902:6;:13;63898:1;:17;63886:150;;;63946:18;63954:6;63961:1;63954:9;;;;;;;;:::i;:::-;;;;;;;;63946:7;:18::i;:::-;63945:19;63937:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;64000:24;64010:2;64014:6;64021:1;64014:9;;;;;;;;:::i;:::-;;;;;;;;64000;:24::i;:::-;63917:3;;;;;:::i;:::-;;;;63886:150;;;;63342:701;;63273:770:::0;;:::o;54577:233::-;54652:7;54688:30;:28;:30::i;:::-;54680:5;:38;54672:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54785:10;54796:5;54785:17;;;;;;;;:::i;:::-;;;;;;;;;;54778:24;;54577:233;;;:::o;65668:102::-;17460:13;:11;:13::i;:::-;65755:7:::1;;65739:13;:23;;;;;;;:::i;:::-;;65668:102:::0;;:::o;60080:29::-;;;;:::o;39404:222::-;39476:7;39496:13;39512:7;:16;39520:7;39512:16;;;;;;;;;;;;;;;;;;;;;39496:32;;39564:1;39547:19;;:5;:19;;;39539:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39613:5;39606:12;;;39404:222;;;:::o;60526:32::-;;;;;;;;;;;;;:::o;39135:207::-;39207:7;39252:1;39235:19;;:5;:19;;;39227:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39318:9;:16;39328:5;39318:16;;;;;;;;;;;;;;;;39311:23;;39135:207;;;:::o;18222:103::-;17460:13;:11;:13::i;:::-;18287:30:::1;18314:1;18287:18;:30::i;:::-;18222:103::o:0;60346:92::-;;;;:::o;60673:610::-;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;60855:4:::1;60839:20;;:12;;;;;;;;;;;:20;;;60831:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60895:20;60935:17;60944:7;;60935:8;:17::i;:::-;60926:26;;61004:14;;60987:6;:13;60971;:11;:13::i;:::-;:29;;;;:::i;:::-;:47;;60963:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61058:31;61076:12;;61058:17;:31::i;:::-;61050:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61122:6;61118:158;61134:6;:13;61130:1;:17;61118:158;;;61178:18;61186:6;61193:1;61186:9;;;;;;;;:::i;:::-;;;;;;;;61178:7;:18::i;:::-;61177:19;61169:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;61232:32;61242:10;61254:6;61261:1;61254:9;;;;;;;;:::i;:::-;;;;;;;;61232;:32::i;:::-;61149:3;;;;;:::i;:::-;;;;61118:158;;;;60779:504;1768:1:::0;2722:7;:22;;;;60673:610;;;;:::o;17574:87::-;17620:7;17647:6;;;;;;;;;;;17640:13;;17574:87;:::o;39862:104::-;39918:13;39951:7;39944:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39862:104;:::o;41449:155::-;41544:52;41563:12;:10;:12::i;:::-;41577:8;41587;41544:18;:52::i;:::-;41449:155;;:::o;60305:34::-;;;;:::o;42569:323::-;42743:41;42762:12;:10;:12::i;:::-;42776:7;42743:18;:41::i;:::-;42735:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;42846:38;42860:4;42866:2;42870:7;42879:4;42846:13;:38::i;:::-;42569:323;;;;:::o;60484:35::-;;;;;;;;;;;;;:::o;64956:142::-;17460:13;:11;:13::i;:::-;65070:20:::1;65048:19;:42;;;;64956:142:::0;:::o;65865:374::-;65935:13;65966:16;65974:7;65966;:16::i;:::-;65958:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;66042:28;66073:10;:8;:10::i;:::-;66042:41;;66130:1;66105:14;66099:28;:32;:134;;;;;;;;;;;;;;;;;66169:14;66185:25;66202:7;66185:16;:25::i;:::-;66212:3;66152:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66099:134;66092:141;;;65865:374;;;:::o;60116:33::-;;;;:::o;60271:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60445:32::-;;;;;;;;;;;;;:::o;41675:164::-;41772:4;41796:18;:25;41815:5;41796:25;;;;;;;;;;;;;;;:35;41822:8;41796:35;;;;;;;;;;;;;;;;;;;;;;;;;41789:42;;41675:164;;;;:::o;18480:201::-;17460:13;:11;:13::i;:::-;18589:1:::1;18569:22;;:8;:22;;::::0;18561:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18645:28;18664:8;18645:18;:28::i;:::-;18480:201:::0;:::o;64055:118::-;17460:13;:11;:13::i;:::-;64149:15:::1;64132:14;:32;;;;64055:118:::0;:::o;53747:224::-;53849:4;53888:35;53873:50;;;:11;:50;;;;:90;;;;53927:36;53951:11;53927:23;:36::i;:::-;53873:90;53866:97;;53747:224;;;:::o;17739:132::-;17814:12;:10;:12::i;:::-;17803:23;;:7;:5;:7::i;:::-;:23;;;17795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17739:132::o;49181:135::-;49263:16;49271:7;49263;:16::i;:::-;49255:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49181:135;:::o;16125:98::-;16178:7;16205:10;16198:17;;16125:98;:::o;48460:174::-;48562:2;48535:15;:24;48551:7;48535:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;48618:7;48614:2;48580:46;;48589:23;48604:7;48589:14;:23::i;:::-;48580:46;;;;;;;;;;;;48460:174;;:::o;12356:114::-;12421:7;12448;:14;;;12441:21;;12356:114;;;:::o;44399:127::-;44464:4;44516:1;44488:30;;:7;:16;44496:7;44488:16;;;;;;;;;;;;;;;;;;;;;:30;;;;44481:37;;44399:127;;;:::o;12478:::-;12585:1;12567:7;:14;;;:19;;;;;;;;;;;12478:127;:::o;45299:110::-;45375:26;45385:2;45389:7;45375:26;;;;;;;;;;;;:9;:26::i;:::-;45299:110;;:::o;44693:264::-;44786:4;44803:13;44819:23;44834:7;44819:14;:23::i;:::-;44803:39;;44872:5;44861:16;;:7;:16;;;:52;;;;44881:32;44898:5;44905:7;44881:16;:32::i;:::-;44861:52;:87;;;;44941:7;44917:31;;:20;44929:7;44917:11;:20::i;:::-;:31;;;44861:87;44853:96;;;44693:264;;;;:::o;47716:625::-;47875:4;47848:31;;:23;47863:7;47848:14;:23::i;:::-;:31;;;47840:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47954:1;47940:16;;:2;:16;;;47932:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48010:39;48031:4;48037:2;48041:7;48010:20;:39::i;:::-;48114:29;48131:1;48135:7;48114:8;:29::i;:::-;48175:1;48156:9;:15;48166:4;48156:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;48204:1;48187:9;:13;48197:2;48187:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48235:2;48216:7;:16;48224:7;48216:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48274:7;48270:2;48255:27;;48264:4;48255:27;;;;;;;;;;;;48295:38;48315:4;48321:2;48325:7;48295:19;:38::i;:::-;47716:625;;;:::o;3978:190::-;4103:4;4156;4127:25;4140:5;4147:4;4127:12;:25::i;:::-;:33;4120:40;;3978:190;;;;;:::o;46959:420::-;47019:13;47035:23;47050:7;47035:14;:23::i;:::-;47019:39;;47071:48;47092:5;47107:1;47111:7;47071:20;:48::i;:::-;47160:29;47177:1;47181:7;47160:8;:29::i;:::-;47222:1;47202:9;:16;47212:5;47202:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;47241:7;:16;47249:7;47241:16;;;;;;;;;;;;47234:23;;;;;;;;;;;47303:7;47299:1;47275:36;;47284:5;47275:36;;;;;;;;;;;;47324:47;47344:5;47359:1;47363:7;47324:19;:47::i;:::-;47008:371;46959:420;:::o;18841:191::-;18915:16;18934:6;;;;;;;;;;;18915:25;;18960:8;18951:6;;:17;;;;;;;;;;;;;;;;;;19015:8;18984:40;;19005:8;18984:40;;;;;;;;;;;;18904:128;18841:191;:::o;64597:350::-;64658:17;64687:12;64710:8;64729:19;64785:4;;64774:32;;;;;;;:::i;:::-;64759:47;;;;;;;;64851:3;64834:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;64824:32;;;;;;64817:39;;64883:8;;64875:4;:16;64867:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;64934:5;64928:11;;64676:271;;;64597:350;;;;:::o;48777:315::-;48932:8;48923:17;;:5;:17;;;48915:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49019:8;48981:18;:25;49000:5;48981:25;;;;;;;;;;;;;;;:35;49007:8;48981:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49065:8;49043:41;;49058:5;49043:41;;;49075:8;49043:41;;;;;;:::i;:::-;;;;;;;;48777:315;;;:::o;43773:313::-;43929:28;43939:4;43945:2;43949:7;43929:9;:28::i;:::-;43976:47;43999:4;44005:2;44009:7;44018:4;43976:22;:47::i;:::-;43968:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43773:313;;;;:::o;65544:112::-;65604:13;65635;65628:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65544:112;:::o;13379:723::-;13435:13;13665:1;13656:5;:10;13652:53;;13683:10;;;;;;;;;;;;;;;;;;;;;13652:53;13715:12;13730:5;13715:20;;13746:14;13771:78;13786:1;13778:4;:9;13771:78;;13804:8;;;;;:::i;:::-;;;;13835:2;13827:10;;;;;:::i;:::-;;;13771:78;;;13859:19;13891:6;13881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13859:39;;13909:154;13925:1;13916:5;:10;13909:154;;13953:1;13943:11;;;;;:::i;:::-;;;14020:2;14012:5;:10;;;;:::i;:::-;13999:2;:24;;;;:::i;:::-;13986:39;;13969:6;13976;13969:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14049:2;14040:11;;;;;:::i;:::-;;;13909:154;;;14087:6;14073:21;;;;;13379:723;;;;:::o;38766:305::-;38868:4;38920:25;38905:40;;;:11;:40;;;;:105;;;;38977:33;38962:48;;;:11;:48;;;;38905:105;:158;;;;39027:36;39051:11;39027:23;:36::i;:::-;38905:158;38885:178;;38766:305;;;:::o;45636:319::-;45765:18;45771:2;45775:7;45765:5;:18::i;:::-;45816:53;45847:1;45851:2;45855:7;45864:4;45816:22;:53::i;:::-;45794:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45636:319;;;:::o;66317:204::-;66468:45;66495:4;66501:2;66505:7;66468:26;:45::i;:::-;66317:204;;;:::o;51816:125::-;;;;:::o;4845:296::-;4928:7;4948:20;4971:4;4948:27;;4991:9;4986:118;5010:5;:12;5006:1;:16;4986:118;;;5059:33;5069:12;5083:5;5089:1;5083:8;;;;;;;;:::i;:::-;;;;;;;;5059:9;:33::i;:::-;5044:48;;5024:3;;;;;:::i;:::-;;;;4986:118;;;;5121:12;5114:19;;;4845:296;;;;:::o;49880:853::-;50034:4;50055:15;:2;:13;;;:15::i;:::-;50051:675;;;50107:2;50091:36;;;50128:12;:10;:12::i;:::-;50142:4;50148:7;50157:4;50091:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50087:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50349:1;50332:6;:13;:18;50328:328;;50375:60;;;;;;;;;;:::i;:::-;;;;;;;;50328:328;50606:6;50600:13;50591:6;50587:2;50583:15;50576:38;50087:584;50223:41;;;50213:51;;;:6;:51;;;;50206:58;;;;;50051:675;50710:4;50703:11;;49880:853;;;;;;;:::o;30428:157::-;30513:4;30552:25;30537:40;;;:11;:40;;;;30530:47;;30428:157;;;:::o;46291:439::-;46385:1;46371:16;;:2;:16;;;46363:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46444:16;46452:7;46444;:16::i;:::-;46443:17;46435:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46506:45;46535:1;46539:2;46543:7;46506:20;:45::i;:::-;46581:1;46564:9;:13;46574:2;46564:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;46612:2;46593:7;:16;46601:7;46593:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46657:7;46653:2;46632:33;;46649:1;46632:33;;;;;;;;;;;;46678:44;46706:1;46710:2;46714:7;46678:19;:44::i;:::-;46291:439;;:::o;55423:589::-;55567:45;55594:4;55600:2;55604:7;55567:26;:45::i;:::-;55645:1;55629:18;;:4;:18;;;55625:187;;55664:40;55696:7;55664:31;:40::i;:::-;55625:187;;;55734:2;55726:10;;:4;:10;;;55722:90;;55753:47;55786:4;55792:7;55753:32;:47::i;:::-;55722:90;55625:187;55840:1;55826:16;;:2;:16;;;55822:183;;55859:45;55896:7;55859:36;:45::i;:::-;55822:183;;;55932:4;55926:10;;:2;:10;;;55922:83;;55953:40;55981:2;55985:7;55953:27;:40::i;:::-;55922:83;55822:183;55423:589;;;:::o;11052:149::-;11115:7;11146:1;11142;:5;:51;;11173:20;11188:1;11191;11173:14;:20::i;:::-;11142:51;;;11150:20;11165:1;11168;11150:14;:20::i;:::-;11142:51;11135:58;;11052:149;;;;:::o;20272:326::-;20332:4;20589:1;20567:7;:19;;;:23;20560:30;;20272:326;;;:::o;51305:126::-;;;;:::o;56735:164::-;56839:10;:17;;;;56812:15;:24;56828:7;56812:24;;;;;;;;;;;:44;;;;56867:10;56883:7;56867:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56735:164;:::o;57526:988::-;57792:22;57842:1;57817:22;57834:4;57817:16;:22::i;:::-;:26;;;;:::i;:::-;57792:51;;57854:18;57875:17;:26;57893:7;57875:26;;;;;;;;;;;;57854:47;;58022:14;58008:10;:28;58004:328;;58053:19;58075:12;:18;58088:4;58075:18;;;;;;;;;;;;;;;:34;58094:14;58075:34;;;;;;;;;;;;58053:56;;58159:11;58126:12;:18;58139:4;58126:18;;;;;;;;;;;;;;;:30;58145:10;58126:30;;;;;;;;;;;:44;;;;58276:10;58243:17;:30;58261:11;58243:30;;;;;;;;;;;:43;;;;58038:294;58004:328;58428:17;:26;58446:7;58428:26;;;;;;;;;;;58421:33;;;58472:12;:18;58485:4;58472:18;;;;;;;;;;;;;;;:34;58491:14;58472:34;;;;;;;;;;;58465:41;;;57607:907;;57526:988;;:::o;58809:1079::-;59062:22;59107:1;59087:10;:17;;;;:21;;;;:::i;:::-;59062:46;;59119:18;59140:15;:24;59156:7;59140:24;;;;;;;;;;;;59119:45;;59491:19;59513:10;59524:14;59513:26;;;;;;;;:::i;:::-;;;;;;;;;;59491:48;;59577:11;59552:10;59563;59552:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;59688:10;59657:15;:28;59673:11;59657:28;;;;;;;;;;;:41;;;;59829:15;:24;59845:7;59829:24;;;;;;;;;;;59822:31;;;59864:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58880:1008;;;58809:1079;:::o;56313:221::-;56398:14;56415:20;56432:2;56415:16;:20::i;:::-;56398:37;;56473:7;56446:12;:16;56459:2;56446:16;;;;;;;;;;;;;;;:24;56463:6;56446:24;;;;;;;;;;;:34;;;;56520:6;56491:17;:26;56509:7;56491:26;;;;;;;;;;;:35;;;;56387:147;56313:221;;:::o;11209:268::-;11277:13;11384:1;11378:4;11371:15;11413:1;11407:4;11400:15;11454:4;11448;11438:21;11429:30;;11209:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:77::-;5327:7;5356:5;5345:16;;5290:77;;;:::o;5373:122::-;5446:24;5464:5;5446:24;:::i;:::-;5439:5;5436:35;5426:63;;5485:1;5482;5475:12;5426:63;5373:122;:::o;5501:139::-;5547:5;5585:6;5572:20;5563:29;;5601:33;5628:5;5601:33;:::i;:::-;5501:139;;;;:::o;5646:329::-;5705:6;5754:2;5742:9;5733:7;5729:23;5725:32;5722:119;;;5760:79;;:::i;:::-;5722:119;5880:1;5905:53;5950:7;5941:6;5930:9;5926:22;5905:53;:::i;:::-;5895:63;;5851:117;5646:329;;;;:::o;5981:117::-;6090:1;6087;6080:12;6104:117;6213:1;6210;6203:12;6227:117;6336:1;6333;6326:12;6367:568;6440:8;6450:6;6500:3;6493:4;6485:6;6481:17;6477:27;6467:122;;6508:79;;:::i;:::-;6467:122;6621:6;6608:20;6598:30;;6651:18;6643:6;6640:30;6637:117;;;6673:79;;:::i;:::-;6637:117;6787:4;6779:6;6775:17;6763:29;;6841:3;6833:4;6825:6;6821:17;6811:8;6807:32;6804:41;6801:128;;;6848:79;;:::i;:::-;6801:128;6367:568;;;;;:::o;6941:704::-;7036:6;7044;7052;7101:2;7089:9;7080:7;7076:23;7072:32;7069:119;;;7107:79;;:::i;:::-;7069:119;7255:1;7244:9;7240:17;7227:31;7285:18;7277:6;7274:30;7271:117;;;7307:79;;:::i;:::-;7271:117;7420:80;7492:7;7483:6;7472:9;7468:22;7420:80;:::i;:::-;7402:98;;;;7198:312;7549:2;7575:53;7620:7;7611:6;7600:9;7596:22;7575:53;:::i;:::-;7565:63;;7520:118;6941:704;;;;;:::o;7651:619::-;7728:6;7736;7744;7793:2;7781:9;7772:7;7768:23;7764:32;7761:119;;;7799:79;;:::i;:::-;7761:119;7919:1;7944:53;7989:7;7980:6;7969:9;7965:22;7944:53;:::i;:::-;7934:63;;7890:117;8046:2;8072:53;8117:7;8108:6;8097:9;8093:22;8072:53;:::i;:::-;8062:63;;8017:118;8174:2;8200:53;8245:7;8236:6;8225:9;8221:22;8200:53;:::i;:::-;8190:63;;8145:118;7651:619;;;;;:::o;8276:559::-;8362:6;8370;8419:2;8407:9;8398:7;8394:23;8390:32;8387:119;;;8425:79;;:::i;:::-;8387:119;8573:1;8562:9;8558:17;8545:31;8603:18;8595:6;8592:30;8589:117;;;8625:79;;:::i;:::-;8589:117;8738:80;8810:7;8801:6;8790:9;8786:22;8738:80;:::i;:::-;8720:98;;;;8516:312;8276:559;;;;;:::o;8855:553::-;8913:8;8923:6;8973:3;8966:4;8958:6;8954:17;8950:27;8940:122;;8981:79;;:::i;:::-;8940:122;9094:6;9081:20;9071:30;;9124:18;9116:6;9113:30;9110:117;;;9146:79;;:::i;:::-;9110:117;9260:4;9252:6;9248:17;9236:29;;9314:3;9306:4;9298:6;9294:17;9284:8;9280:32;9277:41;9274:128;;;9321:79;;:::i;:::-;9274:128;8855:553;;;;;:::o;9414:529::-;9485:6;9493;9542:2;9530:9;9521:7;9517:23;9513:32;9510:119;;;9548:79;;:::i;:::-;9510:119;9696:1;9685:9;9681:17;9668:31;9726:18;9718:6;9715:30;9712:117;;;9748:79;;:::i;:::-;9712:117;9861:65;9918:7;9909:6;9898:9;9894:22;9861:65;:::i;:::-;9843:83;;;;9639:297;9414:529;;;;;:::o;9949:329::-;10008:6;10057:2;10045:9;10036:7;10032:23;10028:32;10025:119;;;10063:79;;:::i;:::-;10025:119;10183:1;10208:53;10253:7;10244:6;10233:9;10229:22;10208:53;:::i;:::-;10198:63;;10154:117;9949:329;;;;:::o;10284:118::-;10371:24;10389:5;10371:24;:::i;:::-;10366:3;10359:37;10284:118;;:::o;10408:222::-;10501:4;10539:2;10528:9;10524:18;10516:26;;10552:71;10620:1;10609:9;10605:17;10596:6;10552:71;:::i;:::-;10408:222;;;;:::o;10649:552::-;10706:8;10716:6;10766:3;10759:4;10751:6;10747:17;10743:27;10733:122;;10774:79;;:::i;:::-;10733:122;10887:6;10874:20;10864:30;;10917:18;10909:6;10906:30;10903:117;;;10939:79;;:::i;:::-;10903:117;11053:4;11045:6;11041:17;11029:29;;11107:3;11099:4;11091:6;11087:17;11077:8;11073:32;11070:41;11067:128;;;11114:79;;:::i;:::-;11067:128;10649:552;;;;;:::o;11207:902::-;11313:6;11321;11329;11337;11386:2;11374:9;11365:7;11361:23;11357:32;11354:119;;;11392:79;;:::i;:::-;11354:119;11540:1;11529:9;11525:17;11512:31;11570:18;11562:6;11559:30;11556:117;;;11592:79;;:::i;:::-;11556:117;11705:80;11777:7;11768:6;11757:9;11753:22;11705:80;:::i;:::-;11687:98;;;;11483:312;11862:2;11851:9;11847:18;11834:32;11893:18;11885:6;11882:30;11879:117;;;11915:79;;:::i;:::-;11879:117;12028:64;12084:7;12075:6;12064:9;12060:22;12028:64;:::i;:::-;12010:82;;;;11805:297;11207:902;;;;;;;:::o;12115:116::-;12185:21;12200:5;12185:21;:::i;:::-;12178:5;12175:32;12165:60;;12221:1;12218;12211:12;12165:60;12115:116;:::o;12237:133::-;12280:5;12318:6;12305:20;12296:29;;12334:30;12358:5;12334:30;:::i;:::-;12237:133;;;;:::o;12376:468::-;12441:6;12449;12498:2;12486:9;12477:7;12473:23;12469:32;12466:119;;;12504:79;;:::i;:::-;12466:119;12624:1;12649:53;12694:7;12685:6;12674:9;12670:22;12649:53;:::i;:::-;12639:63;;12595:117;12751:2;12777:50;12819:7;12810:6;12799:9;12795:22;12777:50;:::i;:::-;12767:60;;12722:115;12376:468;;;;;:::o;12850:117::-;12959:1;12956;12949:12;12973:180;13021:77;13018:1;13011:88;13118:4;13115:1;13108:15;13142:4;13139:1;13132:15;13159:281;13242:27;13264:4;13242:27;:::i;:::-;13234:6;13230:40;13372:6;13360:10;13357:22;13336:18;13324:10;13321:34;13318:62;13315:88;;;13383:18;;:::i;:::-;13315:88;13423:10;13419:2;13412:22;13202:238;13159:281;;:::o;13446:129::-;13480:6;13507:20;;:::i;:::-;13497:30;;13536:33;13564:4;13556:6;13536:33;:::i;:::-;13446:129;;;:::o;13581:307::-;13642:4;13732:18;13724:6;13721:30;13718:56;;;13754:18;;:::i;:::-;13718:56;13792:29;13814:6;13792:29;:::i;:::-;13784:37;;13876:4;13870;13866:15;13858:23;;13581:307;;;:::o;13894:154::-;13978:6;13973:3;13968;13955:30;14040:1;14031:6;14026:3;14022:16;14015:27;13894:154;;;:::o;14054:410::-;14131:5;14156:65;14172:48;14213:6;14172:48;:::i;:::-;14156:65;:::i;:::-;14147:74;;14244:6;14237:5;14230:21;14282:4;14275:5;14271:16;14320:3;14311:6;14306:3;14302:16;14299:25;14296:112;;;14327:79;;:::i;:::-;14296:112;14417:41;14451:6;14446:3;14441;14417:41;:::i;:::-;14137:327;14054:410;;;;;:::o;14483:338::-;14538:5;14587:3;14580:4;14572:6;14568:17;14564:27;14554:122;;14595:79;;:::i;:::-;14554:122;14712:6;14699:20;14737:78;14811:3;14803:6;14796:4;14788:6;14784:17;14737:78;:::i;:::-;14728:87;;14544:277;14483:338;;;;:::o;14827:943::-;14922:6;14930;14938;14946;14995:3;14983:9;14974:7;14970:23;14966:33;14963:120;;;15002:79;;:::i;:::-;14963:120;15122:1;15147:53;15192:7;15183:6;15172:9;15168:22;15147:53;:::i;:::-;15137:63;;15093:117;15249:2;15275:53;15320:7;15311:6;15300:9;15296:22;15275:53;:::i;:::-;15265:63;;15220:118;15377:2;15403:53;15448:7;15439:6;15428:9;15424:22;15403:53;:::i;:::-;15393:63;;15348:118;15533:2;15522:9;15518:18;15505:32;15564:18;15556:6;15553:30;15550:117;;;15586:79;;:::i;:::-;15550:117;15691:62;15745:7;15736:6;15725:9;15721:22;15691:62;:::i;:::-;15681:72;;15476:287;14827:943;;;;;;;:::o;15776:474::-;15844:6;15852;15901:2;15889:9;15880:7;15876:23;15872:32;15869:119;;;15907:79;;:::i;:::-;15869:119;16027:1;16052:53;16097:7;16088:6;16077:9;16073:22;16052:53;:::i;:::-;16042:63;;15998:117;16154:2;16180:53;16225:7;16216:6;16205:9;16201:22;16180:53;:::i;:::-;16170:63;;16125:118;15776:474;;;;;:::o;16256:180::-;16304:77;16301:1;16294:88;16401:4;16398:1;16391:15;16425:4;16422:1;16415:15;16442:320;16486:6;16523:1;16517:4;16513:12;16503:22;;16570:1;16564:4;16560:12;16591:18;16581:81;;16647:4;16639:6;16635:17;16625:27;;16581:81;16709:2;16701:6;16698:14;16678:18;16675:38;16672:84;;16728:18;;:::i;:::-;16672:84;16493:269;16442:320;;;:::o;16768:220::-;16908:34;16904:1;16896:6;16892:14;16885:58;16977:3;16972:2;16964:6;16960:15;16953:28;16768:220;:::o;16994:366::-;17136:3;17157:67;17221:2;17216:3;17157:67;:::i;:::-;17150:74;;17233:93;17322:3;17233:93;:::i;:::-;17351:2;17346:3;17342:12;17335:19;;16994:366;;;:::o;17366:419::-;17532:4;17570:2;17559:9;17555:18;17547:26;;17619:9;17613:4;17609:20;17605:1;17594:9;17590:17;17583:47;17647:131;17773:4;17647:131;:::i;:::-;17639:139;;17366:419;;;:::o;17791:249::-;17931:34;17927:1;17919:6;17915:14;17908:58;18000:32;17995:2;17987:6;17983:15;17976:57;17791:249;:::o;18046:366::-;18188:3;18209:67;18273:2;18268:3;18209:67;:::i;:::-;18202:74;;18285:93;18374:3;18285:93;:::i;:::-;18403:2;18398:3;18394:12;18387:19;;18046:366;;;:::o;18418:419::-;18584:4;18622:2;18611:9;18607:18;18599:26;;18671:9;18665:4;18661:20;18657:1;18646:9;18642:17;18635:47;18699:131;18825:4;18699:131;:::i;:::-;18691:139;;18418:419;;;:::o;18843:181::-;18983:33;18979:1;18971:6;18967:14;18960:57;18843:181;:::o;19030:366::-;19172:3;19193:67;19257:2;19252:3;19193:67;:::i;:::-;19186:74;;19269:93;19358:3;19269:93;:::i;:::-;19387:2;19382:3;19378:12;19371:19;;19030:366;;;:::o;19402:419::-;19568:4;19606:2;19595:9;19591:18;19583:26;;19655:9;19649:4;19645:20;19641:1;19630:9;19626:17;19619:47;19683:131;19809:4;19683:131;:::i;:::-;19675:139;;19402:419;;;:::o;19827:167::-;19967:19;19963:1;19955:6;19951:14;19944:43;19827:167;:::o;20000:366::-;20142:3;20163:67;20227:2;20222:3;20163:67;:::i;:::-;20156:74;;20239:93;20328:3;20239:93;:::i;:::-;20357:2;20352:3;20348:12;20341:19;;20000:366;;;:::o;20372:419::-;20538:4;20576:2;20565:9;20561:18;20553:26;;20625:9;20619:4;20615:20;20611:1;20600:9;20596:17;20589:47;20653:131;20779:4;20653:131;:::i;:::-;20645:139;;20372:419;;;:::o;20797:175::-;20937:27;20933:1;20925:6;20921:14;20914:51;20797:175;:::o;20978:366::-;21120:3;21141:67;21205:2;21200:3;21141:67;:::i;:::-;21134:74;;21217:93;21306:3;21217:93;:::i;:::-;21335:2;21330:3;21326:12;21319:19;;20978:366;;;:::o;21350:419::-;21516:4;21554:2;21543:9;21539:18;21531:26;;21603:9;21597:4;21593:20;21589:1;21578:9;21574:17;21567:47;21631:131;21757:4;21631:131;:::i;:::-;21623:139;;21350:419;;;:::o;21775:220::-;21915:34;21911:1;21903:6;21899:14;21892:58;21984:3;21979:2;21971:6;21967:15;21960:28;21775:220;:::o;22001:366::-;22143:3;22164:67;22228:2;22223:3;22164:67;:::i;:::-;22157:74;;22240:93;22329:3;22240:93;:::i;:::-;22358:2;22353:3;22349:12;22342:19;;22001:366;;;:::o;22373:419::-;22539:4;22577:2;22566:9;22562:18;22554:26;;22626:9;22620:4;22616:20;22612:1;22601:9;22597:17;22590:47;22654:131;22780:4;22654:131;:::i;:::-;22646:139;;22373:419;;;:::o;22798:180::-;22846:77;22843:1;22836:88;22943:4;22940:1;22933:15;22967:4;22964:1;22957:15;22984:305;23024:3;23043:20;23061:1;23043:20;:::i;:::-;23038:25;;23077:20;23095:1;23077:20;:::i;:::-;23072:25;;23231:1;23163:66;23159:74;23156:1;23153:81;23150:107;;;23237:18;;:::i;:::-;23150:107;23281:1;23278;23274:9;23267:16;;22984:305;;;;:::o;23295:167::-;23435:19;23431:1;23423:6;23419:14;23412:43;23295:167;:::o;23468:366::-;23610:3;23631:67;23695:2;23690:3;23631:67;:::i;:::-;23624:74;;23707:93;23796:3;23707:93;:::i;:::-;23825:2;23820:3;23816:12;23809:19;;23468:366;;;:::o;23840:419::-;24006:4;24044:2;24033:9;24029:18;24021:26;;24093:9;24087:4;24083:20;24079:1;24068:9;24064:17;24057:47;24121:131;24247:4;24121:131;:::i;:::-;24113:139;;23840:419;;;:::o;24265:163::-;24405:15;24401:1;24393:6;24389:14;24382:39;24265:163;:::o;24434:366::-;24576:3;24597:67;24661:2;24656:3;24597:67;:::i;:::-;24590:74;;24673:93;24762:3;24673:93;:::i;:::-;24791:2;24786:3;24782:12;24775:19;;24434:366;;;:::o;24806:419::-;24972:4;25010:2;24999:9;24995:18;24987:26;;25059:9;25053:4;25049:20;25045:1;25034:9;25030:17;25023:47;25087:131;25213:4;25087:131;:::i;:::-;25079:139;;24806:419;;;:::o;25231:180::-;25279:77;25276:1;25269:88;25376:4;25373:1;25366:15;25400:4;25397:1;25390:15;25417:233;25456:3;25479:24;25497:5;25479:24;:::i;:::-;25470:33;;25525:66;25518:5;25515:77;25512:103;;25595:18;;:::i;:::-;25512:103;25642:1;25635:5;25631:13;25624:20;;25417:233;;;:::o;25656:167::-;25796:19;25792:1;25784:6;25780:14;25773:43;25656:167;:::o;25829:366::-;25971:3;25992:67;26056:2;26051:3;25992:67;:::i;:::-;25985:74;;26068:93;26157:3;26068:93;:::i;:::-;26186:2;26181:3;26177:12;26170:19;;25829:366;;;:::o;26201:419::-;26367:4;26405:2;26394:9;26390:18;26382:26;;26454:9;26448:4;26444:20;26440:1;26429:9;26425:17;26418:47;26482:131;26608:4;26482:131;:::i;:::-;26474:139;;26201:419;;;:::o;26626:233::-;26766:34;26762:1;26754:6;26750:14;26743:58;26835:16;26830:2;26822:6;26818:15;26811:41;26626:233;:::o;26865:366::-;27007:3;27028:67;27092:2;27087:3;27028:67;:::i;:::-;27021:74;;27104:93;27193:3;27104:93;:::i;:::-;27222:2;27217:3;27213:12;27206:19;;26865:366;;;:::o;27237:419::-;27403:4;27441:2;27430:9;27426:18;27418:26;;27490:9;27484:4;27480:20;27476:1;27465:9;27461:17;27454:47;27518:131;27644:4;27518:131;:::i;:::-;27510:139;;27237:419;;;:::o;27662:171::-;27802:23;27798:1;27790:6;27786:14;27779:47;27662:171;:::o;27839:366::-;27981:3;28002:67;28066:2;28061:3;28002:67;:::i;:::-;27995:74;;28078:93;28167:3;28078:93;:::i;:::-;28196:2;28191:3;28187:12;28180:19;;27839:366;;;:::o;28211:419::-;28377:4;28415:2;28404:9;28400:18;28392:26;;28464:9;28458:4;28454:20;28450:1;28439:9;28435:17;28428:47;28492:131;28618:4;28492:131;:::i;:::-;28484:139;;28211:419;;;:::o;28636:230::-;28776:34;28772:1;28764:6;28760:14;28753:58;28845:13;28840:2;28832:6;28828:15;28821:38;28636:230;:::o;28872:366::-;29014:3;29035:67;29099:2;29094:3;29035:67;:::i;:::-;29028:74;;29111:93;29200:3;29111:93;:::i;:::-;29229:2;29224:3;29220:12;29213:19;;28872:366;;;:::o;29244:419::-;29410:4;29448:2;29437:9;29433:18;29425:26;;29497:9;29491:4;29487:20;29483:1;29472:9;29468:17;29461:47;29525:131;29651:4;29525:131;:::i;:::-;29517:139;;29244:419;;;:::o;29669:94::-;29702:8;29750:5;29746:2;29742:14;29721:35;;29669:94;;;:::o;29769:::-;29808:7;29837:20;29851:5;29837:20;:::i;:::-;29826:31;;29769:94;;;:::o;29869:100::-;29908:7;29937:26;29957:5;29937:26;:::i;:::-;29926:37;;29869:100;;;:::o;29975:157::-;30080:45;30100:24;30118:5;30100:24;:::i;:::-;30080:45;:::i;:::-;30075:3;30068:58;29975:157;;:::o;30138:256::-;30250:3;30265:75;30336:3;30327:6;30265:75;:::i;:::-;30365:2;30360:3;30356:12;30349:19;;30385:3;30378:10;;30138:256;;;;:::o;30400:165::-;30540:17;30536:1;30528:6;30524:14;30517:41;30400:165;:::o;30571:366::-;30713:3;30734:67;30798:2;30793:3;30734:67;:::i;:::-;30727:74;;30810:93;30899:3;30810:93;:::i;:::-;30928:2;30923:3;30919:12;30912:19;;30571:366;;;:::o;30943:419::-;31109:4;31147:2;31136:9;31132:18;31124:26;;31196:9;31190:4;31186:20;31182:1;31171:9;31167:17;31160:47;31224:131;31350:4;31224:131;:::i;:::-;31216:139;;30943:419;;;:::o;31368:168::-;31508:20;31504:1;31496:6;31492:14;31485:44;31368:168;:::o;31542:366::-;31684:3;31705:67;31769:2;31764:3;31705:67;:::i;:::-;31698:74;;31781:93;31870:3;31781:93;:::i;:::-;31899:2;31894:3;31890:12;31883:19;;31542:366;;;:::o;31914:419::-;32080:4;32118:2;32107:9;32103:18;32095:26;;32167:9;32161:4;32157:20;32153:1;32142:9;32138:17;32131:47;32195:131;32321:4;32195:131;:::i;:::-;32187:139;;31914:419;;;:::o;32339:231::-;32479:34;32475:1;32467:6;32463:14;32456:58;32548:14;32543:2;32535:6;32531:15;32524:39;32339:231;:::o;32576:366::-;32718:3;32739:67;32803:2;32798:3;32739:67;:::i;:::-;32732:74;;32815:93;32904:3;32815:93;:::i;:::-;32933:2;32928:3;32924:12;32917:19;;32576:366;;;:::o;32948:419::-;33114:4;33152:2;33141:9;33137:18;33129:26;;33201:9;33195:4;33191:20;33187:1;33176:9;33172:17;33165:47;33229:131;33355:4;33229:131;:::i;:::-;33221:139;;32948:419;;;:::o;33373:174::-;33513:26;33509:1;33501:6;33497:14;33490:50;33373:174;:::o;33553:366::-;33695:3;33716:67;33780:2;33775:3;33716:67;:::i;:::-;33709:74;;33792:93;33881:3;33792:93;:::i;:::-;33910:2;33905:3;33901:12;33894:19;;33553:366;;;:::o;33925:419::-;34091:4;34129:2;34118:9;34114:18;34106:26;;34178:9;34172:4;34168:20;34164:1;34153:9;34149:17;34142:47;34206:131;34332:4;34206:131;:::i;:::-;34198:139;;33925:419;;;:::o;34350:228::-;34490:34;34486:1;34478:6;34474:14;34467:58;34559:11;34554:2;34546:6;34542:15;34535:36;34350:228;:::o;34584:366::-;34726:3;34747:67;34811:2;34806:3;34747:67;:::i;:::-;34740:74;;34823:93;34912:3;34823:93;:::i;:::-;34941:2;34936:3;34932:12;34925:19;;34584:366;;;:::o;34956:419::-;35122:4;35160:2;35149:9;35145:18;35137:26;;35209:9;35203:4;35199:20;35195:1;35184:9;35180:17;35173:47;35237:131;35363:4;35237:131;:::i;:::-;35229:139;;34956:419;;;:::o;35381:171::-;35521:23;35517:1;35509:6;35505:14;35498:47;35381:171;:::o;35558:366::-;35700:3;35721:67;35785:2;35780:3;35721:67;:::i;:::-;35714:74;;35797:93;35886:3;35797:93;:::i;:::-;35915:2;35910:3;35906:12;35899:19;;35558:366;;;:::o;35930:419::-;36096:4;36134:2;36123:9;36119:18;36111:26;;36183:9;36177:4;36173:20;36169:1;36158:9;36154:17;36147:47;36211:131;36337:4;36211:131;:::i;:::-;36203:139;;35930:419;;;:::o;36355:234::-;36495:34;36491:1;36483:6;36479:14;36472:58;36564:17;36559:2;36551:6;36547:15;36540:42;36355:234;:::o;36595:366::-;36737:3;36758:67;36822:2;36817:3;36758:67;:::i;:::-;36751:74;;36834:93;36923:3;36834:93;:::i;:::-;36952:2;36947:3;36943:12;36936:19;;36595:366;;;:::o;36967:419::-;37133:4;37171:2;37160:9;37156:18;37148:26;;37220:9;37214:4;37210:20;37206:1;37195:9;37191:17;37184:47;37248:131;37374:4;37248:131;:::i;:::-;37240:139;;36967:419;;;:::o;37392:148::-;37494:11;37531:3;37516:18;;37392:148;;;;:::o;37546:377::-;37652:3;37680:39;37713:5;37680:39;:::i;:::-;37735:89;37817:6;37812:3;37735:89;:::i;:::-;37728:96;;37833:52;37878:6;37873:3;37866:4;37859:5;37855:16;37833:52;:::i;:::-;37910:6;37905:3;37901:16;37894:23;;37656:267;37546:377;;;;:::o;37929:141::-;37978:4;38001:3;37993:11;;38024:3;38021:1;38014:14;38058:4;38055:1;38045:18;38037:26;;37929:141;;;:::o;38100:845::-;38203:3;38240:5;38234:12;38269:36;38295:9;38269:36;:::i;:::-;38321:89;38403:6;38398:3;38321:89;:::i;:::-;38314:96;;38441:1;38430:9;38426:17;38457:1;38452:137;;;;38603:1;38598:341;;;;38419:520;;38452:137;38536:4;38532:9;38521;38517:25;38512:3;38505:38;38572:6;38567:3;38563:16;38556:23;;38452:137;;38598:341;38665:38;38697:5;38665:38;:::i;:::-;38725:1;38739:154;38753:6;38750:1;38747:13;38739:154;;;38827:7;38821:14;38817:1;38812:3;38808:11;38801:35;38877:1;38868:7;38864:15;38853:26;;38775:4;38772:1;38768:12;38763:17;;38739:154;;;38922:6;38917:3;38913:16;38906:23;;38605:334;;38419:520;;38207:738;;38100:845;;;;:::o;38951:589::-;39176:3;39198:95;39289:3;39280:6;39198:95;:::i;:::-;39191:102;;39310:95;39401:3;39392:6;39310:95;:::i;:::-;39303:102;;39422:92;39510:3;39501:6;39422:92;:::i;:::-;39415:99;;39531:3;39524:10;;38951:589;;;;;;:::o;39546:225::-;39686:34;39682:1;39674:6;39670:14;39663:58;39755:8;39750:2;39742:6;39738:15;39731:33;39546:225;:::o;39777:366::-;39919:3;39940:67;40004:2;39999:3;39940:67;:::i;:::-;39933:74;;40016:93;40105:3;40016:93;:::i;:::-;40134:2;40129:3;40125:12;40118:19;;39777:366;;;:::o;40149:419::-;40315:4;40353:2;40342:9;40338:18;40330:26;;40402:9;40396:4;40392:20;40388:1;40377:9;40373:17;40366:47;40430:131;40556:4;40430:131;:::i;:::-;40422:139;;40149:419;;;:::o;40574:182::-;40714:34;40710:1;40702:6;40698:14;40691:58;40574:182;:::o;40762:366::-;40904:3;40925:67;40989:2;40984:3;40925:67;:::i;:::-;40918:74;;41001:93;41090:3;41001:93;:::i;:::-;41119:2;41114:3;41110:12;41103:19;;40762:366;;;:::o;41134:419::-;41300:4;41338:2;41327:9;41323:18;41315:26;;41387:9;41381:4;41377:20;41373:1;41362:9;41358:17;41351:47;41415:131;41541:4;41415:131;:::i;:::-;41407:139;;41134:419;;;:::o;41559:224::-;41699:34;41695:1;41687:6;41683:14;41676:58;41768:7;41763:2;41755:6;41751:15;41744:32;41559:224;:::o;41789:366::-;41931:3;41952:67;42016:2;42011:3;41952:67;:::i;:::-;41945:74;;42028:93;42117:3;42028:93;:::i;:::-;42146:2;42141:3;42137:12;42130:19;;41789:366;;;:::o;42161:419::-;42327:4;42365:2;42354:9;42350:18;42342:26;;42414:9;42408:4;42404:20;42400:1;42389:9;42385:17;42378:47;42442:131;42568:4;42442:131;:::i;:::-;42434:139;;42161:419;;;:::o;42586:223::-;42726:34;42722:1;42714:6;42710:14;42703:58;42795:6;42790:2;42782:6;42778:15;42771:31;42586:223;:::o;42815:366::-;42957:3;42978:67;43042:2;43037:3;42978:67;:::i;:::-;42971:74;;43054:93;43143:3;43054:93;:::i;:::-;43172:2;43167:3;43163:12;43156:19;;42815:366;;;:::o;43187:419::-;43353:4;43391:2;43380:9;43376:18;43368:26;;43440:9;43434:4;43430:20;43426:1;43415:9;43411:17;43404:47;43468:131;43594:4;43468:131;:::i;:::-;43460:139;;43187:419;;;:::o;43612:191::-;43652:4;43672:20;43690:1;43672:20;:::i;:::-;43667:25;;43706:20;43724:1;43706:20;:::i;:::-;43701:25;;43745:1;43742;43739:8;43736:34;;;43750:18;;:::i;:::-;43736:34;43795:1;43792;43788:9;43780:17;;43612:191;;;;:::o;43809:311::-;43886:4;43976:18;43968:6;43965:30;43962:56;;;43998:18;;:::i;:::-;43962:56;44048:4;44040:6;44036:17;44028:25;;44108:4;44102;44098:15;44090:23;;43809:311;;;:::o;44143:710::-;44239:5;44264:81;44280:64;44337:6;44280:64;:::i;:::-;44264:81;:::i;:::-;44255:90;;44365:5;44394:6;44387:5;44380:21;44428:4;44421:5;44417:16;44410:23;;44481:4;44473:6;44469:17;44461:6;44457:30;44510:3;44502:6;44499:15;44496:122;;;44529:79;;:::i;:::-;44496:122;44644:6;44627:220;44661:6;44656:3;44653:15;44627:220;;;44736:3;44765:37;44798:3;44786:10;44765:37;:::i;:::-;44760:3;44753:50;44832:4;44827:3;44823:14;44816:21;;44703:144;44687:4;44682:3;44678:14;44671:21;;44627:220;;;44631:21;44245:608;;44143:710;;;;;:::o;44876:370::-;44947:5;44996:3;44989:4;44981:6;44977:17;44973:27;44963:122;;45004:79;;:::i;:::-;44963:122;45121:6;45108:20;45146:94;45236:3;45228:6;45221:4;45213:6;45209:17;45146:94;:::i;:::-;45137:103;;44953:293;44876:370;;;;:::o;45252:684::-;45345:6;45353;45402:2;45390:9;45381:7;45377:23;45373:32;45370:119;;;45408:79;;:::i;:::-;45370:119;45528:1;45553:53;45598:7;45589:6;45578:9;45574:22;45553:53;:::i;:::-;45543:63;;45499:117;45683:2;45672:9;45668:18;45655:32;45714:18;45706:6;45703:30;45700:117;;;45736:79;;:::i;:::-;45700:117;45841:78;45911:7;45902:6;45891:9;45887:22;45841:78;:::i;:::-;45831:88;;45626:303;45252:684;;;;;:::o;45942:79::-;45981:7;46010:5;45999:16;;45942:79;;;:::o;46027:157::-;46132:45;46152:24;46170:5;46152:24;:::i;:::-;46132:45;:::i;:::-;46127:3;46120:58;46027:157;;:::o;46190:256::-;46302:3;46317:75;46388:3;46379:6;46317:75;:::i;:::-;46417:2;46412:3;46408:12;46401:19;;46437:3;46430:10;;46190:256;;;;:::o;46452:171::-;46592:23;46588:1;46580:6;46576:14;46569:47;46452:171;:::o;46629:366::-;46771:3;46792:67;46856:2;46851:3;46792:67;:::i;:::-;46785:74;;46868:93;46957:3;46868:93;:::i;:::-;46986:2;46981:3;46977:12;46970:19;;46629:366;;;:::o;47001:419::-;47167:4;47205:2;47194:9;47190:18;47182:26;;47254:9;47248:4;47244:20;47240:1;47229:9;47225:17;47218:47;47282:131;47408:4;47282:131;:::i;:::-;47274:139;;47001:419;;;:::o;47426:175::-;47566:27;47562:1;47554:6;47550:14;47543:51;47426:175;:::o;47607:366::-;47749:3;47770:67;47834:2;47829:3;47770:67;:::i;:::-;47763:74;;47846:93;47935:3;47846:93;:::i;:::-;47964:2;47959:3;47955:12;47948:19;;47607:366;;;:::o;47979:419::-;48145:4;48183:2;48172:9;48168:18;48160:26;;48232:9;48226:4;48222:20;48218:1;48207:9;48203:17;48196:47;48260:131;48386:4;48260:131;:::i;:::-;48252:139;;47979:419;;;:::o;48404:237::-;48544:34;48540:1;48532:6;48528:14;48521:58;48613:20;48608:2;48600:6;48596:15;48589:45;48404:237;:::o;48647:366::-;48789:3;48810:67;48874:2;48869:3;48810:67;:::i;:::-;48803:74;;48886:93;48975:3;48886:93;:::i;:::-;49004:2;48999:3;48995:12;48988:19;;48647:366;;;:::o;49019:419::-;49185:4;49223:2;49212:9;49208:18;49200:26;;49272:9;49266:4;49262:20;49258:1;49247:9;49243:17;49236:47;49300:131;49426:4;49300:131;:::i;:::-;49292:139;;49019:419;;;:::o;49444:180::-;49492:77;49489:1;49482:88;49589:4;49586:1;49579:15;49613:4;49610:1;49603:15;49630:185;49670:1;49687:20;49705:1;49687:20;:::i;:::-;49682:25;;49721:20;49739:1;49721:20;:::i;:::-;49716:25;;49760:1;49750:35;;49765:18;;:::i;:::-;49750:35;49807:1;49804;49800:9;49795:14;;49630:185;;;;:::o;49821:176::-;49853:1;49870:20;49888:1;49870:20;:::i;:::-;49865:25;;49904:20;49922:1;49904:20;:::i;:::-;49899:25;;49943:1;49933:35;;49948:18;;:::i;:::-;49933:35;49989:1;49986;49982:9;49977:14;;49821:176;;;;:::o;50003:98::-;50054:6;50088:5;50082:12;50072:22;;50003:98;;;:::o;50107:168::-;50190:11;50224:6;50219:3;50212:19;50264:4;50259:3;50255:14;50240:29;;50107:168;;;;:::o;50281:360::-;50367:3;50395:38;50427:5;50395:38;:::i;:::-;50449:70;50512:6;50507:3;50449:70;:::i;:::-;50442:77;;50528:52;50573:6;50568:3;50561:4;50554:5;50550:16;50528:52;:::i;:::-;50605:29;50627:6;50605:29;:::i;:::-;50600:3;50596:39;50589:46;;50371:270;50281:360;;;;:::o;50647:640::-;50842:4;50880:3;50869:9;50865:19;50857:27;;50894:71;50962:1;50951:9;50947:17;50938:6;50894:71;:::i;:::-;50975:72;51043:2;51032:9;51028:18;51019:6;50975:72;:::i;:::-;51057;51125:2;51114:9;51110:18;51101:6;51057:72;:::i;:::-;51176:9;51170:4;51166:20;51161:2;51150:9;51146:18;51139:48;51204:76;51275:4;51266:6;51204:76;:::i;:::-;51196:84;;50647:640;;;;;;;:::o;51293:141::-;51349:5;51380:6;51374:13;51365:22;;51396:32;51422:5;51396:32;:::i;:::-;51293:141;;;;:::o;51440:349::-;51509:6;51558:2;51546:9;51537:7;51533:23;51529:32;51526:119;;;51564:79;;:::i;:::-;51526:119;51684:1;51709:63;51764:7;51755:6;51744:9;51740:22;51709:63;:::i;:::-;51699:73;;51655:127;51440:349;;;;:::o;51795:182::-;51935:34;51931:1;51923:6;51919:14;51912:58;51795:182;:::o;51983:366::-;52125:3;52146:67;52210:2;52205:3;52146:67;:::i;:::-;52139:74;;52222:93;52311:3;52222:93;:::i;:::-;52340:2;52335:3;52331:12;52324:19;;51983:366;;;:::o;52355:419::-;52521:4;52559:2;52548:9;52544:18;52536:26;;52608:9;52602:4;52598:20;52594:1;52583:9;52579:17;52572:47;52636:131;52762:4;52636:131;:::i;:::-;52628:139;;52355:419;;;:::o;52780:178::-;52920:30;52916:1;52908:6;52904:14;52897:54;52780:178;:::o;52964:366::-;53106:3;53127:67;53191:2;53186:3;53127:67;:::i;:::-;53120:74;;53203:93;53292:3;53203:93;:::i;:::-;53321:2;53316:3;53312:12;53305:19;;52964:366;;;:::o;53336:419::-;53502:4;53540:2;53529:9;53525:18;53517:26;;53589:9;53583:4;53579:20;53575:1;53564:9;53560:17;53553:47;53617:131;53743:4;53617:131;:::i;:::-;53609:139;;53336:419;;;:::o;53761:180::-;53809:77;53806:1;53799:88;53906:4;53903:1;53896:15;53930:4;53927:1;53920:15

Swarm Source

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