ETH Price: $2,632.01 (-0.39%)

Token

SOFTEES (SOFTEE)
 

Overview

Max Total Supply

743 SOFTEE

Holders

175

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SOFTEE
0x31047ba37a9df3af44884f8e787321e4c0ba8a6f
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:
SOFTEE

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-26
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/ywy.sol



//Developer : FazelPejmanfar , Twitter :@Pejmanfarfazel



pragma solidity >=0.7.0 <0.9.0;






contract SOFTEE is ERC721A, Ownable, ReentrancyGuard {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public cost = 0.03 ether;
  uint256 public wlcost = 0.03 ether;
  uint256 public maxSupply = 7777;
  uint256 public WlSupply = 7777;
  uint256 public MaxperWallet = 20;
  uint256 public MaxperWalletWl = 20;
  bool public paused = false;
  bool public revealed = false;
  bytes32 public merkleRoot;

  constructor() ERC721A("SOFTEES", "SOFTEE") {
    setBaseURI("ipfs://QmVqwW8WYxiVGY5dbYVnPQpLFKcdrpFiq4CtF8EykzQj7V/");
    setNotRevealedURI("ipfs://QmPmhUJhgBerjJNnxz2J6Xf6x5JWRnjtqxNTp4arqr7Cxz/hide.json");
  }

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

  // public
  function mint(uint256 tokens) public payable nonReentrant {
    require(!paused, "SOFTEE: oops contract is paused");
    uint256 supply = totalSupply();
    require(tokens > 0, "SOFTEE: need to mint at least 1 NFT");
    require(tokens <= MaxperWallet, "SOFTEE: max mint amount per tx exceeded");
    require(supply + tokens <= maxSupply, "SOFTEE: We Soldout");
    require(_numberMinted(_msgSender()) + tokens <= MaxperWallet, "SOFTEE: Max NFT Per Wallet exceeded");
    require(msg.value >= cost * tokens, "SOFTEE: insufficient funds");

      _safeMint(_msgSender(), tokens);
    
  }
/// @dev presale mint for whitelisted
    function presalemint(uint256 tokens, bytes32[] calldata merkleProof) public payable nonReentrant {
    require(!paused, "SOFTEE: oops contract is paused");
    require(MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender))), "SOFTEE: You are not Whitelisted");
    uint256 supply = totalSupply();
    require(_numberMinted(_msgSender()) + tokens <= MaxperWalletWl, "SOFTEE: Max NFT Per Wallet exceeded");
    require(tokens > 0, "SOFTEE: need to mint at least 1 NFT");
    require(tokens <= MaxperWalletWl, "SOFTEE: max mint per Tx exceeded");
    require(supply + tokens <= WlSupply, "SOFTEE: Whitelist MaxSupply exceeded");
    require(msg.value >= wlcost * tokens, "SOFTEE: insufficient funds");

      _safeMint(_msgSender(), tokens);
    
  }




  /// @dev use it for giveaway and mint for yourself
     function gift(uint256 _mintAmount, address destination) public onlyOwner nonReentrant {
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    uint256 supply = totalSupply();
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

      _safeMint(destination, _mintAmount);
    
  }

  


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

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

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

  //only owner
  function reveal(bool _state) public onlyOwner {
      revealed = _state;
  }

  function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }
  
  function setMaxPerWallet(uint256 _limit) public onlyOwner {
    MaxperWallet = _limit;
  }

    function setWlMaxPerWallet(uint256 _limit) public onlyOwner {
    MaxperWalletWl = _limit;
  }
  
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

    function setWlCost(uint256 _newWlCost) public onlyOwner {
    wlcost = _newWlCost;
  }

    function setMaxsupply(uint256 _newsupply) public onlyOwner {
    maxSupply = _newsupply;
  }

    function setwlsupply(uint256 _newsupply) public onlyOwner {
    WlSupply = _newsupply;
  }

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

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

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
 
  function withdraw() public payable onlyOwner nonReentrant {
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
    require(success);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxperWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWalletWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WlSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presalemint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setMaxsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWlCost","type":"uint256"}],"name":"setWlCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWlMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setwlsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlcost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90805190602001906200005192919062000451565b50666a94d74f430000600d55666a94d74f430000600e55611e61600f55611e61601055601460115560146012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff021916908315150217905550348015620000c157600080fd5b506040518060400160405280600781526020017f534f4654454553000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f534f46544545000000000000000000000000000000000000000000000000000081525081600290805190602001906200014692919062000451565b5080600390805190602001906200015f92919062000451565b5062000170620001fa60201b60201c565b6000819055505050620001986200018c6200020360201b60201c565b6200020b60201b60201c565b6001600981905550620001ca6040518060600160405280603681526020016200535b60369139620002d160201b60201c565b620001f46040518060600160405280603f81526020016200531c603f91396200037c60201b60201c565b620005e9565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e16200020360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003076200042760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000360576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003579062000528565b60405180910390fd5b80600a90805190602001906200037892919062000451565b5050565b6200038c6200020360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003b26200042760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200040b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004029062000528565b60405180910390fd5b80600c90805190602001906200042392919062000451565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200045f906200055b565b90600052602060002090601f016020900481019282620004835760008555620004cf565b82601f106200049e57805160ff1916838001178555620004cf565b82800160010185558215620004cf579182015b82811115620004ce578251825591602001919060010190620004b1565b5b509050620004de9190620004e2565b5090565b5b80821115620004fd576000816000905550600101620004e3565b5090565b6000620005106020836200054a565b91506200051d82620005c0565b602082019050919050565b60006020820190508181036000830152620005438162000501565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200057457607f821691505b602082108114156200058b576200058a62000591565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614d2380620005f96000396000f3fe60806040526004361061027c5760003560e01c80636c2d3c4f1161014f578063bd7a1998116100c1578063dc33e6811161007a578063dc33e68114610922578063e268e4d31461095f578063e985e9c514610988578063f12f6d5d146109c5578063f2c4ce1e146109ee578063f2fde38b14610a175761027c565b8063bd7a199814610812578063bde0608a1461083d578063c668286214610866578063c87b56dd14610891578063d5abeb01146108ce578063da3ef23f146108f95761027c565b80638da5cb5b116101135780638da5cb5b14610725578063940cd05b1461075057806395d89b4114610779578063a0712d68146107a4578063a22cb465146107c0578063b88d4fde146107e95761027c565b80636c2d3c4f1461065457806370a082311461067f578063715018a6146106bc5780637cb64759146106d357806383a076be146106fc5761027c565b806318160ddd116101f3578063458c4f9e116101ac578063458c4f9e14610544578063518302271461056d57806355f804b3146105985780635c975abb146105c15780636352211e146105ec5780636c0360eb146106295761027c565b806318160ddd1461046957806323b872dd146104945780632eb4a7ab146104bd5780633ccfd60b146104e857806342842e0e146104f257806344a0d68a1461051b5761027c565b8063081812fc11610245578063081812fc14610359578063081c8c4414610396578063095ea7b3146103c15780630bddb613146103ea57806313faede614610415578063149835a0146104405761027c565b806277ec051461028157806301ffc9a7146102ac57806302329a29146102e9578063036e4cb51461031257806306fdde031461032e575b600080fd5b34801561028d57600080fd5b50610296610a40565b6040516102a3919061442a565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613c15565b610a46565b6040516102e091906141f2565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613bbb565b610b28565b005b61032c60048036038101906103279190613d25565b610bc1565b005b34801561033a57600080fd5b50610343610ec4565b6040516103509190614228565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190613cb8565b610f56565b60405161038d919061418b565b60405180910390f35b3480156103a257600080fd5b506103ab610fd2565b6040516103b89190614228565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613b7b565b611060565b005b3480156103f657600080fd5b506103ff61116b565b60405161040c919061442a565b60405180910390f35b34801561042157600080fd5b5061042a611171565b604051610437919061442a565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613cb8565b611177565b005b34801561047557600080fd5b5061047e6111fd565b60405161048b919061442a565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613a65565b611214565b005b3480156104c957600080fd5b506104d2611224565b6040516104df919061420d565b60405180910390f35b6104f061122a565b005b3480156104fe57600080fd5b5061051960048036038101906105149190613a65565b611375565b005b34801561052757600080fd5b50610542600480360381019061053d9190613cb8565b611395565b005b34801561055057600080fd5b5061056b60048036038101906105669190613cb8565b61141b565b005b34801561057957600080fd5b506105826114a1565b60405161058f91906141f2565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba9190613c6f565b6114b4565b005b3480156105cd57600080fd5b506105d661154a565b6040516105e391906141f2565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190613cb8565b61155d565b604051610620919061418b565b60405180910390f35b34801561063557600080fd5b5061063e611573565b60405161064b9190614228565b60405180910390f35b34801561066057600080fd5b50610669611601565b604051610676919061442a565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a191906139f8565b611607565b6040516106b3919061442a565b60405180910390f35b3480156106c857600080fd5b506106d16116d7565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190613be8565b61175f565b005b34801561070857600080fd5b50610723600480360381019061071e9190613ce5565b6117e5565b005b34801561073157600080fd5b5061073a611965565b604051610747919061418b565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190613bbb565b61198f565b005b34801561078557600080fd5b5061078e611a28565b60405161079b9190614228565b60405180910390f35b6107be60048036038101906107b99190613cb8565b611aba565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613b3b565b611d08565b005b3480156107f557600080fd5b50610810600480360381019061080b9190613ab8565b611e80565b005b34801561081e57600080fd5b50610827611efc565b604051610834919061442a565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f9190613cb8565b611f02565b005b34801561087257600080fd5b5061087b611f88565b6040516108889190614228565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b39190613cb8565b612016565b6040516108c59190614228565b60405180910390f35b3480156108da57600080fd5b506108e361216f565b6040516108f0919061442a565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190613c6f565b612175565b005b34801561092e57600080fd5b50610949600480360381019061094491906139f8565b61220b565b604051610956919061442a565b60405180910390f35b34801561096b57600080fd5b5061098660048036038101906109819190613cb8565b61221d565b005b34801561099457600080fd5b506109af60048036038101906109aa9190613a25565b6122a3565b6040516109bc91906141f2565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190613cb8565b612337565b005b3480156109fa57600080fd5b50610a156004803603810190610a109190613c6f565b6123bd565b005b348015610a2357600080fd5b50610a3e6004803603810190610a3991906139f8565b612453565b005b60125481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b1157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b215750610b208261254b565b5b9050919050565b610b306125b5565b73ffffffffffffffffffffffffffffffffffffffff16610b4e611965565b73ffffffffffffffffffffffffffffffffffffffff1614610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b9061436a565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b60026009541415610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe906143ea565b60405180910390fd5b6002600981905550601360009054906101000a900460ff1615610c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c569061438a565b60405180910390fd5b610cd3828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060145433604051602001610cb8919061412a565b604051602081830303815290604052805190602001206125bd565b610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d099061426a565b60405180910390fd5b6000610d1c6111fd565b905060125484610d32610d2d6125b5565b6125d4565b610d3c919061452f565b1115610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d74906143ca565b60405180910390fd5b60008411610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db79061432a565b60405180910390fd5b601254841115610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc9061430a565b60405180910390fd5b6010548482610e14919061452f565b1115610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c906142aa565b60405180910390fd5b83600e54610e6391906145b6565b341015610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c906143aa565b60405180910390fd5b610eb6610eb06125b5565b8561263e565b506001600981905550505050565b606060028054610ed390614704565b80601f0160208091040260200160405190810160405280929190818152602001828054610eff90614704565b8015610f4c5780601f10610f2157610100808354040283529160200191610f4c565b820191906000526020600020905b815481529060010190602001808311610f2f57829003601f168201915b5050505050905090565b6000610f618261265c565b610f97576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610fdf90614704565b80601f016020809104026020016040519081016040528092919081815260200182805461100b90614704565b80156110585780601f1061102d57610100808354040283529160200191611058565b820191906000526020600020905b81548152906001019060200180831161103b57829003601f168201915b505050505081565b600061106b8261155d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110d3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110f26125b5565b73ffffffffffffffffffffffffffffffffffffffff161415801561112457506111228161111d6125b5565b6122a3565b155b1561115b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111668383836126aa565b505050565b60105481565b600d5481565b61117f6125b5565b73ffffffffffffffffffffffffffffffffffffffff1661119d611965565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061436a565b60405180910390fd5b80600f8190555050565b600061120761275c565b6001546000540303905090565b61121f838383612765565b505050565b60145481565b6112326125b5565b73ffffffffffffffffffffffffffffffffffffffff16611250611965565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d9061436a565b60405180910390fd5b600260095414156112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e3906143ea565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161131a90614176565b60006040518083038185875af1925050503d8060008114611357576040519150601f19603f3d011682016040523d82523d6000602084013e61135c565b606091505b505090508061136a57600080fd5b506001600981905550565b61139083838360405180602001604052806000815250611e80565b505050565b61139d6125b5565b73ffffffffffffffffffffffffffffffffffffffff166113bb611965565b73ffffffffffffffffffffffffffffffffffffffff1614611411576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114089061436a565b60405180910390fd5b80600d8190555050565b6114236125b5565b73ffffffffffffffffffffffffffffffffffffffff16611441611965565b73ffffffffffffffffffffffffffffffffffffffff1614611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e9061436a565b60405180910390fd5b8060108190555050565b601360019054906101000a900460ff1681565b6114bc6125b5565b73ffffffffffffffffffffffffffffffffffffffff166114da611965565b73ffffffffffffffffffffffffffffffffffffffff1614611530576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115279061436a565b60405180910390fd5b80600a908051906020019061154692919061375e565b5050565b601360009054906101000a900460ff1681565b600061156882612c1b565b600001519050919050565b600a805461158090614704565b80601f01602080910402602001604051908101604052809291908181526020018280546115ac90614704565b80156115f95780601f106115ce576101008083540402835291602001916115f9565b820191906000526020600020905b8154815290600101906020018083116115dc57829003601f168201915b505050505081565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561166f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116df6125b5565b73ffffffffffffffffffffffffffffffffffffffff166116fd611965565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a9061436a565b60405180910390fd5b61175d6000612eaa565b565b6117676125b5565b73ffffffffffffffffffffffffffffffffffffffff16611785611965565b73ffffffffffffffffffffffffffffffffffffffff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d29061436a565b60405180910390fd5b8060148190555050565b6117ed6125b5565b73ffffffffffffffffffffffffffffffffffffffff1661180b611965565b73ffffffffffffffffffffffffffffffffffffffff1614611861576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118589061436a565b60405180910390fd5b600260095414156118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e906143ea565b60405180910390fd5b6002600981905550600082116118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e99061440a565b60405180910390fd5b60006118fc6111fd565b9050600f54838261190d919061452f565b111561194e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119459061434a565b60405180910390fd5b611958828461263e565b5060016009819055505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119976125b5565b73ffffffffffffffffffffffffffffffffffffffff166119b5611965565b73ffffffffffffffffffffffffffffffffffffffff1614611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a029061436a565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b606060038054611a3790614704565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6390614704565b8015611ab05780601f10611a8557610100808354040283529160200191611ab0565b820191906000526020600020905b815481529060010190602001808311611a9357829003601f168201915b5050505050905090565b60026009541415611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af7906143ea565b60405180910390fd5b6002600981905550601360009054906101000a900460ff1615611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f9061438a565b60405180910390fd5b6000611b626111fd565b905060008211611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e9061432a565b60405180910390fd5b601154821115611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906142ca565b60405180910390fd5b600f548282611bfb919061452f565b1115611c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c33906142ea565b60405180910390fd5b60115482611c50611c4b6125b5565b6125d4565b611c5a919061452f565b1115611c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c92906143ca565b60405180910390fd5b81600d54611ca991906145b6565b341015611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce2906143aa565b60405180910390fd5b611cfc611cf66125b5565b8361263e565b50600160098190555050565b611d106125b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d75576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d826125b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e2f6125b5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e7491906141f2565b60405180910390a35050565b611e8b848484612765565b611eaa8373ffffffffffffffffffffffffffffffffffffffff16612f70565b8015611ebf5750611ebd84848484612f93565b155b15611ef6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60115481565b611f0a6125b5565b73ffffffffffffffffffffffffffffffffffffffff16611f28611965565b73ffffffffffffffffffffffffffffffffffffffff1614611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f759061436a565b60405180910390fd5b8060128190555050565b600b8054611f9590614704565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc190614704565b801561200e5780601f10611fe35761010080835404028352916020019161200e565b820191906000526020600020905b815481529060010190602001808311611ff157829003601f168201915b505050505081565b60606120218261265c565b612060576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120579061424a565b60405180910390fd5b60001515601360019054906101000a900460ff161515141561210e57600c805461208990614704565b80601f01602080910402602001604051908101604052809291908181526020018280546120b590614704565b80156121025780601f106120d757610100808354040283529160200191612102565b820191906000526020600020905b8154815290600101906020018083116120e557829003601f168201915b5050505050905061216a565b60006121186130f3565b905060008151116121385760405180602001604052806000815250612166565b8061214284613185565b600b60405160200161215693929190614145565b6040516020818303038152906040525b9150505b919050565b600f5481565b61217d6125b5565b73ffffffffffffffffffffffffffffffffffffffff1661219b611965565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e89061436a565b60405180910390fd5b80600b908051906020019061220792919061375e565b5050565b6000612216826125d4565b9050919050565b6122256125b5565b73ffffffffffffffffffffffffffffffffffffffff16612243611965565b73ffffffffffffffffffffffffffffffffffffffff1614612299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122909061436a565b60405180910390fd5b8060118190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61233f6125b5565b73ffffffffffffffffffffffffffffffffffffffff1661235d611965565b73ffffffffffffffffffffffffffffffffffffffff16146123b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123aa9061436a565b60405180910390fd5b80600e8190555050565b6123c56125b5565b73ffffffffffffffffffffffffffffffffffffffff166123e3611965565b73ffffffffffffffffffffffffffffffffffffffff1614612439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124309061436a565b60405180910390fd5b80600c908051906020019061244f92919061375e565b5050565b61245b6125b5565b73ffffffffffffffffffffffffffffffffffffffff16612479611965565b73ffffffffffffffffffffffffffffffffffffffff16146124cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c69061436a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561253f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125369061428a565b60405180910390fd5b61254881612eaa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000826125ca85846132e6565b1490509392505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61265882826040518060200160405280600081525061335b565b5050565b60008161266761275c565b11158015612676575060005482105b80156126a3575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061277082612c1b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127db576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127fc6125b5565b73ffffffffffffffffffffffffffffffffffffffff16148061282b575061282a856128256125b5565b6122a3565b5b8061287057506128396125b5565b73ffffffffffffffffffffffffffffffffffffffff1661285884610f56565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128a9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612910576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61291d858585600161336d565b612929600084876126aa565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ba9576000548214612ba857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c148585856001613373565b5050505050565b612c236137e4565b600082905080612c3161275c565b11158015612c40575060005481105b15612e73576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e7157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d55578092505050612ea5565b5b600115612e7057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e6b578092505050612ea5565b612d56565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fb96125b5565b8786866040518563ffffffff1660e01b8152600401612fdb94939291906141a6565b602060405180830381600087803b158015612ff557600080fd5b505af192505050801561302657506040513d601f19601f820116820180604052508101906130239190613c42565b60015b6130a0573d8060008114613056576040519150601f19603f3d011682016040523d82523d6000602084013e61305b565b606091505b50600081511415613098576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461310290614704565b80601f016020809104026020016040519081016040528092919081815260200182805461312e90614704565b801561317b5780601f106131505761010080835404028352916020019161317b565b820191906000526020600020905b81548152906001019060200180831161315e57829003601f168201915b5050505050905090565b606060008214156131cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132e1565b600082905060005b600082146131ff5780806131e890614767565b915050600a826131f89190614585565b91506131d5565b60008167ffffffffffffffff81111561321b5761321a6148c1565b5b6040519080825280601f01601f19166020018201604052801561324d5781602001600182028036833780820191505090505b5090505b600085146132da576001826132669190614610565b9150600a8561327591906147d4565b6030613281919061452f565b60f81b81838151811061329757613296614892565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132d39190614585565b9450613251565b8093505050505b919050565b60008082905060005b845181101561335057600085828151811061330d5761330c614892565b5b6020026020010151905080831161332f576133288382613379565b925061333c565b6133398184613379565b92505b50808061334890614767565b9150506132ef565b508091505092915050565b6133688383836001613390565b505050565b50505050565b50505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133fd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613438576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613445600086838761336d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561360f575061360e8773ffffffffffffffffffffffffffffffffffffffff16612f70565b5b156136d5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136846000888480600101955088612f93565b6136ba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156136155782600054146136d057600080fd5b613741565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156136d6575b8160008190555050506137576000868387613373565b5050505050565b82805461376a90614704565b90600052602060002090601f01602090048101928261378c57600085556137d3565b82601f106137a557805160ff19168380011785556137d3565b828001600101855582156137d3579182015b828111156137d25782518255916020019190600101906137b7565b5b5090506137e09190613827565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613840576000816000905550600101613828565b5090565b60006138576138528461446a565b614445565b905082815260208101848484011115613873576138726148ff565b5b61387e8482856146c2565b509392505050565b60006138996138948461449b565b614445565b9050828152602081018484840111156138b5576138b46148ff565b5b6138c08482856146c2565b509392505050565b6000813590506138d781614c7a565b92915050565b60008083601f8401126138f3576138f26148f5565b5b8235905067ffffffffffffffff8111156139105761390f6148f0565b5b60208301915083602082028301111561392c5761392b6148fa565b5b9250929050565b60008135905061394281614c91565b92915050565b60008135905061395781614ca8565b92915050565b60008135905061396c81614cbf565b92915050565b60008151905061398181614cbf565b92915050565b600082601f83011261399c5761399b6148f5565b5b81356139ac848260208601613844565b91505092915050565b600082601f8301126139ca576139c96148f5565b5b81356139da848260208601613886565b91505092915050565b6000813590506139f281614cd6565b92915050565b600060208284031215613a0e57613a0d614909565b5b6000613a1c848285016138c8565b91505092915050565b60008060408385031215613a3c57613a3b614909565b5b6000613a4a858286016138c8565b9250506020613a5b858286016138c8565b9150509250929050565b600080600060608486031215613a7e57613a7d614909565b5b6000613a8c868287016138c8565b9350506020613a9d868287016138c8565b9250506040613aae868287016139e3565b9150509250925092565b60008060008060808587031215613ad257613ad1614909565b5b6000613ae0878288016138c8565b9450506020613af1878288016138c8565b9350506040613b02878288016139e3565b925050606085013567ffffffffffffffff811115613b2357613b22614904565b5b613b2f87828801613987565b91505092959194509250565b60008060408385031215613b5257613b51614909565b5b6000613b60858286016138c8565b9250506020613b7185828601613933565b9150509250929050565b60008060408385031215613b9257613b91614909565b5b6000613ba0858286016138c8565b9250506020613bb1858286016139e3565b9150509250929050565b600060208284031215613bd157613bd0614909565b5b6000613bdf84828501613933565b91505092915050565b600060208284031215613bfe57613bfd614909565b5b6000613c0c84828501613948565b91505092915050565b600060208284031215613c2b57613c2a614909565b5b6000613c398482850161395d565b91505092915050565b600060208284031215613c5857613c57614909565b5b6000613c6684828501613972565b91505092915050565b600060208284031215613c8557613c84614909565b5b600082013567ffffffffffffffff811115613ca357613ca2614904565b5b613caf848285016139b5565b91505092915050565b600060208284031215613cce57613ccd614909565b5b6000613cdc848285016139e3565b91505092915050565b60008060408385031215613cfc57613cfb614909565b5b6000613d0a858286016139e3565b9250506020613d1b858286016138c8565b9150509250929050565b600080600060408486031215613d3e57613d3d614909565b5b6000613d4c868287016139e3565b935050602084013567ffffffffffffffff811115613d6d57613d6c614904565b5b613d79868287016138dd565b92509250509250925092565b613d8e81614644565b82525050565b613da5613da082614644565b6147b0565b82525050565b613db481614656565b82525050565b613dc381614662565b82525050565b6000613dd4826144e1565b613dde81856144f7565b9350613dee8185602086016146d1565b613df78161490e565b840191505092915050565b6000613e0d826144ec565b613e178185614513565b9350613e278185602086016146d1565b613e308161490e565b840191505092915050565b6000613e46826144ec565b613e508185614524565b9350613e608185602086016146d1565b80840191505092915050565b60008154613e7981614704565b613e838186614524565b94506001821660008114613e9e5760018114613eaf57613ee2565b60ff19831686528186019350613ee2565b613eb8856144cc565b60005b83811015613eda57815481890152600182019150602081019050613ebb565b838801955050505b50505092915050565b6000613ef8603083614513565b9150613f038261492c565b604082019050919050565b6000613f1b601f83614513565b9150613f268261497b565b602082019050919050565b6000613f3e602683614513565b9150613f49826149a4565b604082019050919050565b6000613f61602483614513565b9150613f6c826149f3565b604082019050919050565b6000613f84602783614513565b9150613f8f82614a42565b604082019050919050565b6000613fa7601283614513565b9150613fb282614a91565b602082019050919050565b6000613fca602083614513565b9150613fd582614aba565b602082019050919050565b6000613fed602383614513565b9150613ff882614ae3565b604082019050919050565b6000614010601683614513565b915061401b82614b32565b602082019050919050565b6000614033602083614513565b915061403e82614b5b565b602082019050919050565b6000614056601f83614513565b915061406182614b84565b602082019050919050565b6000614079601a83614513565b915061408482614bad565b602082019050919050565b600061409c600083614508565b91506140a782614bd6565b600082019050919050565b60006140bf602383614513565b91506140ca82614bd9565b604082019050919050565b60006140e2601f83614513565b91506140ed82614c28565b602082019050919050565b6000614105601b83614513565b915061411082614c51565b602082019050919050565b614124816146b8565b82525050565b60006141368284613d94565b60148201915081905092915050565b60006141518286613e3b565b915061415d8285613e3b565b91506141698284613e6c565b9150819050949350505050565b60006141818261408f565b9150819050919050565b60006020820190506141a06000830184613d85565b92915050565b60006080820190506141bb6000830187613d85565b6141c86020830186613d85565b6141d5604083018561411b565b81810360608301526141e78184613dc9565b905095945050505050565b60006020820190506142076000830184613dab565b92915050565b60006020820190506142226000830184613dba565b92915050565b600060208201905081810360008301526142428184613e02565b905092915050565b6000602082019050818103600083015261426381613eeb565b9050919050565b6000602082019050818103600083015261428381613f0e565b9050919050565b600060208201905081810360008301526142a381613f31565b9050919050565b600060208201905081810360008301526142c381613f54565b9050919050565b600060208201905081810360008301526142e381613f77565b9050919050565b6000602082019050818103600083015261430381613f9a565b9050919050565b6000602082019050818103600083015261432381613fbd565b9050919050565b6000602082019050818103600083015261434381613fe0565b9050919050565b6000602082019050818103600083015261436381614003565b9050919050565b6000602082019050818103600083015261438381614026565b9050919050565b600060208201905081810360008301526143a381614049565b9050919050565b600060208201905081810360008301526143c38161406c565b9050919050565b600060208201905081810360008301526143e3816140b2565b9050919050565b60006020820190508181036000830152614403816140d5565b9050919050565b60006020820190508181036000830152614423816140f8565b9050919050565b600060208201905061443f600083018461411b565b92915050565b600061444f614460565b905061445b8282614736565b919050565b6000604051905090565b600067ffffffffffffffff821115614485576144846148c1565b5b61448e8261490e565b9050602081019050919050565b600067ffffffffffffffff8211156144b6576144b56148c1565b5b6144bf8261490e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061453a826146b8565b9150614545836146b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561457a57614579614805565b5b828201905092915050565b6000614590826146b8565b915061459b836146b8565b9250826145ab576145aa614834565b5b828204905092915050565b60006145c1826146b8565b91506145cc836146b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561460557614604614805565b5b828202905092915050565b600061461b826146b8565b9150614626836146b8565b92508282101561463957614638614805565b5b828203905092915050565b600061464f82614698565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156146ef5780820151818401526020810190506146d4565b838111156146fe576000848401525b50505050565b6000600282049050600182168061471c57607f821691505b602082108114156147305761472f614863565b5b50919050565b61473f8261490e565b810181811067ffffffffffffffff8211171561475e5761475d6148c1565b5b80604052505050565b6000614772826146b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147a5576147a4614805565b5b600182019050919050565b60006147bb826147c2565b9050919050565b60006147cd8261491f565b9050919050565b60006147df826146b8565b91506147ea836146b8565b9250826147fa576147f9614834565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f534f465445453a20596f7520617265206e6f742057686974656c697374656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f534f465445453a2057686974656c697374204d6178537570706c79206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f534f465445453a206d6178206d696e7420616d6f756e7420706572207478206560008201527f7863656564656400000000000000000000000000000000000000000000000000602082015250565b7f534f465445453a20576520536f6c646f75740000000000000000000000000000600082015250565b7f534f465445453a206d6178206d696e7420706572205478206578636565646564600082015250565b7f534f465445453a206e65656420746f206d696e74206174206c6561737420312060008201527f4e46540000000000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f534f465445453a206f6f707320636f6e74726163742069732070617573656400600082015250565b7f534f465445453a20696e73756666696369656e742066756e6473000000000000600082015250565b50565b7f534f465445453a204d6178204e4654205065722057616c6c657420657863656560008201527f6465640000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b614c8381614644565b8114614c8e57600080fd5b50565b614c9a81614656565b8114614ca557600080fd5b50565b614cb181614662565b8114614cbc57600080fd5b50565b614cc88161466c565b8114614cd357600080fd5b50565b614cdf816146b8565b8114614cea57600080fd5b5056fea26469706673582212205ed136e85a71b6585b87b0f0bbe1cbea6d9ab116d6787d797bf58f38fbe90af564736f6c63430008070033697066733a2f2f516d506d68554a68674265726a4a4e6e787a324a3658663678354a57526e6a7471784e547034617271723743787a2f686964652e6a736f6e697066733a2f2f516d56717757385759786956475935646259566e5051704c464b63647270466971344374463845796b7a516a37562f

Deployed Bytecode

0x60806040526004361061027c5760003560e01c80636c2d3c4f1161014f578063bd7a1998116100c1578063dc33e6811161007a578063dc33e68114610922578063e268e4d31461095f578063e985e9c514610988578063f12f6d5d146109c5578063f2c4ce1e146109ee578063f2fde38b14610a175761027c565b8063bd7a199814610812578063bde0608a1461083d578063c668286214610866578063c87b56dd14610891578063d5abeb01146108ce578063da3ef23f146108f95761027c565b80638da5cb5b116101135780638da5cb5b14610725578063940cd05b1461075057806395d89b4114610779578063a0712d68146107a4578063a22cb465146107c0578063b88d4fde146107e95761027c565b80636c2d3c4f1461065457806370a082311461067f578063715018a6146106bc5780637cb64759146106d357806383a076be146106fc5761027c565b806318160ddd116101f3578063458c4f9e116101ac578063458c4f9e14610544578063518302271461056d57806355f804b3146105985780635c975abb146105c15780636352211e146105ec5780636c0360eb146106295761027c565b806318160ddd1461046957806323b872dd146104945780632eb4a7ab146104bd5780633ccfd60b146104e857806342842e0e146104f257806344a0d68a1461051b5761027c565b8063081812fc11610245578063081812fc14610359578063081c8c4414610396578063095ea7b3146103c15780630bddb613146103ea57806313faede614610415578063149835a0146104405761027c565b806277ec051461028157806301ffc9a7146102ac57806302329a29146102e9578063036e4cb51461031257806306fdde031461032e575b600080fd5b34801561028d57600080fd5b50610296610a40565b6040516102a3919061442a565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613c15565b610a46565b6040516102e091906141f2565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613bbb565b610b28565b005b61032c60048036038101906103279190613d25565b610bc1565b005b34801561033a57600080fd5b50610343610ec4565b6040516103509190614228565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190613cb8565b610f56565b60405161038d919061418b565b60405180910390f35b3480156103a257600080fd5b506103ab610fd2565b6040516103b89190614228565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613b7b565b611060565b005b3480156103f657600080fd5b506103ff61116b565b60405161040c919061442a565b60405180910390f35b34801561042157600080fd5b5061042a611171565b604051610437919061442a565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613cb8565b611177565b005b34801561047557600080fd5b5061047e6111fd565b60405161048b919061442a565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613a65565b611214565b005b3480156104c957600080fd5b506104d2611224565b6040516104df919061420d565b60405180910390f35b6104f061122a565b005b3480156104fe57600080fd5b5061051960048036038101906105149190613a65565b611375565b005b34801561052757600080fd5b50610542600480360381019061053d9190613cb8565b611395565b005b34801561055057600080fd5b5061056b60048036038101906105669190613cb8565b61141b565b005b34801561057957600080fd5b506105826114a1565b60405161058f91906141f2565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba9190613c6f565b6114b4565b005b3480156105cd57600080fd5b506105d661154a565b6040516105e391906141f2565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190613cb8565b61155d565b604051610620919061418b565b60405180910390f35b34801561063557600080fd5b5061063e611573565b60405161064b9190614228565b60405180910390f35b34801561066057600080fd5b50610669611601565b604051610676919061442a565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a191906139f8565b611607565b6040516106b3919061442a565b60405180910390f35b3480156106c857600080fd5b506106d16116d7565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190613be8565b61175f565b005b34801561070857600080fd5b50610723600480360381019061071e9190613ce5565b6117e5565b005b34801561073157600080fd5b5061073a611965565b604051610747919061418b565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190613bbb565b61198f565b005b34801561078557600080fd5b5061078e611a28565b60405161079b9190614228565b60405180910390f35b6107be60048036038101906107b99190613cb8565b611aba565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613b3b565b611d08565b005b3480156107f557600080fd5b50610810600480360381019061080b9190613ab8565b611e80565b005b34801561081e57600080fd5b50610827611efc565b604051610834919061442a565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f9190613cb8565b611f02565b005b34801561087257600080fd5b5061087b611f88565b6040516108889190614228565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b39190613cb8565b612016565b6040516108c59190614228565b60405180910390f35b3480156108da57600080fd5b506108e361216f565b6040516108f0919061442a565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190613c6f565b612175565b005b34801561092e57600080fd5b50610949600480360381019061094491906139f8565b61220b565b604051610956919061442a565b60405180910390f35b34801561096b57600080fd5b5061098660048036038101906109819190613cb8565b61221d565b005b34801561099457600080fd5b506109af60048036038101906109aa9190613a25565b6122a3565b6040516109bc91906141f2565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190613cb8565b612337565b005b3480156109fa57600080fd5b50610a156004803603810190610a109190613c6f565b6123bd565b005b348015610a2357600080fd5b50610a3e6004803603810190610a3991906139f8565b612453565b005b60125481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b1157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b215750610b208261254b565b5b9050919050565b610b306125b5565b73ffffffffffffffffffffffffffffffffffffffff16610b4e611965565b73ffffffffffffffffffffffffffffffffffffffff1614610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b9061436a565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b60026009541415610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe906143ea565b60405180910390fd5b6002600981905550601360009054906101000a900460ff1615610c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c569061438a565b60405180910390fd5b610cd3828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060145433604051602001610cb8919061412a565b604051602081830303815290604052805190602001206125bd565b610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d099061426a565b60405180910390fd5b6000610d1c6111fd565b905060125484610d32610d2d6125b5565b6125d4565b610d3c919061452f565b1115610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d74906143ca565b60405180910390fd5b60008411610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db79061432a565b60405180910390fd5b601254841115610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc9061430a565b60405180910390fd5b6010548482610e14919061452f565b1115610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c906142aa565b60405180910390fd5b83600e54610e6391906145b6565b341015610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c906143aa565b60405180910390fd5b610eb6610eb06125b5565b8561263e565b506001600981905550505050565b606060028054610ed390614704565b80601f0160208091040260200160405190810160405280929190818152602001828054610eff90614704565b8015610f4c5780601f10610f2157610100808354040283529160200191610f4c565b820191906000526020600020905b815481529060010190602001808311610f2f57829003601f168201915b5050505050905090565b6000610f618261265c565b610f97576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610fdf90614704565b80601f016020809104026020016040519081016040528092919081815260200182805461100b90614704565b80156110585780601f1061102d57610100808354040283529160200191611058565b820191906000526020600020905b81548152906001019060200180831161103b57829003601f168201915b505050505081565b600061106b8261155d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110d3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110f26125b5565b73ffffffffffffffffffffffffffffffffffffffff161415801561112457506111228161111d6125b5565b6122a3565b155b1561115b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111668383836126aa565b505050565b60105481565b600d5481565b61117f6125b5565b73ffffffffffffffffffffffffffffffffffffffff1661119d611965565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061436a565b60405180910390fd5b80600f8190555050565b600061120761275c565b6001546000540303905090565b61121f838383612765565b505050565b60145481565b6112326125b5565b73ffffffffffffffffffffffffffffffffffffffff16611250611965565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d9061436a565b60405180910390fd5b600260095414156112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e3906143ea565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161131a90614176565b60006040518083038185875af1925050503d8060008114611357576040519150601f19603f3d011682016040523d82523d6000602084013e61135c565b606091505b505090508061136a57600080fd5b506001600981905550565b61139083838360405180602001604052806000815250611e80565b505050565b61139d6125b5565b73ffffffffffffffffffffffffffffffffffffffff166113bb611965565b73ffffffffffffffffffffffffffffffffffffffff1614611411576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114089061436a565b60405180910390fd5b80600d8190555050565b6114236125b5565b73ffffffffffffffffffffffffffffffffffffffff16611441611965565b73ffffffffffffffffffffffffffffffffffffffff1614611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e9061436a565b60405180910390fd5b8060108190555050565b601360019054906101000a900460ff1681565b6114bc6125b5565b73ffffffffffffffffffffffffffffffffffffffff166114da611965565b73ffffffffffffffffffffffffffffffffffffffff1614611530576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115279061436a565b60405180910390fd5b80600a908051906020019061154692919061375e565b5050565b601360009054906101000a900460ff1681565b600061156882612c1b565b600001519050919050565b600a805461158090614704565b80601f01602080910402602001604051908101604052809291908181526020018280546115ac90614704565b80156115f95780601f106115ce576101008083540402835291602001916115f9565b820191906000526020600020905b8154815290600101906020018083116115dc57829003601f168201915b505050505081565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561166f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116df6125b5565b73ffffffffffffffffffffffffffffffffffffffff166116fd611965565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a9061436a565b60405180910390fd5b61175d6000612eaa565b565b6117676125b5565b73ffffffffffffffffffffffffffffffffffffffff16611785611965565b73ffffffffffffffffffffffffffffffffffffffff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d29061436a565b60405180910390fd5b8060148190555050565b6117ed6125b5565b73ffffffffffffffffffffffffffffffffffffffff1661180b611965565b73ffffffffffffffffffffffffffffffffffffffff1614611861576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118589061436a565b60405180910390fd5b600260095414156118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e906143ea565b60405180910390fd5b6002600981905550600082116118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e99061440a565b60405180910390fd5b60006118fc6111fd565b9050600f54838261190d919061452f565b111561194e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119459061434a565b60405180910390fd5b611958828461263e565b5060016009819055505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119976125b5565b73ffffffffffffffffffffffffffffffffffffffff166119b5611965565b73ffffffffffffffffffffffffffffffffffffffff1614611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a029061436a565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b606060038054611a3790614704565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6390614704565b8015611ab05780601f10611a8557610100808354040283529160200191611ab0565b820191906000526020600020905b815481529060010190602001808311611a9357829003601f168201915b5050505050905090565b60026009541415611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af7906143ea565b60405180910390fd5b6002600981905550601360009054906101000a900460ff1615611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f9061438a565b60405180910390fd5b6000611b626111fd565b905060008211611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e9061432a565b60405180910390fd5b601154821115611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906142ca565b60405180910390fd5b600f548282611bfb919061452f565b1115611c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c33906142ea565b60405180910390fd5b60115482611c50611c4b6125b5565b6125d4565b611c5a919061452f565b1115611c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c92906143ca565b60405180910390fd5b81600d54611ca991906145b6565b341015611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce2906143aa565b60405180910390fd5b611cfc611cf66125b5565b8361263e565b50600160098190555050565b611d106125b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d75576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d826125b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e2f6125b5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e7491906141f2565b60405180910390a35050565b611e8b848484612765565b611eaa8373ffffffffffffffffffffffffffffffffffffffff16612f70565b8015611ebf5750611ebd84848484612f93565b155b15611ef6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60115481565b611f0a6125b5565b73ffffffffffffffffffffffffffffffffffffffff16611f28611965565b73ffffffffffffffffffffffffffffffffffffffff1614611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f759061436a565b60405180910390fd5b8060128190555050565b600b8054611f9590614704565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc190614704565b801561200e5780601f10611fe35761010080835404028352916020019161200e565b820191906000526020600020905b815481529060010190602001808311611ff157829003601f168201915b505050505081565b60606120218261265c565b612060576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120579061424a565b60405180910390fd5b60001515601360019054906101000a900460ff161515141561210e57600c805461208990614704565b80601f01602080910402602001604051908101604052809291908181526020018280546120b590614704565b80156121025780601f106120d757610100808354040283529160200191612102565b820191906000526020600020905b8154815290600101906020018083116120e557829003601f168201915b5050505050905061216a565b60006121186130f3565b905060008151116121385760405180602001604052806000815250612166565b8061214284613185565b600b60405160200161215693929190614145565b6040516020818303038152906040525b9150505b919050565b600f5481565b61217d6125b5565b73ffffffffffffffffffffffffffffffffffffffff1661219b611965565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e89061436a565b60405180910390fd5b80600b908051906020019061220792919061375e565b5050565b6000612216826125d4565b9050919050565b6122256125b5565b73ffffffffffffffffffffffffffffffffffffffff16612243611965565b73ffffffffffffffffffffffffffffffffffffffff1614612299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122909061436a565b60405180910390fd5b8060118190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61233f6125b5565b73ffffffffffffffffffffffffffffffffffffffff1661235d611965565b73ffffffffffffffffffffffffffffffffffffffff16146123b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123aa9061436a565b60405180910390fd5b80600e8190555050565b6123c56125b5565b73ffffffffffffffffffffffffffffffffffffffff166123e3611965565b73ffffffffffffffffffffffffffffffffffffffff1614612439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124309061436a565b60405180910390fd5b80600c908051906020019061244f92919061375e565b5050565b61245b6125b5565b73ffffffffffffffffffffffffffffffffffffffff16612479611965565b73ffffffffffffffffffffffffffffffffffffffff16146124cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c69061436a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561253f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125369061428a565b60405180910390fd5b61254881612eaa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000826125ca85846132e6565b1490509392505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61265882826040518060200160405280600081525061335b565b5050565b60008161266761275c565b11158015612676575060005482105b80156126a3575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061277082612c1b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127db576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127fc6125b5565b73ffffffffffffffffffffffffffffffffffffffff16148061282b575061282a856128256125b5565b6122a3565b5b8061287057506128396125b5565b73ffffffffffffffffffffffffffffffffffffffff1661285884610f56565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128a9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612910576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61291d858585600161336d565b612929600084876126aa565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ba9576000548214612ba857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c148585856001613373565b5050505050565b612c236137e4565b600082905080612c3161275c565b11158015612c40575060005481105b15612e73576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e7157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d55578092505050612ea5565b5b600115612e7057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e6b578092505050612ea5565b612d56565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fb96125b5565b8786866040518563ffffffff1660e01b8152600401612fdb94939291906141a6565b602060405180830381600087803b158015612ff557600080fd5b505af192505050801561302657506040513d601f19601f820116820180604052508101906130239190613c42565b60015b6130a0573d8060008114613056576040519150601f19603f3d011682016040523d82523d6000602084013e61305b565b606091505b50600081511415613098576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461310290614704565b80601f016020809104026020016040519081016040528092919081815260200182805461312e90614704565b801561317b5780601f106131505761010080835404028352916020019161317b565b820191906000526020600020905b81548152906001019060200180831161315e57829003601f168201915b5050505050905090565b606060008214156131cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132e1565b600082905060005b600082146131ff5780806131e890614767565b915050600a826131f89190614585565b91506131d5565b60008167ffffffffffffffff81111561321b5761321a6148c1565b5b6040519080825280601f01601f19166020018201604052801561324d5781602001600182028036833780820191505090505b5090505b600085146132da576001826132669190614610565b9150600a8561327591906147d4565b6030613281919061452f565b60f81b81838151811061329757613296614892565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132d39190614585565b9450613251565b8093505050505b919050565b60008082905060005b845181101561335057600085828151811061330d5761330c614892565b5b6020026020010151905080831161332f576133288382613379565b925061333c565b6133398184613379565b92505b50808061334890614767565b9150506132ef565b508091505092915050565b6133688383836001613390565b505050565b50505050565b50505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133fd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613438576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613445600086838761336d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561360f575061360e8773ffffffffffffffffffffffffffffffffffffffff16612f70565b5b156136d5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136846000888480600101955088612f93565b6136ba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156136155782600054146136d057600080fd5b613741565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156136d6575b8160008190555050506137576000868387613373565b5050505050565b82805461376a90614704565b90600052602060002090601f01602090048101928261378c57600085556137d3565b82601f106137a557805160ff19168380011785556137d3565b828001600101855582156137d3579182015b828111156137d25782518255916020019190600101906137b7565b5b5090506137e09190613827565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613840576000816000905550600101613828565b5090565b60006138576138528461446a565b614445565b905082815260208101848484011115613873576138726148ff565b5b61387e8482856146c2565b509392505050565b60006138996138948461449b565b614445565b9050828152602081018484840111156138b5576138b46148ff565b5b6138c08482856146c2565b509392505050565b6000813590506138d781614c7a565b92915050565b60008083601f8401126138f3576138f26148f5565b5b8235905067ffffffffffffffff8111156139105761390f6148f0565b5b60208301915083602082028301111561392c5761392b6148fa565b5b9250929050565b60008135905061394281614c91565b92915050565b60008135905061395781614ca8565b92915050565b60008135905061396c81614cbf565b92915050565b60008151905061398181614cbf565b92915050565b600082601f83011261399c5761399b6148f5565b5b81356139ac848260208601613844565b91505092915050565b600082601f8301126139ca576139c96148f5565b5b81356139da848260208601613886565b91505092915050565b6000813590506139f281614cd6565b92915050565b600060208284031215613a0e57613a0d614909565b5b6000613a1c848285016138c8565b91505092915050565b60008060408385031215613a3c57613a3b614909565b5b6000613a4a858286016138c8565b9250506020613a5b858286016138c8565b9150509250929050565b600080600060608486031215613a7e57613a7d614909565b5b6000613a8c868287016138c8565b9350506020613a9d868287016138c8565b9250506040613aae868287016139e3565b9150509250925092565b60008060008060808587031215613ad257613ad1614909565b5b6000613ae0878288016138c8565b9450506020613af1878288016138c8565b9350506040613b02878288016139e3565b925050606085013567ffffffffffffffff811115613b2357613b22614904565b5b613b2f87828801613987565b91505092959194509250565b60008060408385031215613b5257613b51614909565b5b6000613b60858286016138c8565b9250506020613b7185828601613933565b9150509250929050565b60008060408385031215613b9257613b91614909565b5b6000613ba0858286016138c8565b9250506020613bb1858286016139e3565b9150509250929050565b600060208284031215613bd157613bd0614909565b5b6000613bdf84828501613933565b91505092915050565b600060208284031215613bfe57613bfd614909565b5b6000613c0c84828501613948565b91505092915050565b600060208284031215613c2b57613c2a614909565b5b6000613c398482850161395d565b91505092915050565b600060208284031215613c5857613c57614909565b5b6000613c6684828501613972565b91505092915050565b600060208284031215613c8557613c84614909565b5b600082013567ffffffffffffffff811115613ca357613ca2614904565b5b613caf848285016139b5565b91505092915050565b600060208284031215613cce57613ccd614909565b5b6000613cdc848285016139e3565b91505092915050565b60008060408385031215613cfc57613cfb614909565b5b6000613d0a858286016139e3565b9250506020613d1b858286016138c8565b9150509250929050565b600080600060408486031215613d3e57613d3d614909565b5b6000613d4c868287016139e3565b935050602084013567ffffffffffffffff811115613d6d57613d6c614904565b5b613d79868287016138dd565b92509250509250925092565b613d8e81614644565b82525050565b613da5613da082614644565b6147b0565b82525050565b613db481614656565b82525050565b613dc381614662565b82525050565b6000613dd4826144e1565b613dde81856144f7565b9350613dee8185602086016146d1565b613df78161490e565b840191505092915050565b6000613e0d826144ec565b613e178185614513565b9350613e278185602086016146d1565b613e308161490e565b840191505092915050565b6000613e46826144ec565b613e508185614524565b9350613e608185602086016146d1565b80840191505092915050565b60008154613e7981614704565b613e838186614524565b94506001821660008114613e9e5760018114613eaf57613ee2565b60ff19831686528186019350613ee2565b613eb8856144cc565b60005b83811015613eda57815481890152600182019150602081019050613ebb565b838801955050505b50505092915050565b6000613ef8603083614513565b9150613f038261492c565b604082019050919050565b6000613f1b601f83614513565b9150613f268261497b565b602082019050919050565b6000613f3e602683614513565b9150613f49826149a4565b604082019050919050565b6000613f61602483614513565b9150613f6c826149f3565b604082019050919050565b6000613f84602783614513565b9150613f8f82614a42565b604082019050919050565b6000613fa7601283614513565b9150613fb282614a91565b602082019050919050565b6000613fca602083614513565b9150613fd582614aba565b602082019050919050565b6000613fed602383614513565b9150613ff882614ae3565b604082019050919050565b6000614010601683614513565b915061401b82614b32565b602082019050919050565b6000614033602083614513565b915061403e82614b5b565b602082019050919050565b6000614056601f83614513565b915061406182614b84565b602082019050919050565b6000614079601a83614513565b915061408482614bad565b602082019050919050565b600061409c600083614508565b91506140a782614bd6565b600082019050919050565b60006140bf602383614513565b91506140ca82614bd9565b604082019050919050565b60006140e2601f83614513565b91506140ed82614c28565b602082019050919050565b6000614105601b83614513565b915061411082614c51565b602082019050919050565b614124816146b8565b82525050565b60006141368284613d94565b60148201915081905092915050565b60006141518286613e3b565b915061415d8285613e3b565b91506141698284613e6c565b9150819050949350505050565b60006141818261408f565b9150819050919050565b60006020820190506141a06000830184613d85565b92915050565b60006080820190506141bb6000830187613d85565b6141c86020830186613d85565b6141d5604083018561411b565b81810360608301526141e78184613dc9565b905095945050505050565b60006020820190506142076000830184613dab565b92915050565b60006020820190506142226000830184613dba565b92915050565b600060208201905081810360008301526142428184613e02565b905092915050565b6000602082019050818103600083015261426381613eeb565b9050919050565b6000602082019050818103600083015261428381613f0e565b9050919050565b600060208201905081810360008301526142a381613f31565b9050919050565b600060208201905081810360008301526142c381613f54565b9050919050565b600060208201905081810360008301526142e381613f77565b9050919050565b6000602082019050818103600083015261430381613f9a565b9050919050565b6000602082019050818103600083015261432381613fbd565b9050919050565b6000602082019050818103600083015261434381613fe0565b9050919050565b6000602082019050818103600083015261436381614003565b9050919050565b6000602082019050818103600083015261438381614026565b9050919050565b600060208201905081810360008301526143a381614049565b9050919050565b600060208201905081810360008301526143c38161406c565b9050919050565b600060208201905081810360008301526143e3816140b2565b9050919050565b60006020820190508181036000830152614403816140d5565b9050919050565b60006020820190508181036000830152614423816140f8565b9050919050565b600060208201905061443f600083018461411b565b92915050565b600061444f614460565b905061445b8282614736565b919050565b6000604051905090565b600067ffffffffffffffff821115614485576144846148c1565b5b61448e8261490e565b9050602081019050919050565b600067ffffffffffffffff8211156144b6576144b56148c1565b5b6144bf8261490e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061453a826146b8565b9150614545836146b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561457a57614579614805565b5b828201905092915050565b6000614590826146b8565b915061459b836146b8565b9250826145ab576145aa614834565b5b828204905092915050565b60006145c1826146b8565b91506145cc836146b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561460557614604614805565b5b828202905092915050565b600061461b826146b8565b9150614626836146b8565b92508282101561463957614638614805565b5b828203905092915050565b600061464f82614698565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156146ef5780820151818401526020810190506146d4565b838111156146fe576000848401525b50505050565b6000600282049050600182168061471c57607f821691505b602082108114156147305761472f614863565b5b50919050565b61473f8261490e565b810181811067ffffffffffffffff8211171561475e5761475d6148c1565b5b80604052505050565b6000614772826146b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147a5576147a4614805565b5b600182019050919050565b60006147bb826147c2565b9050919050565b60006147cd8261491f565b9050919050565b60006147df826146b8565b91506147ea836146b8565b9250826147fa576147f9614834565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f534f465445453a20596f7520617265206e6f742057686974656c697374656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f534f465445453a2057686974656c697374204d6178537570706c79206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f534f465445453a206d6178206d696e7420616d6f756e7420706572207478206560008201527f7863656564656400000000000000000000000000000000000000000000000000602082015250565b7f534f465445453a20576520536f6c646f75740000000000000000000000000000600082015250565b7f534f465445453a206d6178206d696e7420706572205478206578636565646564600082015250565b7f534f465445453a206e65656420746f206d696e74206174206c6561737420312060008201527f4e46540000000000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f534f465445453a206f6f707320636f6e74726163742069732070617573656400600082015250565b7f534f465445453a20696e73756666696369656e742066756e6473000000000000600082015250565b50565b7f534f465445453a204d6178204e4654205065722057616c6c657420657863656560008201527f6465640000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b614c8381614644565b8114614c8e57600080fd5b50565b614c9a81614656565b8114614ca557600080fd5b50565b614cb181614662565b8114614cbc57600080fd5b50565b614cc88161466c565b8114614cd357600080fd5b50565b614cdf816146b8565b8114614cea57600080fd5b5056fea26469706673582212205ed136e85a71b6585b87b0f0bbe1cbea6d9ab116d6787d797bf58f38fbe90af564736f6c63430008070033

Deployed Bytecode Sourcemap

50057:4843:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50432:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32157:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54646:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51676:788;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35270:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36773:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50215:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36336:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50360:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50248:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54086:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31406:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37638:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50535:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54726:171;;;:::i;:::-;;37879:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53902:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54188:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50502:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54286:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50471:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35078:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50147:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50285:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32526:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9915:103;;;;;;;;;;;;;:::i;:::-;;53584:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52533:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9264:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53500:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35439:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51033:598;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37049:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38135:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50395:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53798:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50173:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52865:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50324:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54390:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53371:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53698:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37407:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53990:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54520:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10173:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50432:34;;;;:::o;32157:305::-;32259:4;32311:25;32296:40;;;:11;:40;;;;:105;;;;32368:33;32353:48;;;:11;:48;;;;32296:105;:158;;;;32418:36;32442:11;32418:23;:36::i;:::-;32296:158;32276:178;;32157:305;;;:::o;54646:73::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54707:6:::1;54698;;:15;;;;;;;;;;;;;;;;;;54646:73:::0;:::o;51676:788::-;4238:1;4836:7;;:19;;4828:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4238:1;4969:7;:18;;;;51789:6:::1;;;;;;;;;;;51788:7;51780:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51846:84;51865:11;;51846:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51878:10;;51917;51900:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51890:39;;;;;;51846:18;:84::i;:::-;51838:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;51973:14;51990:13;:11;:13::i;:::-;51973:30;;52058:14;;52048:6;52018:27;52032:12;:10;:12::i;:::-;52018:13;:27::i;:::-;:36;;;;:::i;:::-;:54;;52010:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;52136:1;52127:6;:10;52119:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52202:14;;52192:6;:24;;52184:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52287:8;;52277:6;52268;:15;;;;:::i;:::-;:27;;52260:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52373:6;52364;;:15;;;;:::i;:::-;52351:9;:28;;52343:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52421:31;52431:12;:10;:12::i;:::-;52445:6;52421:9;:31::i;:::-;51773:691;4194:1:::0;5148:7;:22;;;;51676:788;;;:::o;35270:100::-;35324:13;35357:5;35350:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35270:100;:::o;36773:204::-;36841:7;36866:16;36874:7;36866;:16::i;:::-;36861:64;;36891:34;;;;;;;;;;;;;;36861:64;36945:15;:24;36961:7;36945:24;;;;;;;;;;;;;;;;;;;;;36938:31;;36773:204;;;:::o;50215:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36336:371::-;36409:13;36425:24;36441:7;36425:15;:24::i;:::-;36409:40;;36470:5;36464:11;;:2;:11;;;36460:48;;;36484:24;;;;;;;;;;;;;;36460:48;36541:5;36525:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36551:37;36568:5;36575:12;:10;:12::i;:::-;36551:16;:37::i;:::-;36550:38;36525:63;36521:138;;;36612:35;;;;;;;;;;;;;;36521:138;36671:28;36680:2;36684:7;36693:5;36671:8;:28::i;:::-;36398:309;36336:371;;:::o;50360:30::-;;;;:::o;50248:32::-;;;;:::o;54086:94::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54164:10:::1;54152:9;:22;;;;54086:94:::0;:::o;31406:303::-;31450:7;31675:15;:13;:15::i;:::-;31660:12;;31644:13;;:28;:46;31637:53;;31406:303;:::o;37638:170::-;37772:28;37782:4;37788:2;37792:7;37772:9;:28::i;:::-;37638:170;;;:::o;50535:25::-;;;;:::o;54726:171::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4238:1:::1;4836:7;;:19;;4828:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4238:1;4969:7;:18;;;;54792:12:::2;54818:10;54810:24;;54842:21;54810:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54791:77;;;54883:7;54875:16;;;::::0;::::2;;54784:113;4194:1:::1;5148:7;:22;;;;54726:171::o:0;37879:185::-;38017:39;38034:4;38040:2;38044:7;38017:39;;;;;;;;;;;;:16;:39::i;:::-;37879:185;;;:::o;53902:80::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53968:8:::1;53961:4;:15;;;;53902:80:::0;:::o;54188:92::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54264:10:::1;54253:8;:21;;;;54188:92:::0;:::o;50502:28::-;;;;;;;;;;;;;:::o;54286:98::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54367:11:::1;54357:7;:21;;;;;;;;;;;;:::i;:::-;;54286:98:::0;:::o;50471:26::-;;;;;;;;;;;;;:::o;35078:125::-;35142:7;35169:21;35182:7;35169:12;:21::i;:::-;:26;;;35162:33;;35078:125;;;:::o;50147:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50285:34::-;;;;:::o;32526:206::-;32590:7;32631:1;32614:19;;:5;:19;;;32610:60;;;32642:28;;;;;;;;;;;;;;32610:60;32696:12;:19;32709:5;32696:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32688:36;;32681:43;;32526:206;;;:::o;9915:103::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9980:30:::1;10007:1;9980:18;:30::i;:::-;9915:103::o:0;53584:106::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53671:11:::1;53658:10;:24;;;;53584:106:::0;:::o;52533:318::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4238:1:::1;4836:7;;:19;;4828:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4238:1;4969:7;:18;;;;52648:1:::2;52634:11;:15;52626:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52688:14;52705:13;:11;:13::i;:::-;52688:30;;52757:9;;52742:11;52733:6;:20;;;;:::i;:::-;:33;;52725:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52804:35;52814:11;52827;52804:9;:35::i;:::-;52619:232;4194:1:::1;5148:7;:22;;;;52533:318:::0;;:::o;9264:87::-;9310:7;9337:6;;;;;;;;;;;9330:13;;9264:87;:::o;53500:78::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53566:6:::1;53555:8;;:17;;;;;;;;;;;;;;;;;;53500:78:::0;:::o;35439:104::-;35495:13;35528:7;35521:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35439:104;:::o;51033:598::-;4238:1;4836:7;;:19;;4828:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4238:1;4969:7;:18;;;;51107:6:::1;;;;;;;;;;;51106:7;51098:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51156:14;51173:13;:11;:13::i;:::-;51156:30;;51210:1;51201:6;:10;51193:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51276:12;;51266:6;:22;;51258:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51366:9;;51356:6;51347;:15;;;;:::i;:::-;:28;;51339:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51453:12;;51443:6;51413:27;51427:12;:10;:12::i;:::-;51413:13;:27::i;:::-;:36;;;;:::i;:::-;:52;;51405:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;51540:6;51533:4;;:13;;;;:::i;:::-;51520:9;:26;;51512:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51588:31;51598:12;:10;:12::i;:::-;51612:6;51588:9;:31::i;:::-;51091:540;4194:1:::0;5148:7;:22;;;;51033:598;:::o;37049:287::-;37160:12;:10;:12::i;:::-;37148:24;;:8;:24;;;37144:54;;;37181:17;;;;;;;;;;;;;;37144:54;37256:8;37211:18;:32;37230:12;:10;:12::i;:::-;37211:32;;;;;;;;;;;;;;;:42;37244:8;37211:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37309:8;37280:48;;37295:12;:10;:12::i;:::-;37280:48;;;37319:8;37280:48;;;;;;:::i;:::-;;;;;;;;37049:287;;:::o;38135:369::-;38302:28;38312:4;38318:2;38322:7;38302:9;:28::i;:::-;38345:15;:2;:13;;;:15::i;:::-;:76;;;;;38365:56;38396:4;38402:2;38406:7;38415:5;38365:30;:56::i;:::-;38364:57;38345:76;38341:156;;;38445:40;;;;;;;;;;;;;;38341:156;38135:369;;;;:::o;50395:32::-;;;;:::o;53798:96::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53882:6:::1;53865:14;:23;;;;53798:96:::0;:::o;50173:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52865:498::-;52963:13;53004:16;53012:7;53004;:16::i;:::-;52988:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;53114:5;53102:17;;:8;;;;;;;;;;;:17;;;53099:62;;;53139:14;53132:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53099:62;53169:28;53200:10;:8;:10::i;:::-;53169:41;;53255:1;53230:14;53224:28;:32;:133;;;;;;;;;;;;;;;;;53292:14;53308:18;:7;:16;:18::i;:::-;53328:13;53275:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53224:133;53217:140;;;52865:498;;;;:::o;50324:31::-;;;;:::o;54390:122::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54489:17:::1;54473:13;:33;;;;;;;;;;;;:::i;:::-;;54390:122:::0;:::o;53371:107::-;53429:7;53452:20;53466:5;53452:13;:20::i;:::-;53445:27;;53371:107;;;:::o;53698:92::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53778:6:::1;53763:12;:21;;;;53698:92:::0;:::o;37407:164::-;37504:4;37528:18;:25;37547:5;37528:25;;;;;;;;;;;;;;;:35;37554:8;37528:35;;;;;;;;;;;;;;;;;;;;;;;;;37521:42;;37407:164;;;;:::o;53990:88::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54062:10:::1;54053:6;:19;;;;53990:88:::0;:::o;54520:120::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54619:15:::1;54602:14;:32;;;;;;;;;;;;:::i;:::-;;54520:120:::0;:::o;10173:201::-;9495:12;:10;:12::i;:::-;9484:23;;:7;:5;:7::i;:::-;:23;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10282:1:::1;10262:22;;:8;:22;;;;10254:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10338:28;10357:8;10338:18;:28::i;:::-;10173:201:::0;:::o;22048:157::-;22133:4;22172:25;22157:40;;;:11;:40;;;;22150:47;;22048:157;;;:::o;7988:98::-;8041:7;8068:10;8061:17;;7988:98;:::o;960:190::-;1085:4;1138;1109:25;1122:5;1129:4;1109:12;:25::i;:::-;:33;1102:40;;960:190;;;;;:::o;32814:137::-;32875:7;32910:12;:19;32923:5;32910:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;32902:41;;32895:48;;32814:137;;;:::o;38954:104::-;39023:27;39033:2;39037:8;39023:27;;;;;;;;;;;;:9;:27::i;:::-;38954:104;;:::o;38759:187::-;38816:4;38859:7;38840:15;:13;:15::i;:::-;:26;;:53;;;;;38880:13;;38870:7;:23;38840:53;:98;;;;;38911:11;:20;38923:7;38911:20;;;;;;;;;;;:27;;;;;;;;;;;;38910:28;38840:98;38833:105;;38759:187;;;:::o;46929:196::-;47071:2;47044:15;:24;47060:7;47044:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47109:7;47105:2;47089:28;;47098:5;47089:28;;;;;;;;;;;;46929:196;;;:::o;50913:101::-;50978:7;51005:1;50998:8;;50913:101;:::o;41872:2130::-;41987:35;42025:21;42038:7;42025:12;:21::i;:::-;41987:59;;42085:4;42063:26;;:13;:18;;;:26;;;42059:67;;42098:28;;;;;;;;;;;;;;42059:67;42139:22;42181:4;42165:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;42202:36;42219:4;42225:12;:10;:12::i;:::-;42202:16;:36::i;:::-;42165:73;:126;;;;42279:12;:10;:12::i;:::-;42255:36;;:20;42267:7;42255:11;:20::i;:::-;:36;;;42165:126;42139:153;;42310:17;42305:66;;42336:35;;;;;;;;;;;;;;42305:66;42400:1;42386:16;;:2;:16;;;42382:52;;;42411:23;;;;;;;;;;;;;;42382:52;42447:43;42469:4;42475:2;42479:7;42488:1;42447:21;:43::i;:::-;42555:35;42572:1;42576:7;42585:4;42555:8;:35::i;:::-;42916:1;42886:12;:18;42899:4;42886:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42960:1;42932:12;:16;42945:2;42932:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42978:31;43012:11;:20;43024:7;43012:20;;;;;;;;;;;42978:54;;43063:2;43047:8;:13;;;:18;;;;;;;;;;;;;;;;;;43113:15;43080:8;:23;;;:49;;;;;;;;;;;;;;;;;;43381:19;43413:1;43403:7;:11;43381:33;;43429:31;43463:11;:24;43475:11;43463:24;;;;;;;;;;;43429:58;;43531:1;43506:27;;:8;:13;;;;;;;;;;;;:27;;;43502:384;;;43716:13;;43701:11;:28;43697:174;;43770:4;43754:8;:13;;;:20;;;;;;;;;;;;;;;;;;43823:13;:28;;;43797:8;:23;;;:54;;;;;;;;;;;;;;;;;;43697:174;43502:384;42861:1036;;;43933:7;43929:2;43914:27;;43923:4;43914:27;;;;;;;;;;;;43952:42;43973:4;43979:2;43983:7;43992:1;43952:20;:42::i;:::-;41976:2026;;41872:2130;;;:::o;33907:1109::-;33969:21;;:::i;:::-;34003:12;34018:7;34003:22;;34086:4;34067:15;:13;:15::i;:::-;:23;;:47;;;;;34101:13;;34094:4;:20;34067:47;34063:886;;;34135:31;34169:11;:17;34181:4;34169:17;;;;;;;;;;;34135:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34210:9;:16;;;34205:729;;34281:1;34255:28;;:9;:14;;;:28;;;34251:101;;34319:9;34312:16;;;;;;34251:101;34654:261;34661:4;34654:261;;;34694:6;;;;;;;;34739:11;:17;34751:4;34739:17;;;;;;;;;;;34727:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34813:1;34787:28;;:9;:14;;;:28;;;34783:109;;34855:9;34848:16;;;;;;34783:109;34654:261;;;34205:729;34116:833;34063:886;34977:31;;;;;;;;;;;;;;33907:1109;;;;:::o;10534:191::-;10608:16;10627:6;;;;;;;;;;;10608:25;;10653:8;10644:6;;:17;;;;;;;;;;;;;;;;;;10708:8;10677:40;;10698:8;10677:40;;;;;;;;;;;;10597:128;10534:191;:::o;11965:326::-;12025:4;12282:1;12260:7;:19;;;:23;12253:30;;11965:326;;;:::o;47617:667::-;47780:4;47817:2;47801:36;;;47838:12;:10;:12::i;:::-;47852:4;47858:7;47867:5;47801:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47797:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48052:1;48035:6;:13;:18;48031:235;;;48081:40;;;;;;;;;;;;;;48031:235;48224:6;48218:13;48209:6;48205:2;48201:15;48194:38;47797:480;47930:45;;;47920:55;;;:6;:55;;;;47913:62;;;47617:667;;;;;;:::o;50803:102::-;50863:13;50892:7;50885:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50803:102;:::o;5550:723::-;5606:13;5836:1;5827:5;:10;5823:53;;;5854:10;;;;;;;;;;;;;;;;;;;;;5823:53;5886:12;5901:5;5886:20;;5917:14;5942:78;5957:1;5949:4;:9;5942:78;;5975:8;;;;;:::i;:::-;;;;6006:2;5998:10;;;;;:::i;:::-;;;5942:78;;;6030:19;6062:6;6052:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6030:39;;6080:154;6096:1;6087:5;:10;6080:154;;6124:1;6114:11;;;;;:::i;:::-;;;6191:2;6183:5;:10;;;;:::i;:::-;6170:2;:24;;;;:::i;:::-;6157:39;;6140:6;6147;6140:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6220:2;6211:11;;;;;:::i;:::-;;;6080:154;;;6258:6;6244:21;;;;;5550:723;;;;:::o;1512:675::-;1595:7;1615:20;1638:4;1615:27;;1658:9;1653:497;1677:5;:12;1673:1;:16;1653:497;;;1711:20;1734:5;1740:1;1734:8;;;;;;;;:::i;:::-;;;;;;;;1711:31;;1777:12;1761;:28;1757:382;;1904:42;1919:12;1933;1904:14;:42::i;:::-;1889:57;;1757:382;;;2081:42;2096:12;2110;2081:14;:42::i;:::-;2066:57;;1757:382;1696:454;1691:3;;;;;:::i;:::-;;;;1653:497;;;;2167:12;2160:19;;;1512:675;;;;:::o;39421:163::-;39544:32;39550:2;39554:8;39564:5;39571:4;39544:5;:32::i;:::-;39421:163;;;:::o;48932:159::-;;;;;:::o;49750:158::-;;;;;:::o;2195:224::-;2263:13;2326:1;2320:4;2313:15;2355:1;2349:4;2342:15;2396:4;2390;2380:21;2371:30;;2195:224;;;;:::o;39843:1775::-;39982:20;40005:13;;39982:36;;40047:1;40033:16;;:2;:16;;;40029:48;;;40058:19;;;;;;;;;;;;;;40029:48;40104:1;40092:8;:13;40088:44;;;40114:18;;;;;;;;;;;;;;40088:44;40145:61;40175:1;40179:2;40183:12;40197:8;40145:21;:61::i;:::-;40518:8;40483:12;:16;40496:2;40483:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40582:8;40542:12;:16;40555:2;40542:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40641:2;40608:11;:25;40620:12;40608:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40708:15;40658:11;:25;40670:12;40658:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40741:20;40764:12;40741:35;;40791:11;40820:8;40805:12;:23;40791:37;;40849:4;:23;;;;;40857:15;:2;:13;;;:15::i;:::-;40849:23;40845:641;;;40893:314;40949:12;40945:2;40924:38;;40941:1;40924:38;;;;;;;;;;;;40990:69;41029:1;41033:2;41037:14;;;;;;41053:5;40990:30;:69::i;:::-;40985:174;;41095:40;;;;;;;;;;;;;;40985:174;41202:3;41186:12;:19;;40893:314;;41288:12;41271:13;;:29;41267:43;;41302:8;;;41267:43;40845:641;;;41351:120;41407:14;;;;;;41403:2;41382:40;;41399:1;41382:40;;;;;;;;;;;;41466:3;41450:12;:19;;41351:120;;40845:641;41516:12;41500:13;:28;;;;40458:1082;;41550:60;41579:1;41583:2;41587:12;41601:8;41550:20;:60::i;:::-;39971:1647;39843:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:323::-;6412:6;6461:2;6449:9;6440:7;6436:23;6432:32;6429:119;;;6467:79;;:::i;:::-;6429:119;6587:1;6612:50;6654:7;6645:6;6634:9;6630:22;6612:50;:::i;:::-;6602:60;;6558:114;6356:323;;;;:::o;6685:329::-;6744:6;6793:2;6781:9;6772:7;6768:23;6764:32;6761:119;;;6799:79;;:::i;:::-;6761:119;6919:1;6944:53;6989:7;6980:6;6969:9;6965:22;6944:53;:::i;:::-;6934:63;;6890:117;6685:329;;;;:::o;7020:327::-;7078:6;7127:2;7115:9;7106:7;7102:23;7098:32;7095:119;;;7133:79;;:::i;:::-;7095:119;7253:1;7278:52;7322:7;7313:6;7302:9;7298:22;7278:52;:::i;:::-;7268:62;;7224:116;7020:327;;;;:::o;7353:349::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7597:1;7622:63;7677:7;7668:6;7657:9;7653:22;7622:63;:::i;:::-;7612:73;;7568:127;7353:349;;;;:::o;7708:509::-;7777:6;7826:2;7814:9;7805:7;7801:23;7797:32;7794:119;;;7832:79;;:::i;:::-;7794:119;7980:1;7969:9;7965:17;7952:31;8010:18;8002:6;7999:30;7996:117;;;8032:79;;:::i;:::-;7996:117;8137:63;8192:7;8183:6;8172:9;8168:22;8137:63;:::i;:::-;8127:73;;7923:287;7708:509;;;;:::o;8223:329::-;8282:6;8331:2;8319:9;8310:7;8306:23;8302:32;8299:119;;;8337:79;;:::i;:::-;8299:119;8457:1;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8428:117;8223:329;;;;:::o;8558:474::-;8626:6;8634;8683:2;8671:9;8662:7;8658:23;8654:32;8651:119;;;8689:79;;:::i;:::-;8651:119;8809:1;8834:53;8879:7;8870:6;8859:9;8855:22;8834:53;:::i;:::-;8824:63;;8780:117;8936:2;8962:53;9007:7;8998:6;8987:9;8983:22;8962:53;:::i;:::-;8952:63;;8907:118;8558:474;;;;;:::o;9038:704::-;9133:6;9141;9149;9198:2;9186:9;9177:7;9173:23;9169:32;9166:119;;;9204:79;;:::i;:::-;9166:119;9324:1;9349:53;9394:7;9385:6;9374:9;9370:22;9349:53;:::i;:::-;9339:63;;9295:117;9479:2;9468:9;9464:18;9451:32;9510:18;9502:6;9499:30;9496:117;;;9532:79;;:::i;:::-;9496:117;9645:80;9717:7;9708:6;9697:9;9693:22;9645:80;:::i;:::-;9627:98;;;;9422:313;9038:704;;;;;:::o;9748:118::-;9835:24;9853:5;9835:24;:::i;:::-;9830:3;9823:37;9748:118;;:::o;9872:157::-;9977:45;9997:24;10015:5;9997:24;:::i;:::-;9977:45;:::i;:::-;9972:3;9965:58;9872:157;;:::o;10035:109::-;10116:21;10131:5;10116:21;:::i;:::-;10111:3;10104:34;10035:109;;:::o;10150:118::-;10237:24;10255:5;10237:24;:::i;:::-;10232:3;10225:37;10150:118;;:::o;10274:360::-;10360:3;10388:38;10420:5;10388:38;:::i;:::-;10442:70;10505:6;10500:3;10442:70;:::i;:::-;10435:77;;10521:52;10566:6;10561:3;10554:4;10547:5;10543:16;10521:52;:::i;:::-;10598:29;10620:6;10598:29;:::i;:::-;10593:3;10589:39;10582:46;;10364:270;10274:360;;;;:::o;10640:364::-;10728:3;10756:39;10789:5;10756:39;:::i;:::-;10811:71;10875:6;10870:3;10811:71;:::i;:::-;10804:78;;10891:52;10936:6;10931:3;10924:4;10917:5;10913:16;10891:52;:::i;:::-;10968:29;10990:6;10968:29;:::i;:::-;10963:3;10959:39;10952:46;;10732:272;10640:364;;;;:::o;11010:377::-;11116:3;11144:39;11177:5;11144:39;:::i;:::-;11199:89;11281:6;11276:3;11199:89;:::i;:::-;11192:96;;11297:52;11342:6;11337:3;11330:4;11323:5;11319:16;11297:52;:::i;:::-;11374:6;11369:3;11365:16;11358:23;;11120:267;11010:377;;;;:::o;11417:845::-;11520:3;11557:5;11551:12;11586:36;11612:9;11586:36;:::i;:::-;11638:89;11720:6;11715:3;11638:89;:::i;:::-;11631:96;;11758:1;11747:9;11743:17;11774:1;11769:137;;;;11920:1;11915:341;;;;11736:520;;11769:137;11853:4;11849:9;11838;11834:25;11829:3;11822:38;11889:6;11884:3;11880:16;11873:23;;11769:137;;11915:341;11982:38;12014:5;11982:38;:::i;:::-;12042:1;12056:154;12070:6;12067:1;12064:13;12056:154;;;12144:7;12138:14;12134:1;12129:3;12125:11;12118:35;12194:1;12185:7;12181:15;12170:26;;12092:4;12089:1;12085:12;12080:17;;12056:154;;;12239:6;12234:3;12230:16;12223:23;;11922:334;;11736:520;;11524:738;;11417:845;;;;:::o;12268:366::-;12410:3;12431:67;12495:2;12490:3;12431:67;:::i;:::-;12424:74;;12507:93;12596:3;12507:93;:::i;:::-;12625:2;12620:3;12616:12;12609:19;;12268:366;;;:::o;12640:::-;12782:3;12803:67;12867:2;12862:3;12803:67;:::i;:::-;12796:74;;12879:93;12968:3;12879:93;:::i;:::-;12997:2;12992:3;12988:12;12981:19;;12640:366;;;:::o;13012:::-;13154:3;13175:67;13239:2;13234:3;13175:67;:::i;:::-;13168:74;;13251:93;13340:3;13251:93;:::i;:::-;13369:2;13364:3;13360:12;13353:19;;13012:366;;;:::o;13384:::-;13526:3;13547:67;13611:2;13606:3;13547:67;:::i;:::-;13540:74;;13623:93;13712:3;13623:93;:::i;:::-;13741:2;13736:3;13732:12;13725:19;;13384:366;;;:::o;13756:::-;13898:3;13919:67;13983:2;13978:3;13919:67;:::i;:::-;13912:74;;13995:93;14084:3;13995:93;:::i;:::-;14113:2;14108:3;14104:12;14097:19;;13756:366;;;:::o;14128:::-;14270:3;14291:67;14355:2;14350:3;14291:67;:::i;:::-;14284:74;;14367:93;14456:3;14367:93;:::i;:::-;14485:2;14480:3;14476:12;14469:19;;14128:366;;;:::o;14500:::-;14642:3;14663:67;14727:2;14722:3;14663:67;:::i;:::-;14656:74;;14739:93;14828:3;14739:93;:::i;:::-;14857:2;14852:3;14848:12;14841:19;;14500:366;;;:::o;14872:::-;15014:3;15035:67;15099:2;15094:3;15035:67;:::i;:::-;15028:74;;15111:93;15200:3;15111:93;:::i;:::-;15229:2;15224:3;15220:12;15213:19;;14872:366;;;:::o;15244:::-;15386:3;15407:67;15471:2;15466:3;15407:67;:::i;:::-;15400:74;;15483:93;15572:3;15483:93;:::i;:::-;15601:2;15596:3;15592:12;15585:19;;15244:366;;;:::o;15616:::-;15758:3;15779:67;15843:2;15838:3;15779:67;:::i;:::-;15772:74;;15855:93;15944:3;15855:93;:::i;:::-;15973:2;15968:3;15964:12;15957:19;;15616:366;;;:::o;15988:::-;16130:3;16151:67;16215:2;16210:3;16151:67;:::i;:::-;16144:74;;16227:93;16316:3;16227:93;:::i;:::-;16345:2;16340:3;16336:12;16329:19;;15988:366;;;:::o;16360:::-;16502:3;16523:67;16587:2;16582:3;16523:67;:::i;:::-;16516:74;;16599:93;16688:3;16599:93;:::i;:::-;16717:2;16712:3;16708:12;16701:19;;16360:366;;;:::o;16732:398::-;16891:3;16912:83;16993:1;16988:3;16912:83;:::i;:::-;16905:90;;17004:93;17093:3;17004:93;:::i;:::-;17122:1;17117:3;17113:11;17106:18;;16732:398;;;:::o;17136:366::-;17278:3;17299:67;17363:2;17358:3;17299:67;:::i;:::-;17292:74;;17375:93;17464:3;17375:93;:::i;:::-;17493:2;17488:3;17484:12;17477:19;;17136:366;;;:::o;17508:::-;17650:3;17671:67;17735:2;17730:3;17671:67;:::i;:::-;17664:74;;17747:93;17836:3;17747:93;:::i;:::-;17865:2;17860:3;17856:12;17849:19;;17508:366;;;:::o;17880:::-;18022:3;18043:67;18107:2;18102:3;18043:67;:::i;:::-;18036:74;;18119:93;18208:3;18119:93;:::i;:::-;18237:2;18232:3;18228:12;18221:19;;17880:366;;;:::o;18252:118::-;18339:24;18357:5;18339:24;:::i;:::-;18334:3;18327:37;18252:118;;:::o;18376:256::-;18488:3;18503:75;18574:3;18565:6;18503:75;:::i;:::-;18603:2;18598:3;18594:12;18587:19;;18623:3;18616:10;;18376:256;;;;:::o;18638:589::-;18863:3;18885:95;18976:3;18967:6;18885:95;:::i;:::-;18878:102;;18997:95;19088:3;19079:6;18997:95;:::i;:::-;18990:102;;19109:92;19197:3;19188:6;19109:92;:::i;:::-;19102:99;;19218:3;19211:10;;18638:589;;;;;;:::o;19233:379::-;19417:3;19439:147;19582:3;19439:147;:::i;:::-;19432:154;;19603:3;19596:10;;19233:379;;;:::o;19618:222::-;19711:4;19749:2;19738:9;19734:18;19726:26;;19762:71;19830:1;19819:9;19815:17;19806:6;19762:71;:::i;:::-;19618:222;;;;:::o;19846:640::-;20041:4;20079:3;20068:9;20064:19;20056:27;;20093:71;20161:1;20150:9;20146:17;20137:6;20093:71;:::i;:::-;20174:72;20242:2;20231:9;20227:18;20218:6;20174:72;:::i;:::-;20256;20324:2;20313:9;20309:18;20300:6;20256:72;:::i;:::-;20375:9;20369:4;20365:20;20360:2;20349:9;20345:18;20338:48;20403:76;20474:4;20465:6;20403:76;:::i;:::-;20395:84;;19846:640;;;;;;;:::o;20492:210::-;20579:4;20617:2;20606:9;20602:18;20594:26;;20630:65;20692:1;20681:9;20677:17;20668:6;20630:65;:::i;:::-;20492:210;;;;:::o;20708:222::-;20801:4;20839:2;20828:9;20824:18;20816:26;;20852:71;20920:1;20909:9;20905:17;20896:6;20852:71;:::i;:::-;20708:222;;;;:::o;20936:313::-;21049:4;21087:2;21076:9;21072:18;21064:26;;21136:9;21130:4;21126:20;21122:1;21111:9;21107:17;21100:47;21164:78;21237:4;21228:6;21164:78;:::i;:::-;21156:86;;20936:313;;;;:::o;21255:419::-;21421:4;21459:2;21448:9;21444:18;21436:26;;21508:9;21502:4;21498:20;21494:1;21483:9;21479:17;21472:47;21536:131;21662:4;21536:131;:::i;:::-;21528:139;;21255:419;;;:::o;21680:::-;21846:4;21884:2;21873:9;21869:18;21861:26;;21933:9;21927:4;21923:20;21919:1;21908:9;21904:17;21897:47;21961:131;22087:4;21961:131;:::i;:::-;21953:139;;21680:419;;;:::o;22105:::-;22271:4;22309:2;22298:9;22294:18;22286:26;;22358:9;22352:4;22348:20;22344:1;22333:9;22329:17;22322:47;22386:131;22512:4;22386:131;:::i;:::-;22378:139;;22105:419;;;:::o;22530:::-;22696:4;22734:2;22723:9;22719:18;22711:26;;22783:9;22777:4;22773:20;22769:1;22758:9;22754:17;22747:47;22811:131;22937:4;22811:131;:::i;:::-;22803:139;;22530:419;;;:::o;22955:::-;23121:4;23159:2;23148:9;23144:18;23136:26;;23208:9;23202:4;23198:20;23194:1;23183:9;23179:17;23172:47;23236:131;23362:4;23236:131;:::i;:::-;23228:139;;22955:419;;;:::o;23380:::-;23546:4;23584:2;23573:9;23569:18;23561:26;;23633:9;23627:4;23623:20;23619:1;23608:9;23604:17;23597:47;23661:131;23787:4;23661:131;:::i;:::-;23653:139;;23380:419;;;:::o;23805:::-;23971:4;24009:2;23998:9;23994:18;23986:26;;24058:9;24052:4;24048:20;24044:1;24033:9;24029:17;24022:47;24086:131;24212:4;24086:131;:::i;:::-;24078:139;;23805:419;;;:::o;24230:::-;24396:4;24434:2;24423:9;24419:18;24411:26;;24483:9;24477:4;24473:20;24469:1;24458:9;24454:17;24447:47;24511:131;24637:4;24511:131;:::i;:::-;24503:139;;24230:419;;;:::o;24655:::-;24821:4;24859:2;24848:9;24844:18;24836:26;;24908:9;24902:4;24898:20;24894:1;24883:9;24879:17;24872:47;24936:131;25062:4;24936:131;:::i;:::-;24928:139;;24655:419;;;:::o;25080:::-;25246:4;25284:2;25273:9;25269:18;25261:26;;25333:9;25327:4;25323:20;25319:1;25308:9;25304:17;25297:47;25361:131;25487:4;25361:131;:::i;:::-;25353:139;;25080:419;;;:::o;25505:::-;25671:4;25709:2;25698:9;25694:18;25686:26;;25758:9;25752:4;25748:20;25744:1;25733:9;25729:17;25722:47;25786:131;25912:4;25786:131;:::i;:::-;25778:139;;25505:419;;;:::o;25930:::-;26096:4;26134:2;26123:9;26119:18;26111:26;;26183:9;26177:4;26173:20;26169:1;26158:9;26154:17;26147:47;26211:131;26337:4;26211:131;:::i;:::-;26203:139;;25930:419;;;:::o;26355:::-;26521:4;26559:2;26548:9;26544:18;26536:26;;26608:9;26602:4;26598:20;26594:1;26583:9;26579:17;26572:47;26636:131;26762:4;26636:131;:::i;:::-;26628:139;;26355:419;;;:::o;26780:::-;26946:4;26984:2;26973:9;26969:18;26961:26;;27033:9;27027:4;27023:20;27019:1;27008:9;27004:17;26997:47;27061:131;27187:4;27061:131;:::i;:::-;27053:139;;26780:419;;;:::o;27205:::-;27371:4;27409:2;27398:9;27394:18;27386:26;;27458:9;27452:4;27448:20;27444:1;27433:9;27429:17;27422:47;27486:131;27612:4;27486:131;:::i;:::-;27478:139;;27205:419;;;:::o;27630:222::-;27723:4;27761:2;27750:9;27746:18;27738:26;;27774:71;27842:1;27831:9;27827:17;27818:6;27774:71;:::i;:::-;27630:222;;;;:::o;27858:129::-;27892:6;27919:20;;:::i;:::-;27909:30;;27948:33;27976:4;27968:6;27948:33;:::i;:::-;27858:129;;;:::o;27993:75::-;28026:6;28059:2;28053:9;28043:19;;27993:75;:::o;28074:307::-;28135:4;28225:18;28217:6;28214:30;28211:56;;;28247:18;;:::i;:::-;28211:56;28285:29;28307:6;28285:29;:::i;:::-;28277:37;;28369:4;28363;28359:15;28351:23;;28074:307;;;:::o;28387:308::-;28449:4;28539:18;28531:6;28528:30;28525:56;;;28561:18;;:::i;:::-;28525:56;28599:29;28621:6;28599:29;:::i;:::-;28591:37;;28683:4;28677;28673:15;28665:23;;28387:308;;;:::o;28701:141::-;28750:4;28773:3;28765:11;;28796:3;28793:1;28786:14;28830:4;28827:1;28817:18;28809:26;;28701:141;;;:::o;28848:98::-;28899:6;28933:5;28927:12;28917:22;;28848:98;;;:::o;28952:99::-;29004:6;29038:5;29032:12;29022:22;;28952:99;;;:::o;29057:168::-;29140:11;29174:6;29169:3;29162:19;29214:4;29209:3;29205:14;29190:29;;29057:168;;;;:::o;29231:147::-;29332:11;29369:3;29354:18;;29231:147;;;;:::o;29384:169::-;29468:11;29502:6;29497:3;29490:19;29542:4;29537:3;29533:14;29518:29;;29384:169;;;;:::o;29559:148::-;29661:11;29698:3;29683:18;;29559:148;;;;:::o;29713:305::-;29753:3;29772:20;29790:1;29772:20;:::i;:::-;29767:25;;29806:20;29824:1;29806:20;:::i;:::-;29801:25;;29960:1;29892:66;29888:74;29885:1;29882:81;29879:107;;;29966:18;;:::i;:::-;29879:107;30010:1;30007;30003:9;29996:16;;29713:305;;;;:::o;30024:185::-;30064:1;30081:20;30099:1;30081:20;:::i;:::-;30076:25;;30115:20;30133:1;30115:20;:::i;:::-;30110:25;;30154:1;30144:35;;30159:18;;:::i;:::-;30144:35;30201:1;30198;30194:9;30189:14;;30024:185;;;;:::o;30215:348::-;30255:7;30278:20;30296:1;30278:20;:::i;:::-;30273:25;;30312:20;30330:1;30312:20;:::i;:::-;30307:25;;30500:1;30432:66;30428:74;30425:1;30422:81;30417:1;30410:9;30403:17;30399:105;30396:131;;;30507:18;;:::i;:::-;30396:131;30555:1;30552;30548:9;30537:20;;30215:348;;;;:::o;30569:191::-;30609:4;30629:20;30647:1;30629:20;:::i;:::-;30624:25;;30663:20;30681:1;30663:20;:::i;:::-;30658:25;;30702:1;30699;30696:8;30693:34;;;30707:18;;:::i;:::-;30693:34;30752:1;30749;30745:9;30737:17;;30569:191;;;;:::o;30766:96::-;30803:7;30832:24;30850:5;30832:24;:::i;:::-;30821:35;;30766:96;;;:::o;30868:90::-;30902:7;30945:5;30938:13;30931:21;30920:32;;30868:90;;;:::o;30964:77::-;31001:7;31030:5;31019:16;;30964:77;;;:::o;31047:149::-;31083:7;31123:66;31116:5;31112:78;31101:89;;31047:149;;;:::o;31202:126::-;31239:7;31279:42;31272:5;31268:54;31257:65;;31202:126;;;:::o;31334:77::-;31371:7;31400:5;31389:16;;31334:77;;;:::o;31417:154::-;31501:6;31496:3;31491;31478:30;31563:1;31554:6;31549:3;31545:16;31538:27;31417:154;;;:::o;31577:307::-;31645:1;31655:113;31669:6;31666:1;31663:13;31655:113;;;31754:1;31749:3;31745:11;31739:18;31735:1;31730:3;31726:11;31719:39;31691:2;31688:1;31684:10;31679:15;;31655:113;;;31786:6;31783:1;31780:13;31777:101;;;31866:1;31857:6;31852:3;31848:16;31841:27;31777:101;31626:258;31577:307;;;:::o;31890:320::-;31934:6;31971:1;31965:4;31961:12;31951:22;;32018:1;32012:4;32008:12;32039:18;32029:81;;32095:4;32087:6;32083:17;32073:27;;32029:81;32157:2;32149:6;32146:14;32126:18;32123:38;32120:84;;;32176:18;;:::i;:::-;32120:84;31941:269;31890:320;;;:::o;32216:281::-;32299:27;32321:4;32299:27;:::i;:::-;32291:6;32287:40;32429:6;32417:10;32414:22;32393:18;32381:10;32378:34;32375:62;32372:88;;;32440:18;;:::i;:::-;32372:88;32480:10;32476:2;32469:22;32259:238;32216:281;;:::o;32503:233::-;32542:3;32565:24;32583:5;32565:24;:::i;:::-;32556:33;;32611:66;32604:5;32601:77;32598:103;;;32681:18;;:::i;:::-;32598:103;32728:1;32721:5;32717:13;32710:20;;32503:233;;;:::o;32742:100::-;32781:7;32810:26;32830:5;32810:26;:::i;:::-;32799:37;;32742:100;;;:::o;32848:94::-;32887:7;32916:20;32930:5;32916:20;:::i;:::-;32905:31;;32848:94;;;:::o;32948:176::-;32980:1;32997:20;33015:1;32997:20;:::i;:::-;32992:25;;33031:20;33049:1;33031:20;:::i;:::-;33026:25;;33070:1;33060:35;;33075:18;;:::i;:::-;33060:35;33116:1;33113;33109:9;33104:14;;32948:176;;;;:::o;33130:180::-;33178:77;33175:1;33168:88;33275:4;33272:1;33265:15;33299:4;33296:1;33289:15;33316:180;33364:77;33361:1;33354:88;33461:4;33458:1;33451:15;33485:4;33482:1;33475:15;33502:180;33550:77;33547:1;33540:88;33647:4;33644:1;33637:15;33671:4;33668:1;33661:15;33688:180;33736:77;33733:1;33726:88;33833:4;33830:1;33823:15;33857:4;33854:1;33847:15;33874:180;33922:77;33919:1;33912:88;34019:4;34016:1;34009:15;34043:4;34040:1;34033:15;34060:117;34169:1;34166;34159:12;34183:117;34292:1;34289;34282:12;34306:117;34415:1;34412;34405:12;34429:117;34538:1;34535;34528:12;34552:117;34661:1;34658;34651:12;34675:117;34784:1;34781;34774:12;34798:102;34839:6;34890:2;34886:7;34881:2;34874:5;34870:14;34866:28;34856:38;;34798:102;;;:::o;34906:94::-;34939:8;34987:5;34983:2;34979:14;34958:35;;34906:94;;;:::o;35006:235::-;35146:34;35142:1;35134:6;35130:14;35123:58;35215:18;35210:2;35202:6;35198:15;35191:43;35006:235;:::o;35247:181::-;35387:33;35383:1;35375:6;35371:14;35364:57;35247:181;:::o;35434:225::-;35574:34;35570:1;35562:6;35558:14;35551:58;35643:8;35638:2;35630:6;35626:15;35619:33;35434:225;:::o;35665:223::-;35805:34;35801:1;35793:6;35789:14;35782:58;35874:6;35869:2;35861:6;35857:15;35850:31;35665:223;:::o;35894:226::-;36034:34;36030:1;36022:6;36018:14;36011:58;36103:9;36098:2;36090:6;36086:15;36079:34;35894:226;:::o;36126:168::-;36266:20;36262:1;36254:6;36250:14;36243:44;36126:168;:::o;36300:182::-;36440:34;36436:1;36428:6;36424:14;36417:58;36300:182;:::o;36488:222::-;36628:34;36624:1;36616:6;36612:14;36605:58;36697:5;36692:2;36684:6;36680:15;36673:30;36488:222;:::o;36716:172::-;36856:24;36852:1;36844:6;36840:14;36833:48;36716:172;:::o;36894:182::-;37034:34;37030:1;37022:6;37018:14;37011:58;36894:182;:::o;37082:181::-;37222:33;37218:1;37210:6;37206:14;37199:57;37082:181;:::o;37269:176::-;37409:28;37405:1;37397:6;37393:14;37386:52;37269:176;:::o;37451:114::-;;:::o;37571:222::-;37711:34;37707:1;37699:6;37695:14;37688:58;37780:5;37775:2;37767:6;37763:15;37756:30;37571:222;:::o;37799:181::-;37939:33;37935:1;37927:6;37923:14;37916:57;37799:181;:::o;37986:177::-;38126:29;38122:1;38114:6;38110:14;38103:53;37986:177;:::o;38169:122::-;38242:24;38260:5;38242:24;:::i;:::-;38235:5;38232:35;38222:63;;38281:1;38278;38271:12;38222:63;38169:122;:::o;38297:116::-;38367:21;38382:5;38367:21;:::i;:::-;38360:5;38357:32;38347:60;;38403:1;38400;38393:12;38347:60;38297:116;:::o;38419:122::-;38492:24;38510:5;38492:24;:::i;:::-;38485:5;38482:35;38472:63;;38531:1;38528;38521:12;38472:63;38419:122;:::o;38547:120::-;38619:23;38636:5;38619:23;:::i;:::-;38612:5;38609:34;38599:62;;38657:1;38654;38647:12;38599:62;38547:120;:::o;38673:122::-;38746:24;38764:5;38746:24;:::i;:::-;38739:5;38736:35;38726:63;;38785:1;38782;38775:12;38726:63;38673:122;:::o

Swarm Source

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