ETH Price: $3,246.56 (-0.41%)
Gas: 1 Gwei

Token

CloodleZ (CZ)
 

Overview

Max Total Supply

600 CZ

Holders

286

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
kassabios.eth
Balance
1 CZ
0x49a59439fe97989424c759a902b5012a2bd9ccaf
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:
CloodleZ

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-27
*/

//   $$$$$$\  $$\                           $$\ $$\                 $$$$$$$$\ 
//  $$  __$$\ $$ |                          $$ |$$ |                \____$$  |
//  $$ /  \__|$$ | $$$$$$\   $$$$$$\   $$$$$$$ |$$ | $$$$$$\            $$  / 
//  $$ |      $$ |$$  __$$\ $$  __$$\ $$  __$$ |$$ |$$  __$$\          $$  /  
//  $$ |      $$ |$$ /  $$ |$$ /  $$ |$$ /  $$ |$$ |$$$$$$$$ |        $$  /   
//  $$ |  $$\ $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ |$$   ____|       $$  /    
//  \$$$$$$  |$$ |\$$$$$$  |\$$$$$$  |\$$$$$$$ |$$ |\$$$$$$$\       $$$$$$$$\ 
 // \______/ \__| \______/  \______/  \_______|\__| \_______|      \________|

// @title Cloodle-Z
/// @notice https://www.cloodlez.com/ https://twitter.com/CloodlesNFT



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

// SPDX-License-Identifier: MIT

// OpenZeppelin Contracts v4.4.1 (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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// 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 v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721A.sol


// Creators: locationtba.eth, 2pmflow.eth

pragma solidity ^0.8.10;









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

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 public immutable maxBatchSize;

  // 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) private _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;

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_
  ) {
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

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

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

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

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

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

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

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

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

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

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

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

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

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

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

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

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

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

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

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

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

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > currentIndex - 1) {
      endIndex = currentIndex - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

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

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



pragma solidity ^0.8.10;



contract CloodleZ is ERC721A, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public constant MAX_TOKENS = 8888;
    uint256 public constant MAX_PER_MINT = 20;
    address public constant w1 = 0x94a1801b341Df84DE851c3383f2103d182864b65;
    address public constant w2 = 0xe640A158aA4D8681b5BC3bd41113173DA47b1593;
    address public constant w3 = 0x49B3Cb75b94E06b246d928f691709A7C81633282;

    uint256 public price = 0.079 ether;
    uint256 public pricePresale = 0.069 ether;
  
    

    bool public isRevealed = false;
    bool public publicSaleStarted = false;
    bool public presaleStarted = false;
    mapping(address => uint256) private _presaleMints;
    uint256 public presaleMaxPerWallet = 7;

    string public baseURI = "";
    bytes32 public merkleRoot = 0x7e54fbd956181ad3b1bf2e50e51823fb9f3648bfcb72660826f905dfc2250bae;

    constructor() ERC721A("CloodleZ", "CZ", 20) {
    }

    function togglePresaleStarted() external onlyOwner {
        presaleStarted = !presaleStarted;
    }

    function togglePublicSaleStarted() external onlyOwner {
        publicSaleStarted = !publicSaleStarted;
    }

    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }
    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        price = _newPrice * (1 ether);
    }

    function setPricePresale(uint256 _newPrice) external onlyOwner {
        pricePresale = _newPrice * (1 ether);
    }

    function toggleReveal() external onlyOwner {
        isRevealed = !isRevealed;
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (isRevealed) {
            return super.tokenURI(tokenId);
        } else {
            return
                string(abi.encodePacked("https://gateway.pinata.cloud/ipfs/QmVcjnU8QiGyL6hm5Yb5uwXAmhcizLao3GnmbAqsPD5iqt/", tokenId.toString()));
        }
    }

    /// Set number of maximum presale mints a wallet can have
    /// @param _newPresaleMaxPerWallet value to set
    function setPresaleMaxPerWallet(uint256 _newPresaleMaxPerWallet) external onlyOwner {
        presaleMaxPerWallet = _newPresaleMaxPerWallet;
    }

    /// Presale mint function
    /// @param tokens number of tokens to mint
    /// @param merkleProof Merkle Tree proof
    /// @dev reverts if any of the presale preconditions aren't satisfied
    function mintPresale(uint256 tokens, bytes32[] calldata merkleProof) external payable {
        require(presaleStarted, "X: Presale has not started");
        require(MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender))), "X: You are not eligible for the presale");
        require(_presaleMints[_msgSender()] + tokens <= presaleMaxPerWallet, "X: Presale limit for this wallet reached");
        require(tokens <= MAX_PER_MINT, "X: Cannot purchase this many tokens in a transaction");
        require(totalSupply() + tokens <= MAX_TOKENS, "X: Minting would exceed max supply");
        require(tokens > 0, "X: Must mint at least one token");
        require(pricePresale * tokens == msg.value, "X: ETH amount is incorrect");

        _safeMint(_msgSender(), tokens);
        _presaleMints[_msgSender()] += tokens;
    }

    /// Public Sale mint function
    /// @param tokens number of tokens to mint
    /// @dev reverts if any of the public sale preconditions aren't satisfied
    function mint(uint256 tokens) external payable {
        require(publicSaleStarted, "X: Public sale has not started");
        require(tokens <= MAX_PER_MINT, "X: Cannot purchase this many tokens in a transaction");
        require(totalSupply() + tokens <= MAX_TOKENS, "X: Minting would exceed max supply");
        require(tokens > 0, "X: Must mint at least one token");
        require(price * tokens == msg.value, "X: ETH amount is incorrect");

        _safeMint(_msgSender(), tokens);
    }

    /// Owner only mint function
    /// Does not require eth
    /// @param to address of the recepient
    /// @param tokens number of tokens to mint
    /// @dev reverts if any of the preconditions aren't satisfied
    function ownerMint(address to, uint256 tokens) external onlyOwner {
        require(totalSupply() + tokens <= MAX_TOKENS, "X: Minting would exceed max supply");
        require(tokens > 0, "X: Must mint at least one token");

        _safeMint(to, tokens);
    }

    /// Distribute funds to wallets
    function withdrawAll() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "X: Insufficent balance");
        _widthdraw(w3, ((balance * 1) / 3));
        _widthdraw(w2, ((balance * 1) / 3));
        _widthdraw(w1, ((balance * 1) / 3));
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "X: Failed to widthdraw Ether");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","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":[{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPresaleMaxPerWallet","type":"uint256"}],"name":"setPresaleMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPricePresale","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":[],"name":"togglePresaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"w1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"w2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"w3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600080556000600755670118aa14d941800060095566f5232269808000600a556000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506000600b60026101000a81548160ff0219169083151502179055506007600d5560405180602001604052806000815250600e9080519060200190620000a1929190620002bc565b507f7e54fbd956181ad3b1bf2e50e51823fb9f3648bfcb72660826f905dfc2250bae60001b600f55348015620000d657600080fd5b506040518060400160405280600881526020017f436c6f6f646c655a0000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f435a0000000000000000000000000000000000000000000000000000000000008152506014600081116200018b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018290620003f3565b60405180910390fd5b8260019080519060200190620001a3929190620002bc565b508160029080519060200190620001bc929190620002bc565b508060808181525050505050620001e8620001dc620001ee60201b60201c565b620001f660201b60201c565b6200047a565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ca9062000444565b90600052602060002090601f016020900481019282620002ee57600085556200033a565b82601f106200030957805160ff19168380011785556200033a565b828001600101855582156200033a579182015b82811115620003395782518255916020019190600101906200031c565b5b5090506200034991906200034d565b5090565b5b80821115620003685760008160009055506001016200034e565b5090565b600082825260208201905092915050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620003db6027836200036c565b9150620003e8826200037d565b604082019050919050565b600060208201905081810360008301526200040e81620003cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045d57607f821691505b6020821081141562000474576200047362000415565b5b50919050565b608051615725620004ab6000396000818161113501528181612b2901528181612b52015261335301526157256000f3fe60806040526004361061027d5760003560e01c80636352211e1161014f578063a035b1fe116100c1578063c87b56dd1161007a578063c87b56dd14610922578063d7224ba01461095f578063e985e9c51461098a578063ed1fc2a2146109c7578063f2fde38b146109de578063f47c84c514610a075761027d565b8063a035b1fe14610833578063a044c9871461085e578063a0712d6814610889578063a22cb465146108a5578063a2e91477146108ce578063b88d4fde146108f95761027d565b80637e44755b116101135780637e44755b14610747578063853828b6146107725780638da5cb5b146107895780639147dd1b146107b457806391b7f5ed146107df57806395d89b41146108085761027d565b80636352211e146106625780636c0360eb1461069f57806370a08231146106ca578063715018a6146107075780637cb647591461071e5761027d565b80632913daa0116101f35780634c0770f0116101ac5780634c0770f0146105685780634f6ccce71461059157806354214f69146105ce57806355f804b3146105f95780635a94133c146106225780635b8ad4291461064b5761027d565b80632913daa01461046c5780632eb4a7ab146104975780632f745c59146104c25780632f814575146104ff57806342842e0e14610516578063484b973c1461053f5761027d565b8063095ea7b311610245578063095ea7b31461037d57806309d42b30146103a65780630c0a6b5e146103d157806312c23bd8146103ed57806318160ddd1461041857806323b872dd146104435761027d565b806301ffc9a71461028257806303cf8a20146102bf57806304549d6f146102ea57806306fdde0314610315578063081812fc14610340575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a4919061396b565b610a32565b6040516102b691906139b3565b60405180910390f35b3480156102cb57600080fd5b506102d4610b7c565b6040516102e19190613a0f565b60405180910390f35b3480156102f657600080fd5b506102ff610b94565b60405161030c91906139b3565b60405180910390f35b34801561032157600080fd5b5061032a610ba7565b6040516103379190613ac3565b60405180910390f35b34801561034c57600080fd5b5061036760048036038101906103629190613b1b565b610c39565b6040516103749190613a0f565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190613b74565b610cbe565b005b3480156103b257600080fd5b506103bb610dd7565b6040516103c89190613bc3565b60405180910390f35b6103eb60048036038101906103e69190613c43565b610ddc565b005b3480156103f957600080fd5b50610402611114565b60405161040f9190613bc3565b60405180910390f35b34801561042457600080fd5b5061042d61111a565b60405161043a9190613bc3565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190613ca3565b611123565b005b34801561047857600080fd5b50610481611133565b60405161048e9190613bc3565b60405180910390f35b3480156104a357600080fd5b506104ac611157565b6040516104b99190613d0f565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190613b74565b61115d565b6040516104f69190613bc3565b60405180910390f35b34801561050b57600080fd5b5061051461135b565b005b34801561052257600080fd5b5061053d60048036038101906105389190613ca3565b611403565b005b34801561054b57600080fd5b5061056660048036038101906105619190613b74565b611423565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613b1b565b611547565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613b1b565b6115cd565b6040516105c59190613bc3565b60405180910390f35b3480156105da57600080fd5b506105e3611620565b6040516105f091906139b3565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190613e5a565b611633565b005b34801561062e57600080fd5b5061064960048036038101906106449190613b1b565b6116c9565b005b34801561065757600080fd5b50610660611762565b005b34801561066e57600080fd5b5061068960048036038101906106849190613b1b565b61180a565b6040516106969190613a0f565b60405180910390f35b3480156106ab57600080fd5b506106b4611820565b6040516106c19190613ac3565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190613ea3565b6118ae565b6040516106fe9190613bc3565b60405180910390f35b34801561071357600080fd5b5061071c611997565b005b34801561072a57600080fd5b5061074560048036038101906107409190613efc565b611a1f565b005b34801561075357600080fd5b5061075c611aa5565b6040516107699190613a0f565b60405180910390f35b34801561077e57600080fd5b50610787611abd565b005b34801561079557600080fd5b5061079e611c26565b6040516107ab9190613a0f565b60405180910390f35b3480156107c057600080fd5b506107c9611c50565b6040516107d69190613bc3565b60405180910390f35b3480156107eb57600080fd5b5061080660048036038101906108019190613b1b565b611c56565b005b34801561081457600080fd5b5061081d611cef565b60405161082a9190613ac3565b60405180910390f35b34801561083f57600080fd5b50610848611d81565b6040516108559190613bc3565b60405180910390f35b34801561086a57600080fd5b50610873611d87565b6040516108809190613a0f565b60405180910390f35b6108a3600480360381019061089e9190613b1b565b611d9f565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190613f55565b611f2f565b005b3480156108da57600080fd5b506108e36120b0565b6040516108f091906139b3565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190614036565b6120c3565b005b34801561092e57600080fd5b5061094960048036038101906109449190613b1b565b61211f565b6040516109569190613ac3565b60405180910390f35b34801561096b57600080fd5b50610974612176565b6040516109819190613bc3565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac91906140b9565b61217c565b6040516109be91906139b3565b60405180910390f35b3480156109d357600080fd5b506109dc612210565b005b3480156109ea57600080fd5b50610a056004803603810190610a009190613ea3565b6122b8565b005b348015610a1357600080fd5b50610a1c6123b0565b604051610a299190613bc3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b6557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b755750610b74826123b6565b5b9050919050565b73e640a158aa4d8681b5bc3bd41113173da47b159381565b600b60029054906101000a900460ff1681565b606060018054610bb690614128565b80601f0160208091040260200160405190810160405280929190818152602001828054610be290614128565b8015610c2f5780601f10610c0457610100808354040283529160200191610c2f565b820191906000526020600020905b815481529060010190602001808311610c1257829003601f168201915b5050505050905090565b6000610c4482612420565b610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a906141cc565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc98261180a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d319061425e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5961242d565b73ffffffffffffffffffffffffffffffffffffffff161480610d885750610d8781610d8261242d565b61217c565b5b610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe906142f0565b60405180910390fd5b610dd2838383612435565b505050565b601481565b600b60029054906101000a900460ff16610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229061435c565b60405180910390fd5b610e9f828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5433604051602001610e8491906143c4565b604051602081830303815290604052805190602001206124e7565b610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590614451565b60405180910390fd5b600d5483600c6000610eee61242d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f3391906144a0565b1115610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614568565b60405180910390fd5b6014831115610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf906145fa565b60405180910390fd5b6122b883610fc461111a565b610fce91906144a0565b111561100f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110069061468c565b60405180910390fd5b60008311611052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611049906146f8565b60405180910390fd5b3483600a546110619190614718565b146110a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611098906147be565b60405180910390fd5b6110b26110ac61242d565b846124fe565b82600c60006110bf61242d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461110891906144a0565b92505081905550505050565b600d5481565b60008054905090565b61112e83838361251c565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f5481565b6000611168836118ae565b82106111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090614850565b60405180910390fd5b60006111b361111a565b905060008060005b83811015611319576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146112ad57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561130557868414156112f6578195505050505050611355565b838061130190614870565b9450505b50808061131190614870565b9150506111bb565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c9061492b565b60405180910390fd5b92915050565b61136361242d565b73ffffffffffffffffffffffffffffffffffffffff16611381611c26565b73ffffffffffffffffffffffffffffffffffffffff16146113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce90614997565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b61141e838383604051806020016040528060008152506120c3565b505050565b61142b61242d565b73ffffffffffffffffffffffffffffffffffffffff16611449611c26565b73ffffffffffffffffffffffffffffffffffffffff161461149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690614997565b60405180910390fd5b6122b8816114ab61111a565b6114b591906144a0565b11156114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed9061468c565b60405180910390fd5b60008111611539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611530906146f8565b60405180910390fd5b61154382826124fe565b5050565b61154f61242d565b73ffffffffffffffffffffffffffffffffffffffff1661156d611c26565b73ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90614997565b60405180910390fd5b80600d8190555050565b60006115d761111a565b8210611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160f90614a29565b60405180910390fd5b819050919050565b600b60009054906101000a900460ff1681565b61163b61242d565b73ffffffffffffffffffffffffffffffffffffffff16611659611c26565b73ffffffffffffffffffffffffffffffffffffffff16146116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690614997565b60405180910390fd5b80600e90805190602001906116c5929190613822565b5050565b6116d161242d565b73ffffffffffffffffffffffffffffffffffffffff166116ef611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90614997565b60405180910390fd5b670de0b6b3a7640000816117599190614718565b600a8190555050565b61176a61242d565b73ffffffffffffffffffffffffffffffffffffffff16611788611c26565b73ffffffffffffffffffffffffffffffffffffffff16146117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614997565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b600061181582612ad5565b600001519050919050565b600e805461182d90614128565b80601f016020809104026020016040519081016040528092919081815260200182805461185990614128565b80156118a65780601f1061187b576101008083540402835291602001916118a6565b820191906000526020600020905b81548152906001019060200180831161188957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561191f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191690614abb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61199f61242d565b73ffffffffffffffffffffffffffffffffffffffff166119bd611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a90614997565b60405180910390fd5b611a1d6000612cd8565b565b611a2761242d565b73ffffffffffffffffffffffffffffffffffffffff16611a45611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290614997565b60405180910390fd5b80600f8190555050565b7394a1801b341df84de851c3383f2103d182864b6581565b611ac561242d565b73ffffffffffffffffffffffffffffffffffffffff16611ae3611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3090614997565b60405180910390fd5b600047905060008111611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890614b27565b60405180910390fd5b611bb77349b3cb75b94e06b246d928f691709a7c816332826003600184611ba89190614718565b611bb29190614b76565b612d9e565b611bed73e640a158aa4d8681b5bc3bd41113173da47b15936003600184611bde9190614718565b611be89190614b76565b612d9e565b611c237394a1801b341df84de851c3383f2103d182864b656003600184611c149190614718565b611c1e9190614b76565b612d9e565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b611c5e61242d565b73ffffffffffffffffffffffffffffffffffffffff16611c7c611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990614997565b60405180910390fd5b670de0b6b3a764000081611ce69190614718565b60098190555050565b606060028054611cfe90614128565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2a90614128565b8015611d775780601f10611d4c57610100808354040283529160200191611d77565b820191906000526020600020905b815481529060010190602001808311611d5a57829003601f168201915b5050505050905090565b60095481565b7349b3cb75b94e06b246d928f691709a7c8163328281565b600b60019054906101000a900460ff16611dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de590614bf3565b60405180910390fd5b6014811115611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e29906145fa565b60405180910390fd5b6122b881611e3e61111a565b611e4891906144a0565b1115611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e809061468c565b60405180910390fd5b60008111611ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec3906146f8565b60405180910390fd5b3481600954611edb9190614718565b14611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f12906147be565b60405180910390fd5b611f2c611f2661242d565b826124fe565b50565b611f3761242d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c90614c5f565b60405180910390fd5b8060066000611fb261242d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661205f61242d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120a491906139b3565b60405180910390a35050565b600b60019054906101000a900460ff1681565b6120ce84848461251c565b6120da84848484612e4f565b612119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211090614cf1565b60405180910390fd5b50505050565b6060600b60009054906101000a900460ff16156121465761213f82612fd7565b9050612171565b61214f8261307e565b60405160200161215f9190614de5565b60405160208183030381529060405290505b919050565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61221861242d565b73ffffffffffffffffffffffffffffffffffffffff16612236611c26565b73ffffffffffffffffffffffffffffffffffffffff161461228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228390614997565b60405180910390fd5b600b60029054906101000a900460ff1615600b60026101000a81548160ff021916908315150217905550565b6122c061242d565b73ffffffffffffffffffffffffffffffffffffffff166122de611c26565b73ffffffffffffffffffffffffffffffffffffffff1614612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90614997565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239b90614e79565b60405180910390fd5b6123ad81612cd8565b50565b6122b881565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000826124f485846131df565b1490509392505050565b612518828260405180602001604052806000815250613292565b5050565b600061252782612ad5565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661254e61242d565b73ffffffffffffffffffffffffffffffffffffffff1614806125aa575061257361242d565b73ffffffffffffffffffffffffffffffffffffffff1661259284610c39565b73ffffffffffffffffffffffffffffffffffffffff16145b806125c657506125c582600001516125c061242d565b61217c565b5b905080612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff90614f0b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461267a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267190614f9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e19061502f565b60405180910390fd5b6126f78585856001613771565b6127076000848460000151612435565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612775919061506b565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612819919061509f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461291f91906144a0565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a655761299581612420565b15612a64576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612acd8686866001613777565b505050505050565b612add6138a8565b612ae682612420565b612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c90615157565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612b895760017f000000000000000000000000000000000000000000000000000000000000000084612b7c9190615177565b612b8691906144a0565b90505b60008390505b818110612c97576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c8357809350505050612cd3565b508080612c8f906151ab565b915050612b8f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cca90615247565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612dc490615298565b60006040518083038185875af1925050503d8060008114612e01576040519150601f19603f3d011682016040523d82523d6000602084013e612e06565b606091505b5050905080612e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e41906152f9565b60405180910390fd5b505050565b6000612e708473ffffffffffffffffffffffffffffffffffffffff1661377d565b15612fca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9961242d565b8786866040518563ffffffff1660e01b8152600401612ebb949392919061536e565b6020604051808303816000875af1925050508015612ef757506040513d601f19601f82011682018060405250810190612ef491906153cf565b60015b612f7a573d8060008114612f27576040519150601f19603f3d011682016040523d82523d6000602084013e612f2c565b606091505b50600081511415612f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6990614cf1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fcf565b600190505b949350505050565b6060612fe282612420565b613021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130189061546e565b60405180910390fd5b600061302b613790565b9050600081511161304b5760405180602001604052806000815250613076565b806130558461307e565b60405160200161306692919061548e565b6040516020818303038152906040525b915050919050565b606060008214156130c6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131da565b600082905060005b600082146130f85780806130e190614870565b915050600a826130f19190614b76565b91506130ce565b60008167ffffffffffffffff81111561311457613113613d2f565b5b6040519080825280601f01601f1916602001820160405280156131465781602001600182028036833780820191505090505b5090505b600085146131d35760018261315f9190615177565b9150600a8561316e91906154b2565b603061317a91906144a0565b60f81b8183815181106131905761318f6154e3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131cc9190614b76565b945061314a565b8093505050505b919050565b60008082905060005b8451811015613287576000858281518110613206576132056154e3565b5b6020026020010151905080831161324757828160405160200161322a929190615533565b604051602081830303815290604052805190602001209250613273565b808360405160200161325a929190615533565b6040516020818303038152906040528051906020012092505b50808061327f90614870565b9150506131e8565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ff906155d1565b60405180910390fd5b61331181612420565b15613351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133489061563d565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156133b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ab906156cf565b60405180910390fd5b6133c16000858386613771565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134be919061509f565b6fffffffffffffffffffffffffffffffff1681526020018583602001516134e5919061509f565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561375457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136f46000888488612e4f565b613733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372a90614cf1565b60405180910390fd5b818061373e90614870565b925050808061374c90614870565b915050613683565b50806000819055506137696000878588613777565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b6060600e805461379f90614128565b80601f01602080910402602001604051908101604052809291908181526020018280546137cb90614128565b80156138185780601f106137ed57610100808354040283529160200191613818565b820191906000526020600020905b8154815290600101906020018083116137fb57829003601f168201915b5050505050905090565b82805461382e90614128565b90600052602060002090601f0160209004810192826138505760008555613897565b82601f1061386957805160ff1916838001178555613897565b82800160010185558215613897579182015b8281111561389657825182559160200191906001019061387b565b5b5090506138a491906138e2565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156138fb5760008160009055506001016138e3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61394881613913565b811461395357600080fd5b50565b6000813590506139658161393f565b92915050565b60006020828403121561398157613980613909565b5b600061398f84828501613956565b91505092915050565b60008115159050919050565b6139ad81613998565b82525050565b60006020820190506139c860008301846139a4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139f9826139ce565b9050919050565b613a09816139ee565b82525050565b6000602082019050613a246000830184613a00565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a64578082015181840152602081019050613a49565b83811115613a73576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a9582613a2a565b613a9f8185613a35565b9350613aaf818560208601613a46565b613ab881613a79565b840191505092915050565b60006020820190508181036000830152613add8184613a8a565b905092915050565b6000819050919050565b613af881613ae5565b8114613b0357600080fd5b50565b600081359050613b1581613aef565b92915050565b600060208284031215613b3157613b30613909565b5b6000613b3f84828501613b06565b91505092915050565b613b51816139ee565b8114613b5c57600080fd5b50565b600081359050613b6e81613b48565b92915050565b60008060408385031215613b8b57613b8a613909565b5b6000613b9985828601613b5f565b9250506020613baa85828601613b06565b9150509250929050565b613bbd81613ae5565b82525050565b6000602082019050613bd86000830184613bb4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c0357613c02613bde565b5b8235905067ffffffffffffffff811115613c2057613c1f613be3565b5b602083019150836020820283011115613c3c57613c3b613be8565b5b9250929050565b600080600060408486031215613c5c57613c5b613909565b5b6000613c6a86828701613b06565b935050602084013567ffffffffffffffff811115613c8b57613c8a61390e565b5b613c9786828701613bed565b92509250509250925092565b600080600060608486031215613cbc57613cbb613909565b5b6000613cca86828701613b5f565b9350506020613cdb86828701613b5f565b9250506040613cec86828701613b06565b9150509250925092565b6000819050919050565b613d0981613cf6565b82525050565b6000602082019050613d246000830184613d00565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d6782613a79565b810181811067ffffffffffffffff82111715613d8657613d85613d2f565b5b80604052505050565b6000613d996138ff565b9050613da58282613d5e565b919050565b600067ffffffffffffffff821115613dc557613dc4613d2f565b5b613dce82613a79565b9050602081019050919050565b82818337600083830152505050565b6000613dfd613df884613daa565b613d8f565b905082815260208101848484011115613e1957613e18613d2a565b5b613e24848285613ddb565b509392505050565b600082601f830112613e4157613e40613bde565b5b8135613e51848260208601613dea565b91505092915050565b600060208284031215613e7057613e6f613909565b5b600082013567ffffffffffffffff811115613e8e57613e8d61390e565b5b613e9a84828501613e2c565b91505092915050565b600060208284031215613eb957613eb8613909565b5b6000613ec784828501613b5f565b91505092915050565b613ed981613cf6565b8114613ee457600080fd5b50565b600081359050613ef681613ed0565b92915050565b600060208284031215613f1257613f11613909565b5b6000613f2084828501613ee7565b91505092915050565b613f3281613998565b8114613f3d57600080fd5b50565b600081359050613f4f81613f29565b92915050565b60008060408385031215613f6c57613f6b613909565b5b6000613f7a85828601613b5f565b9250506020613f8b85828601613f40565b9150509250929050565b600067ffffffffffffffff821115613fb057613faf613d2f565b5b613fb982613a79565b9050602081019050919050565b6000613fd9613fd484613f95565b613d8f565b905082815260208101848484011115613ff557613ff4613d2a565b5b614000848285613ddb565b509392505050565b600082601f83011261401d5761401c613bde565b5b813561402d848260208601613fc6565b91505092915050565b600080600080608085870312156140505761404f613909565b5b600061405e87828801613b5f565b945050602061406f87828801613b5f565b935050604061408087828801613b06565b925050606085013567ffffffffffffffff8111156140a1576140a061390e565b5b6140ad87828801614008565b91505092959194509250565b600080604083850312156140d0576140cf613909565b5b60006140de85828601613b5f565b92505060206140ef85828601613b5f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061414057607f821691505b60208210811415614154576141536140f9565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006141b6602d83613a35565b91506141c18261415a565b604082019050919050565b600060208201905081810360008301526141e5816141a9565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614248602283613a35565b9150614253826141ec565b604082019050919050565b600060208201905081810360008301526142778161423b565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006142da603983613a35565b91506142e58261427e565b604082019050919050565b60006020820190508181036000830152614309816142cd565b9050919050565b7f583a2050726573616c6520686173206e6f742073746172746564000000000000600082015250565b6000614346601a83613a35565b915061435182614310565b602082019050919050565b6000602082019050818103600083015261437581614339565b9050919050565b60008160601b9050919050565b60006143948261437c565b9050919050565b60006143a682614389565b9050919050565b6143be6143b9826139ee565b61439b565b82525050565b60006143d082846143ad565b60148201915081905092915050565b7f583a20596f7520617265206e6f7420656c696769626c6520666f72207468652060008201527f70726573616c6500000000000000000000000000000000000000000000000000602082015250565b600061443b602783613a35565b9150614446826143df565b604082019050919050565b6000602082019050818103600083015261446a8161442e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144ab82613ae5565b91506144b683613ae5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144eb576144ea614471565b5b828201905092915050565b7f583a2050726573616c65206c696d697420666f7220746869732077616c6c657460008201527f2072656163686564000000000000000000000000000000000000000000000000602082015250565b6000614552602883613a35565b915061455d826144f6565b604082019050919050565b6000602082019050818103600083015261458181614545565b9050919050565b7f583a2043616e6e6f742070757263686173652074686973206d616e7920746f6b60008201527f656e7320696e2061207472616e73616374696f6e000000000000000000000000602082015250565b60006145e4603483613a35565b91506145ef82614588565b604082019050919050565b60006020820190508181036000830152614613816145d7565b9050919050565b7f583a204d696e74696e6720776f756c6420657863656564206d6178207375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b6000614676602283613a35565b91506146818261461a565b604082019050919050565b600060208201905081810360008301526146a581614669565b9050919050565b7f583a204d757374206d696e74206174206c65617374206f6e6520746f6b656e00600082015250565b60006146e2601f83613a35565b91506146ed826146ac565b602082019050919050565b60006020820190508181036000830152614711816146d5565b9050919050565b600061472382613ae5565b915061472e83613ae5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561476757614766614471565b5b828202905092915050565b7f583a2045544820616d6f756e7420697320696e636f7272656374000000000000600082015250565b60006147a8601a83613a35565b91506147b382614772565b602082019050919050565b600060208201905081810360008301526147d78161479b565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061483a602283613a35565b9150614845826147de565b604082019050919050565b600060208201905081810360008301526148698161482d565b9050919050565b600061487b82613ae5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148ae576148ad614471565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614915602e83613a35565b9150614920826148b9565b604082019050919050565b6000602082019050818103600083015261494481614908565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614981602083613a35565b915061498c8261494b565b602082019050919050565b600060208201905081810360008301526149b081614974565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a13602383613a35565b9150614a1e826149b7565b604082019050919050565b60006020820190508181036000830152614a4281614a06565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614aa5602b83613a35565b9150614ab082614a49565b604082019050919050565b60006020820190508181036000830152614ad481614a98565b9050919050565b7f583a20496e737566666963656e742062616c616e636500000000000000000000600082015250565b6000614b11601683613a35565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b8182613ae5565b9150614b8c83613ae5565b925082614b9c57614b9b614b47565b5b828204905092915050565b7f583a205075626c69632073616c6520686173206e6f7420737461727465640000600082015250565b6000614bdd601e83613a35565b9150614be882614ba7565b602082019050919050565b60006020820190508181036000830152614c0c81614bd0565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614c49601a83613a35565b9150614c5482614c13565b602082019050919050565b60006020820190508181036000830152614c7881614c3c565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614cdb603383613a35565b9150614ce682614c7f565b604082019050919050565b60006020820190508181036000830152614d0a81614cce565b9050919050565b600081905092915050565b7f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008201527f732f516d56636a6e5538516947794c36686d35596235757758416d6863697a4c60208201527f616f33476e6d624171735044356971742f000000000000000000000000000000604082015250565b6000614d9e605183614d11565b9150614da982614d1c565b605182019050919050565b6000614dbf82613a2a565b614dc98185614d11565b9350614dd9818560208601613a46565b80840191505092915050565b6000614df082614d91565b9150614dfc8284614db4565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e63602683613a35565b9150614e6e82614e07565b604082019050919050565b60006020820190508181036000830152614e9281614e56565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614ef5603283613a35565b9150614f0082614e99565b604082019050919050565b60006020820190508181036000830152614f2481614ee8565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614f87602683613a35565b9150614f9282614f2b565b604082019050919050565b60006020820190508181036000830152614fb681614f7a565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615019602583613a35565b915061502482614fbd565b604082019050919050565b600060208201905081810360008301526150488161500c565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006150768261504f565b91506150818361504f565b92508282101561509457615093614471565b5b828203905092915050565b60006150aa8261504f565b91506150b58361504f565b9250826fffffffffffffffffffffffffffffffff038211156150da576150d9614471565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615141602a83613a35565b915061514c826150e5565b604082019050919050565b6000602082019050818103600083015261517081615134565b9050919050565b600061518282613ae5565b915061518d83613ae5565b9250828210156151a05761519f614471565b5b828203905092915050565b60006151b682613ae5565b915060008214156151ca576151c9614471565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615231602f83613a35565b915061523c826151d5565b604082019050919050565b6000602082019050818103600083015261526081615224565b9050919050565b600081905092915050565b50565b6000615282600083615267565b915061528d82615272565b600082019050919050565b60006152a382615275565b9150819050919050565b7f583a204661696c656420746f2077696474686472617720457468657200000000600082015250565b60006152e3601c83613a35565b91506152ee826152ad565b602082019050919050565b60006020820190508181036000830152615312816152d6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061534082615319565b61534a8185615324565b935061535a818560208601613a46565b61536381613a79565b840191505092915050565b60006080820190506153836000830187613a00565b6153906020830186613a00565b61539d6040830185613bb4565b81810360608301526153af8184615335565b905095945050505050565b6000815190506153c98161393f565b92915050565b6000602082840312156153e5576153e4613909565b5b60006153f3848285016153ba565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615458602f83613a35565b9150615463826153fc565b604082019050919050565b600060208201905081810360008301526154878161544b565b9050919050565b600061549a8285614db4565b91506154a68284614db4565b91508190509392505050565b60006154bd82613ae5565b91506154c883613ae5565b9250826154d8576154d7614b47565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b61552d61552882613cf6565b615512565b82525050565b600061553f828561551c565b60208201915061554f828461551c565b6020820191508190509392505050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006155bb602183613a35565b91506155c68261555f565b604082019050919050565b600060208201905081810360008301526155ea816155ae565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615627601d83613a35565b9150615632826155f1565b602082019050919050565b600060208201905081810360008301526156568161561a565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006156b9602283613a35565b91506156c48261565d565b604082019050919050565b600060208201905081810360008301526156e8816156ac565b905091905056fea26469706673582212201c4500802028826d592864179404972267d1151110546aa3db6fd1c94b4f5b2164736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80636352211e1161014f578063a035b1fe116100c1578063c87b56dd1161007a578063c87b56dd14610922578063d7224ba01461095f578063e985e9c51461098a578063ed1fc2a2146109c7578063f2fde38b146109de578063f47c84c514610a075761027d565b8063a035b1fe14610833578063a044c9871461085e578063a0712d6814610889578063a22cb465146108a5578063a2e91477146108ce578063b88d4fde146108f95761027d565b80637e44755b116101135780637e44755b14610747578063853828b6146107725780638da5cb5b146107895780639147dd1b146107b457806391b7f5ed146107df57806395d89b41146108085761027d565b80636352211e146106625780636c0360eb1461069f57806370a08231146106ca578063715018a6146107075780637cb647591461071e5761027d565b80632913daa0116101f35780634c0770f0116101ac5780634c0770f0146105685780634f6ccce71461059157806354214f69146105ce57806355f804b3146105f95780635a94133c146106225780635b8ad4291461064b5761027d565b80632913daa01461046c5780632eb4a7ab146104975780632f745c59146104c25780632f814575146104ff57806342842e0e14610516578063484b973c1461053f5761027d565b8063095ea7b311610245578063095ea7b31461037d57806309d42b30146103a65780630c0a6b5e146103d157806312c23bd8146103ed57806318160ddd1461041857806323b872dd146104435761027d565b806301ffc9a71461028257806303cf8a20146102bf57806304549d6f146102ea57806306fdde0314610315578063081812fc14610340575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a4919061396b565b610a32565b6040516102b691906139b3565b60405180910390f35b3480156102cb57600080fd5b506102d4610b7c565b6040516102e19190613a0f565b60405180910390f35b3480156102f657600080fd5b506102ff610b94565b60405161030c91906139b3565b60405180910390f35b34801561032157600080fd5b5061032a610ba7565b6040516103379190613ac3565b60405180910390f35b34801561034c57600080fd5b5061036760048036038101906103629190613b1b565b610c39565b6040516103749190613a0f565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190613b74565b610cbe565b005b3480156103b257600080fd5b506103bb610dd7565b6040516103c89190613bc3565b60405180910390f35b6103eb60048036038101906103e69190613c43565b610ddc565b005b3480156103f957600080fd5b50610402611114565b60405161040f9190613bc3565b60405180910390f35b34801561042457600080fd5b5061042d61111a565b60405161043a9190613bc3565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190613ca3565b611123565b005b34801561047857600080fd5b50610481611133565b60405161048e9190613bc3565b60405180910390f35b3480156104a357600080fd5b506104ac611157565b6040516104b99190613d0f565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190613b74565b61115d565b6040516104f69190613bc3565b60405180910390f35b34801561050b57600080fd5b5061051461135b565b005b34801561052257600080fd5b5061053d60048036038101906105389190613ca3565b611403565b005b34801561054b57600080fd5b5061056660048036038101906105619190613b74565b611423565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613b1b565b611547565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613b1b565b6115cd565b6040516105c59190613bc3565b60405180910390f35b3480156105da57600080fd5b506105e3611620565b6040516105f091906139b3565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190613e5a565b611633565b005b34801561062e57600080fd5b5061064960048036038101906106449190613b1b565b6116c9565b005b34801561065757600080fd5b50610660611762565b005b34801561066e57600080fd5b5061068960048036038101906106849190613b1b565b61180a565b6040516106969190613a0f565b60405180910390f35b3480156106ab57600080fd5b506106b4611820565b6040516106c19190613ac3565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190613ea3565b6118ae565b6040516106fe9190613bc3565b60405180910390f35b34801561071357600080fd5b5061071c611997565b005b34801561072a57600080fd5b5061074560048036038101906107409190613efc565b611a1f565b005b34801561075357600080fd5b5061075c611aa5565b6040516107699190613a0f565b60405180910390f35b34801561077e57600080fd5b50610787611abd565b005b34801561079557600080fd5b5061079e611c26565b6040516107ab9190613a0f565b60405180910390f35b3480156107c057600080fd5b506107c9611c50565b6040516107d69190613bc3565b60405180910390f35b3480156107eb57600080fd5b5061080660048036038101906108019190613b1b565b611c56565b005b34801561081457600080fd5b5061081d611cef565b60405161082a9190613ac3565b60405180910390f35b34801561083f57600080fd5b50610848611d81565b6040516108559190613bc3565b60405180910390f35b34801561086a57600080fd5b50610873611d87565b6040516108809190613a0f565b60405180910390f35b6108a3600480360381019061089e9190613b1b565b611d9f565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190613f55565b611f2f565b005b3480156108da57600080fd5b506108e36120b0565b6040516108f091906139b3565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190614036565b6120c3565b005b34801561092e57600080fd5b5061094960048036038101906109449190613b1b565b61211f565b6040516109569190613ac3565b60405180910390f35b34801561096b57600080fd5b50610974612176565b6040516109819190613bc3565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac91906140b9565b61217c565b6040516109be91906139b3565b60405180910390f35b3480156109d357600080fd5b506109dc612210565b005b3480156109ea57600080fd5b50610a056004803603810190610a009190613ea3565b6122b8565b005b348015610a1357600080fd5b50610a1c6123b0565b604051610a299190613bc3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b6557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b755750610b74826123b6565b5b9050919050565b73e640a158aa4d8681b5bc3bd41113173da47b159381565b600b60029054906101000a900460ff1681565b606060018054610bb690614128565b80601f0160208091040260200160405190810160405280929190818152602001828054610be290614128565b8015610c2f5780601f10610c0457610100808354040283529160200191610c2f565b820191906000526020600020905b815481529060010190602001808311610c1257829003601f168201915b5050505050905090565b6000610c4482612420565b610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a906141cc565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc98261180a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d319061425e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5961242d565b73ffffffffffffffffffffffffffffffffffffffff161480610d885750610d8781610d8261242d565b61217c565b5b610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe906142f0565b60405180910390fd5b610dd2838383612435565b505050565b601481565b600b60029054906101000a900460ff16610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229061435c565b60405180910390fd5b610e9f828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5433604051602001610e8491906143c4565b604051602081830303815290604052805190602001206124e7565b610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590614451565b60405180910390fd5b600d5483600c6000610eee61242d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f3391906144a0565b1115610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614568565b60405180910390fd5b6014831115610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf906145fa565b60405180910390fd5b6122b883610fc461111a565b610fce91906144a0565b111561100f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110069061468c565b60405180910390fd5b60008311611052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611049906146f8565b60405180910390fd5b3483600a546110619190614718565b146110a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611098906147be565b60405180910390fd5b6110b26110ac61242d565b846124fe565b82600c60006110bf61242d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461110891906144a0565b92505081905550505050565b600d5481565b60008054905090565b61112e83838361251c565b505050565b7f000000000000000000000000000000000000000000000000000000000000001481565b600f5481565b6000611168836118ae565b82106111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090614850565b60405180910390fd5b60006111b361111a565b905060008060005b83811015611319576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146112ad57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561130557868414156112f6578195505050505050611355565b838061130190614870565b9450505b50808061131190614870565b9150506111bb565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c9061492b565b60405180910390fd5b92915050565b61136361242d565b73ffffffffffffffffffffffffffffffffffffffff16611381611c26565b73ffffffffffffffffffffffffffffffffffffffff16146113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce90614997565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b61141e838383604051806020016040528060008152506120c3565b505050565b61142b61242d565b73ffffffffffffffffffffffffffffffffffffffff16611449611c26565b73ffffffffffffffffffffffffffffffffffffffff161461149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690614997565b60405180910390fd5b6122b8816114ab61111a565b6114b591906144a0565b11156114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed9061468c565b60405180910390fd5b60008111611539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611530906146f8565b60405180910390fd5b61154382826124fe565b5050565b61154f61242d565b73ffffffffffffffffffffffffffffffffffffffff1661156d611c26565b73ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90614997565b60405180910390fd5b80600d8190555050565b60006115d761111a565b8210611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160f90614a29565b60405180910390fd5b819050919050565b600b60009054906101000a900460ff1681565b61163b61242d565b73ffffffffffffffffffffffffffffffffffffffff16611659611c26565b73ffffffffffffffffffffffffffffffffffffffff16146116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690614997565b60405180910390fd5b80600e90805190602001906116c5929190613822565b5050565b6116d161242d565b73ffffffffffffffffffffffffffffffffffffffff166116ef611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90614997565b60405180910390fd5b670de0b6b3a7640000816117599190614718565b600a8190555050565b61176a61242d565b73ffffffffffffffffffffffffffffffffffffffff16611788611c26565b73ffffffffffffffffffffffffffffffffffffffff16146117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614997565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b600061181582612ad5565b600001519050919050565b600e805461182d90614128565b80601f016020809104026020016040519081016040528092919081815260200182805461185990614128565b80156118a65780601f1061187b576101008083540402835291602001916118a6565b820191906000526020600020905b81548152906001019060200180831161188957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561191f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191690614abb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61199f61242d565b73ffffffffffffffffffffffffffffffffffffffff166119bd611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a90614997565b60405180910390fd5b611a1d6000612cd8565b565b611a2761242d565b73ffffffffffffffffffffffffffffffffffffffff16611a45611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290614997565b60405180910390fd5b80600f8190555050565b7394a1801b341df84de851c3383f2103d182864b6581565b611ac561242d565b73ffffffffffffffffffffffffffffffffffffffff16611ae3611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3090614997565b60405180910390fd5b600047905060008111611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890614b27565b60405180910390fd5b611bb77349b3cb75b94e06b246d928f691709a7c816332826003600184611ba89190614718565b611bb29190614b76565b612d9e565b611bed73e640a158aa4d8681b5bc3bd41113173da47b15936003600184611bde9190614718565b611be89190614b76565b612d9e565b611c237394a1801b341df84de851c3383f2103d182864b656003600184611c149190614718565b611c1e9190614b76565b612d9e565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b611c5e61242d565b73ffffffffffffffffffffffffffffffffffffffff16611c7c611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990614997565b60405180910390fd5b670de0b6b3a764000081611ce69190614718565b60098190555050565b606060028054611cfe90614128565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2a90614128565b8015611d775780601f10611d4c57610100808354040283529160200191611d77565b820191906000526020600020905b815481529060010190602001808311611d5a57829003601f168201915b5050505050905090565b60095481565b7349b3cb75b94e06b246d928f691709a7c8163328281565b600b60019054906101000a900460ff16611dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de590614bf3565b60405180910390fd5b6014811115611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e29906145fa565b60405180910390fd5b6122b881611e3e61111a565b611e4891906144a0565b1115611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e809061468c565b60405180910390fd5b60008111611ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec3906146f8565b60405180910390fd5b3481600954611edb9190614718565b14611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f12906147be565b60405180910390fd5b611f2c611f2661242d565b826124fe565b50565b611f3761242d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c90614c5f565b60405180910390fd5b8060066000611fb261242d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661205f61242d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120a491906139b3565b60405180910390a35050565b600b60019054906101000a900460ff1681565b6120ce84848461251c565b6120da84848484612e4f565b612119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211090614cf1565b60405180910390fd5b50505050565b6060600b60009054906101000a900460ff16156121465761213f82612fd7565b9050612171565b61214f8261307e565b60405160200161215f9190614de5565b60405160208183030381529060405290505b919050565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61221861242d565b73ffffffffffffffffffffffffffffffffffffffff16612236611c26565b73ffffffffffffffffffffffffffffffffffffffff161461228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228390614997565b60405180910390fd5b600b60029054906101000a900460ff1615600b60026101000a81548160ff021916908315150217905550565b6122c061242d565b73ffffffffffffffffffffffffffffffffffffffff166122de611c26565b73ffffffffffffffffffffffffffffffffffffffff1614612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90614997565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239b90614e79565b60405180910390fd5b6123ad81612cd8565b50565b6122b881565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000826124f485846131df565b1490509392505050565b612518828260405180602001604052806000815250613292565b5050565b600061252782612ad5565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661254e61242d565b73ffffffffffffffffffffffffffffffffffffffff1614806125aa575061257361242d565b73ffffffffffffffffffffffffffffffffffffffff1661259284610c39565b73ffffffffffffffffffffffffffffffffffffffff16145b806125c657506125c582600001516125c061242d565b61217c565b5b905080612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff90614f0b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461267a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267190614f9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e19061502f565b60405180910390fd5b6126f78585856001613771565b6127076000848460000151612435565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612775919061506b565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612819919061509f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461291f91906144a0565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a655761299581612420565b15612a64576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612acd8686866001613777565b505050505050565b612add6138a8565b612ae682612420565b612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c90615157565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000148310612b895760017f000000000000000000000000000000000000000000000000000000000000001484612b7c9190615177565b612b8691906144a0565b90505b60008390505b818110612c97576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c8357809350505050612cd3565b508080612c8f906151ab565b915050612b8f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cca90615247565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612dc490615298565b60006040518083038185875af1925050503d8060008114612e01576040519150601f19603f3d011682016040523d82523d6000602084013e612e06565b606091505b5050905080612e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e41906152f9565b60405180910390fd5b505050565b6000612e708473ffffffffffffffffffffffffffffffffffffffff1661377d565b15612fca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9961242d565b8786866040518563ffffffff1660e01b8152600401612ebb949392919061536e565b6020604051808303816000875af1925050508015612ef757506040513d601f19601f82011682018060405250810190612ef491906153cf565b60015b612f7a573d8060008114612f27576040519150601f19603f3d011682016040523d82523d6000602084013e612f2c565b606091505b50600081511415612f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6990614cf1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fcf565b600190505b949350505050565b6060612fe282612420565b613021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130189061546e565b60405180910390fd5b600061302b613790565b9050600081511161304b5760405180602001604052806000815250613076565b806130558461307e565b60405160200161306692919061548e565b6040516020818303038152906040525b915050919050565b606060008214156130c6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131da565b600082905060005b600082146130f85780806130e190614870565b915050600a826130f19190614b76565b91506130ce565b60008167ffffffffffffffff81111561311457613113613d2f565b5b6040519080825280601f01601f1916602001820160405280156131465781602001600182028036833780820191505090505b5090505b600085146131d35760018261315f9190615177565b9150600a8561316e91906154b2565b603061317a91906144a0565b60f81b8183815181106131905761318f6154e3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131cc9190614b76565b945061314a565b8093505050505b919050565b60008082905060005b8451811015613287576000858281518110613206576132056154e3565b5b6020026020010151905080831161324757828160405160200161322a929190615533565b604051602081830303815290604052805190602001209250613273565b808360405160200161325a929190615533565b6040516020818303038152906040528051906020012092505b50808061327f90614870565b9150506131e8565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ff906155d1565b60405180910390fd5b61331181612420565b15613351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133489061563d565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000148311156133b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ab906156cf565b60405180910390fd5b6133c16000858386613771565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134be919061509f565b6fffffffffffffffffffffffffffffffff1681526020018583602001516134e5919061509f565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561375457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136f46000888488612e4f565b613733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372a90614cf1565b60405180910390fd5b818061373e90614870565b925050808061374c90614870565b915050613683565b50806000819055506137696000878588613777565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b6060600e805461379f90614128565b80601f01602080910402602001604051908101604052809291908181526020018280546137cb90614128565b80156138185780601f106137ed57610100808354040283529160200191613818565b820191906000526020600020905b8154815290600101906020018083116137fb57829003601f168201915b5050505050905090565b82805461382e90614128565b90600052602060002090601f0160209004810192826138505760008555613897565b82601f1061386957805160ff1916838001178555613897565b82800160010185558215613897579182015b8281111561389657825182559160200191906001019061387b565b5b5090506138a491906138e2565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156138fb5760008160009055506001016138e3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61394881613913565b811461395357600080fd5b50565b6000813590506139658161393f565b92915050565b60006020828403121561398157613980613909565b5b600061398f84828501613956565b91505092915050565b60008115159050919050565b6139ad81613998565b82525050565b60006020820190506139c860008301846139a4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139f9826139ce565b9050919050565b613a09816139ee565b82525050565b6000602082019050613a246000830184613a00565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a64578082015181840152602081019050613a49565b83811115613a73576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a9582613a2a565b613a9f8185613a35565b9350613aaf818560208601613a46565b613ab881613a79565b840191505092915050565b60006020820190508181036000830152613add8184613a8a565b905092915050565b6000819050919050565b613af881613ae5565b8114613b0357600080fd5b50565b600081359050613b1581613aef565b92915050565b600060208284031215613b3157613b30613909565b5b6000613b3f84828501613b06565b91505092915050565b613b51816139ee565b8114613b5c57600080fd5b50565b600081359050613b6e81613b48565b92915050565b60008060408385031215613b8b57613b8a613909565b5b6000613b9985828601613b5f565b9250506020613baa85828601613b06565b9150509250929050565b613bbd81613ae5565b82525050565b6000602082019050613bd86000830184613bb4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c0357613c02613bde565b5b8235905067ffffffffffffffff811115613c2057613c1f613be3565b5b602083019150836020820283011115613c3c57613c3b613be8565b5b9250929050565b600080600060408486031215613c5c57613c5b613909565b5b6000613c6a86828701613b06565b935050602084013567ffffffffffffffff811115613c8b57613c8a61390e565b5b613c9786828701613bed565b92509250509250925092565b600080600060608486031215613cbc57613cbb613909565b5b6000613cca86828701613b5f565b9350506020613cdb86828701613b5f565b9250506040613cec86828701613b06565b9150509250925092565b6000819050919050565b613d0981613cf6565b82525050565b6000602082019050613d246000830184613d00565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d6782613a79565b810181811067ffffffffffffffff82111715613d8657613d85613d2f565b5b80604052505050565b6000613d996138ff565b9050613da58282613d5e565b919050565b600067ffffffffffffffff821115613dc557613dc4613d2f565b5b613dce82613a79565b9050602081019050919050565b82818337600083830152505050565b6000613dfd613df884613daa565b613d8f565b905082815260208101848484011115613e1957613e18613d2a565b5b613e24848285613ddb565b509392505050565b600082601f830112613e4157613e40613bde565b5b8135613e51848260208601613dea565b91505092915050565b600060208284031215613e7057613e6f613909565b5b600082013567ffffffffffffffff811115613e8e57613e8d61390e565b5b613e9a84828501613e2c565b91505092915050565b600060208284031215613eb957613eb8613909565b5b6000613ec784828501613b5f565b91505092915050565b613ed981613cf6565b8114613ee457600080fd5b50565b600081359050613ef681613ed0565b92915050565b600060208284031215613f1257613f11613909565b5b6000613f2084828501613ee7565b91505092915050565b613f3281613998565b8114613f3d57600080fd5b50565b600081359050613f4f81613f29565b92915050565b60008060408385031215613f6c57613f6b613909565b5b6000613f7a85828601613b5f565b9250506020613f8b85828601613f40565b9150509250929050565b600067ffffffffffffffff821115613fb057613faf613d2f565b5b613fb982613a79565b9050602081019050919050565b6000613fd9613fd484613f95565b613d8f565b905082815260208101848484011115613ff557613ff4613d2a565b5b614000848285613ddb565b509392505050565b600082601f83011261401d5761401c613bde565b5b813561402d848260208601613fc6565b91505092915050565b600080600080608085870312156140505761404f613909565b5b600061405e87828801613b5f565b945050602061406f87828801613b5f565b935050604061408087828801613b06565b925050606085013567ffffffffffffffff8111156140a1576140a061390e565b5b6140ad87828801614008565b91505092959194509250565b600080604083850312156140d0576140cf613909565b5b60006140de85828601613b5f565b92505060206140ef85828601613b5f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061414057607f821691505b60208210811415614154576141536140f9565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006141b6602d83613a35565b91506141c18261415a565b604082019050919050565b600060208201905081810360008301526141e5816141a9565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614248602283613a35565b9150614253826141ec565b604082019050919050565b600060208201905081810360008301526142778161423b565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006142da603983613a35565b91506142e58261427e565b604082019050919050565b60006020820190508181036000830152614309816142cd565b9050919050565b7f583a2050726573616c6520686173206e6f742073746172746564000000000000600082015250565b6000614346601a83613a35565b915061435182614310565b602082019050919050565b6000602082019050818103600083015261437581614339565b9050919050565b60008160601b9050919050565b60006143948261437c565b9050919050565b60006143a682614389565b9050919050565b6143be6143b9826139ee565b61439b565b82525050565b60006143d082846143ad565b60148201915081905092915050565b7f583a20596f7520617265206e6f7420656c696769626c6520666f72207468652060008201527f70726573616c6500000000000000000000000000000000000000000000000000602082015250565b600061443b602783613a35565b9150614446826143df565b604082019050919050565b6000602082019050818103600083015261446a8161442e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144ab82613ae5565b91506144b683613ae5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144eb576144ea614471565b5b828201905092915050565b7f583a2050726573616c65206c696d697420666f7220746869732077616c6c657460008201527f2072656163686564000000000000000000000000000000000000000000000000602082015250565b6000614552602883613a35565b915061455d826144f6565b604082019050919050565b6000602082019050818103600083015261458181614545565b9050919050565b7f583a2043616e6e6f742070757263686173652074686973206d616e7920746f6b60008201527f656e7320696e2061207472616e73616374696f6e000000000000000000000000602082015250565b60006145e4603483613a35565b91506145ef82614588565b604082019050919050565b60006020820190508181036000830152614613816145d7565b9050919050565b7f583a204d696e74696e6720776f756c6420657863656564206d6178207375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b6000614676602283613a35565b91506146818261461a565b604082019050919050565b600060208201905081810360008301526146a581614669565b9050919050565b7f583a204d757374206d696e74206174206c65617374206f6e6520746f6b656e00600082015250565b60006146e2601f83613a35565b91506146ed826146ac565b602082019050919050565b60006020820190508181036000830152614711816146d5565b9050919050565b600061472382613ae5565b915061472e83613ae5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561476757614766614471565b5b828202905092915050565b7f583a2045544820616d6f756e7420697320696e636f7272656374000000000000600082015250565b60006147a8601a83613a35565b91506147b382614772565b602082019050919050565b600060208201905081810360008301526147d78161479b565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061483a602283613a35565b9150614845826147de565b604082019050919050565b600060208201905081810360008301526148698161482d565b9050919050565b600061487b82613ae5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148ae576148ad614471565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614915602e83613a35565b9150614920826148b9565b604082019050919050565b6000602082019050818103600083015261494481614908565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614981602083613a35565b915061498c8261494b565b602082019050919050565b600060208201905081810360008301526149b081614974565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a13602383613a35565b9150614a1e826149b7565b604082019050919050565b60006020820190508181036000830152614a4281614a06565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614aa5602b83613a35565b9150614ab082614a49565b604082019050919050565b60006020820190508181036000830152614ad481614a98565b9050919050565b7f583a20496e737566666963656e742062616c616e636500000000000000000000600082015250565b6000614b11601683613a35565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b8182613ae5565b9150614b8c83613ae5565b925082614b9c57614b9b614b47565b5b828204905092915050565b7f583a205075626c69632073616c6520686173206e6f7420737461727465640000600082015250565b6000614bdd601e83613a35565b9150614be882614ba7565b602082019050919050565b60006020820190508181036000830152614c0c81614bd0565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614c49601a83613a35565b9150614c5482614c13565b602082019050919050565b60006020820190508181036000830152614c7881614c3c565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614cdb603383613a35565b9150614ce682614c7f565b604082019050919050565b60006020820190508181036000830152614d0a81614cce565b9050919050565b600081905092915050565b7f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008201527f732f516d56636a6e5538516947794c36686d35596235757758416d6863697a4c60208201527f616f33476e6d624171735044356971742f000000000000000000000000000000604082015250565b6000614d9e605183614d11565b9150614da982614d1c565b605182019050919050565b6000614dbf82613a2a565b614dc98185614d11565b9350614dd9818560208601613a46565b80840191505092915050565b6000614df082614d91565b9150614dfc8284614db4565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e63602683613a35565b9150614e6e82614e07565b604082019050919050565b60006020820190508181036000830152614e9281614e56565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614ef5603283613a35565b9150614f0082614e99565b604082019050919050565b60006020820190508181036000830152614f2481614ee8565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614f87602683613a35565b9150614f9282614f2b565b604082019050919050565b60006020820190508181036000830152614fb681614f7a565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615019602583613a35565b915061502482614fbd565b604082019050919050565b600060208201905081810360008301526150488161500c565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006150768261504f565b91506150818361504f565b92508282101561509457615093614471565b5b828203905092915050565b60006150aa8261504f565b91506150b58361504f565b9250826fffffffffffffffffffffffffffffffff038211156150da576150d9614471565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615141602a83613a35565b915061514c826150e5565b604082019050919050565b6000602082019050818103600083015261517081615134565b9050919050565b600061518282613ae5565b915061518d83613ae5565b9250828210156151a05761519f614471565b5b828203905092915050565b60006151b682613ae5565b915060008214156151ca576151c9614471565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615231602f83613a35565b915061523c826151d5565b604082019050919050565b6000602082019050818103600083015261526081615224565b9050919050565b600081905092915050565b50565b6000615282600083615267565b915061528d82615272565b600082019050919050565b60006152a382615275565b9150819050919050565b7f583a204661696c656420746f2077696474686472617720457468657200000000600082015250565b60006152e3601c83613a35565b91506152ee826152ad565b602082019050919050565b60006020820190508181036000830152615312816152d6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061534082615319565b61534a8185615324565b935061535a818560208601613a46565b61536381613a79565b840191505092915050565b60006080820190506153836000830187613a00565b6153906020830186613a00565b61539d6040830185613bb4565b81810360608301526153af8184615335565b905095945050505050565b6000815190506153c98161393f565b92915050565b6000602082840312156153e5576153e4613909565b5b60006153f3848285016153ba565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615458602f83613a35565b9150615463826153fc565b604082019050919050565b600060208201905081810360008301526154878161544b565b9050919050565b600061549a8285614db4565b91506154a68284614db4565b91508190509392505050565b60006154bd82613ae5565b91506154c883613ae5565b9250826154d8576154d7614b47565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b61552d61552882613cf6565b615512565b82525050565b600061553f828561551c565b60208201915061554f828461551c565b6020820191508190509392505050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006155bb602183613a35565b91506155c68261555f565b604082019050919050565b600060208201905081810360008301526155ea816155ae565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615627601d83613a35565b9150615632826155f1565b602082019050919050565b600060208201905081810360008301526156568161561a565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006156b9602283613a35565b91506156c48261565d565b604082019050919050565b600060208201905081810360008301526156e8816156ac565b905091905056fea26469706673582212201c4500802028826d592864179404972267d1151110546aa3db6fd1c94b4f5b2164736f6c634300080a0033

Deployed Bytecode Sourcemap

49074:5283:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36793:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49360:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49700:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38519:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40044:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39607:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49234:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51780:861;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49797:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35357:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40894:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34235:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49877:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35985:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50150:111;;;;;;;;;;;;;:::i;:::-;;41099:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53546:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51424:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35520:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49619:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50269:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50607:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50733:86;;;;;;;;;;;;;:::i;:::-;;38342:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49844:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37219:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14697:103;;;;;;;;;;;;;:::i;:::-;;50381:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49282:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53858:293;;;;;;;;;;;;;:::i;:::-;;14046:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49559:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50495:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38674:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49518:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49438:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52811:504;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40312:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49656:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41319:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50935:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45650:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40649:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50040:102;;;;;;;;;;;;;:::i;:::-;;14955:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49186:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36793:370;36920:4;36965:25;36950:40;;;:11;:40;;;;:99;;;;37016:33;37001:48;;;:11;:48;;;;36950:99;:160;;;;37075:35;37060:50;;;:11;:50;;;;36950:160;:207;;;;37121:36;37145:11;37121:23;:36::i;:::-;36950:207;36936:221;;36793:370;;;:::o;49360:71::-;49389:42;49360:71;:::o;49700:34::-;;;;;;;;;;;;;:::o;38519:94::-;38573:13;38602:5;38595:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38519:94;:::o;40044:204::-;40112:7;40136:16;40144:7;40136;:16::i;:::-;40128:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40218:15;:24;40234:7;40218:24;;;;;;;;;;;;;;;;;;;;;40211:31;;40044:204;;;:::o;39607:379::-;39676:13;39692:24;39708:7;39692:15;:24::i;:::-;39676:40;;39737:5;39731:11;;:2;:11;;;;39723:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39822:5;39806:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;39831:37;39848:5;39855:12;:10;:12::i;:::-;39831:16;:37::i;:::-;39806:62;39790:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;39952:28;39961:2;39965:7;39974:5;39952:8;:28::i;:::-;39669:317;39607:379;;:::o;49234:41::-;49273:2;49234:41;:::o;51780:861::-;51885:14;;;;;;;;;;;51877:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51949:84;51968:11;;51949:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51981:10;;52020;52003:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51993:39;;;;;;51949:18;:84::i;:::-;51941:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;52136:19;;52126:6;52096:13;:27;52110:12;:10;:12::i;:::-;52096:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:59;;52088:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;49273:2;52219:6;:22;;52211:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49223:4;52333:6;52317:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;52309:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52420:1;52411:6;:10;52403:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;52501:9;52491:6;52476:12;;:21;;;;:::i;:::-;:34;52468:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52554:31;52564:12;:10;:12::i;:::-;52578:6;52554:9;:31::i;:::-;52627:6;52596:13;:27;52610:12;:10;:12::i;:::-;52596:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;51780:861;;;:::o;49797:38::-;;;;:::o;35357:94::-;35410:7;35433:12;;35426:19;;35357:94;:::o;40894:142::-;41002:28;41012:4;41018:2;41022:7;41002:9;:28::i;:::-;40894:142;;;:::o;34235:37::-;;;:::o;49877:94::-;;;;:::o;35985:744::-;36094:7;36129:16;36139:5;36129:9;:16::i;:::-;36121:5;:24;36113:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36191:22;36216:13;:11;:13::i;:::-;36191:38;;36236:19;36266:25;36316:9;36311:350;36335:14;36331:1;:18;36311:350;;;36365:31;36399:11;:14;36411:1;36399:14;;;;;;;;;;;36365:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36452:1;36426:28;;:9;:14;;;:28;;;36422:89;;36487:9;:14;;;36467:34;;36422:89;36544:5;36523:26;;:17;:26;;;36519:135;;;36581:5;36566:11;:20;36562:59;;;36608:1;36601:8;;;;;;;;;36562:59;36631:13;;;;;:::i;:::-;;;;36519:135;36356:305;36351:3;;;;;:::i;:::-;;;;36311:350;;;;36667:56;;;;;;;;;;:::i;:::-;;;;;;;;35985:744;;;;;:::o;50150:111::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50236:17:::1;;;;;;;;;;;50235:18;50215:17;;:38;;;;;;;;;;;;;;;;;;50150:111::o:0;41099:157::-;41211:39;41228:4;41234:2;41238:7;41211:39;;;;;;;;;;;;:16;:39::i;:::-;41099:157;;;:::o;53546:267::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49223:4:::1;53647:6;53631:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;53623:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53734:1;53725:6;:10;53717:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53784:21;53794:2;53798:6;53784:9;:21::i;:::-;53546:267:::0;;:::o;51424:148::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51541:23:::1;51519:19;:45;;;;51424:148:::0;:::o;35520:177::-;35587:7;35619:13;:11;:13::i;:::-;35611:5;:21;35603:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;35686:5;35679:12;;35520:177;;;:::o;49619:30::-;;;;;;;;;;;;;:::o;50269:106::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50356:11:::1;50346:7;:21;;;;;;;;;;;;:::i;:::-;;50269:106:::0;:::o;50607:118::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50709:7:::1;50696:9;:21;;;;:::i;:::-;50681:12;:36;;;;50607:118:::0;:::o;50733:86::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50801:10:::1;;;;;;;;;;;50800:11;50787:10;;:24;;;;;;;;;;;;;;;;;;50733:86::o:0;38342:118::-;38406:7;38429:20;38441:7;38429:11;:20::i;:::-;:25;;;38422:32;;38342:118;;;:::o;49844:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37219:211::-;37283:7;37324:1;37307:19;;:5;:19;;;;37299:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37396:12;:19;37409:5;37396:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37388:36;;37381:43;;37219:211;;;:::o;14697:103::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14762:30:::1;14789:1;14762:18;:30::i;:::-;14697:103::o:0;50381:106::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50468:11:::1;50455:10;:24;;;;50381:106:::0;:::o;49282:71::-;49311:42;49282:71;:::o;53858:293::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53909:15:::1;53927:21;53909:39;;53977:1;53967:7;:11;53959:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;54016:35;49467:42;54048:1;54043;54033:7;:11;;;;:::i;:::-;54032:17;;;;:::i;:::-;54016:10;:35::i;:::-;54062;49389:42;54094:1;54089;54079:7;:11;;;;:::i;:::-;54078:17;;;;:::i;:::-;54062:10;:35::i;:::-;54108;49311:42;54140:1;54135;54125:7;:11;;;;:::i;:::-;54124:17;;;;:::i;:::-;54108:10;:35::i;:::-;53898:253;53858:293::o:0;14046:87::-;14092:7;14119:6;;;;;;;;;;;14112:13;;14046:87;:::o;49559:41::-;;;;:::o;50495:104::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50583:7:::1;50570:9;:21;;;;:::i;:::-;50562:5;:29;;;;50495:104:::0;:::o;38674:98::-;38730:13;38759:7;38752:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38674:98;:::o;49518:34::-;;;;:::o;49438:71::-;49467:42;49438:71;:::o;52811:504::-;52877:17;;;;;;;;;;;52869:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;49273:2;52948:6;:22;;52940:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49223:4;53062:6;53046:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;53038:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53149:1;53140:6;:10;53132:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53223:9;53213:6;53205:5;;:14;;;;:::i;:::-;:27;53197:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53276:31;53286:12;:10;:12::i;:::-;53300:6;53276:9;:31::i;:::-;52811:504;:::o;40312:274::-;40415:12;:10;:12::i;:::-;40403:24;;:8;:24;;;;40395:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40512:8;40467:18;:32;40486:12;:10;:12::i;:::-;40467:32;;;;;;;;;;;;;;;:42;40500:8;40467:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;40561:8;40532:48;;40547:12;:10;:12::i;:::-;40532:48;;;40571:8;40532:48;;;;;;:::i;:::-;;;;;;;;40312:274;;:::o;49656:37::-;;;;;;;;;;;;;:::o;41319:311::-;41456:28;41466:4;41472:2;41476:7;41456:9;:28::i;:::-;41507:48;41530:4;41536:2;41540:7;41549:5;41507:22;:48::i;:::-;41491:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;41319:311;;;;:::o;50935:365::-;51008:13;51038:10;;;;;;;;;;;51034:259;;;51072:23;51087:7;51072:14;:23::i;:::-;51065:30;;;;51034:259;51261:18;:7;:16;:18::i;:::-;51159:121;;;;;;;;:::i;:::-;;;;;;;;;;;;;51128:153;;50935:365;;;;:::o;45650:43::-;;;;:::o;40649:186::-;40771:4;40794:18;:25;40813:5;40794:25;;;;;;;;;;;;;;;:35;40820:8;40794:35;;;;;;;;;;;;;;;;;;;;;;;;;40787:42;;40649:186;;;;:::o;50040:102::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50120:14:::1;;;;;;;;;;;50119:15;50102:14;;:32;;;;;;;;;;;;;;;;;;50040:102::o:0;14955:201::-;14277:12;:10;:12::i;:::-;14266:23;;:7;:5;:7::i;:::-;:23;;;14258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15064:1:::1;15044:22;;:8;:22;;;;15036:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15120:28;15139:8;15120:18;:28::i;:::-;14955:201:::0;:::o;49186:41::-;49223:4;49186:41;:::o;26478:157::-;26563:4;26602:25;26587:40;;;:11;:40;;;;26580:47;;26478:157;;;:::o;41869:105::-;41926:4;41956:12;;41946:7;:22;41939:29;;41869:105;;;:::o;12770:98::-;12823:7;12850:10;12843:17;;12770:98;:::o;45472:172::-;45596:2;45569:15;:24;45585:7;45569:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45630:7;45626:2;45610:28;;45619:5;45610:28;;;;;;;;;;;;45472:172;;;:::o;1680:190::-;1805:4;1858;1829:25;1842:5;1849:4;1829:12;:25::i;:::-;:33;1822:40;;1680:190;;;;;:::o;41980:98::-;42045:27;42055:2;42059:8;42045:27;;;;;;;;;;;;:9;:27::i;:::-;41980:98;;:::o;43837:1529::-;43934:35;43972:20;43984:7;43972:11;:20::i;:::-;43934:58;;44001:22;44043:13;:18;;;44027:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;44096:12;:10;:12::i;:::-;44072:36;;:20;44084:7;44072:11;:20::i;:::-;:36;;;44027:81;:142;;;;44119:50;44136:13;:18;;;44156:12;:10;:12::i;:::-;44119:16;:50::i;:::-;44027:142;44001:169;;44195:17;44179:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;44327:4;44305:26;;:13;:18;;;:26;;;44289:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;44416:1;44402:16;;:2;:16;;;;44394:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44469:43;44491:4;44497:2;44501:7;44510:1;44469:21;:43::i;:::-;44569:49;44586:1;44590:7;44599:13;:18;;;44569:8;:49::i;:::-;44657:1;44627:12;:18;44640:4;44627:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44693:1;44665:12;:16;44678:2;44665:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44724:43;;;;;;;;44739:2;44724:43;;;;;;44750:15;44724:43;;;;;44701:11;:20;44713:7;44701:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44995:19;45027:1;45017:7;:11;;;;:::i;:::-;44995:33;;45080:1;45039:43;;:11;:24;45051:11;45039:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;45035:236;;;45097:20;45105:11;45097:7;:20::i;:::-;45093:171;;;45157:97;;;;;;;;45184:13;:18;;;45157:97;;;;;;45215:13;:28;;;45157:97;;;;;45130:11;:24;45142:11;45130:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45093:171;45035:236;45303:7;45299:2;45284:27;;45293:4;45284:27;;;;;;;;;;;;45318:42;45339:4;45345:2;45349:7;45358:1;45318:20;:42::i;:::-;43927:1439;;;43837:1529;;;:::o;37682:606::-;37758:21;;:::i;:::-;37799:16;37807:7;37799;:16::i;:::-;37791:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;37871:26;37919:12;37908:7;:23;37904:93;;37988:1;37973:12;37963:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;37942:47;;37904:93;38010:12;38025:7;38010:22;;38005:212;38042:18;38034:4;:26;38005:212;;38079:31;38113:11;:17;38125:4;38113:17;;;;;;;;;;;38079:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38169:1;38143:28;;:9;:14;;;:28;;;38139:71;;38191:9;38184:16;;;;;;;38139:71;38070:147;38062:6;;;;;:::i;:::-;;;;38005:212;;;;38225:57;;;;;;;;;;:::i;:::-;;;;;;;;37682:606;;;;:::o;15316:191::-;15390:16;15409:6;;;;;;;;;;;15390:25;;15435:8;15426:6;;:17;;;;;;;;;;;;;;;;;;15490:8;15459:40;;15480:8;15459:40;;;;;;;;;;;;15379:128;15316:191;:::o;54159:193::-;54234:12;54252:8;:13;;54273:7;54252:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54233:52;;;54304:7;54296:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;54222:130;54159:193;;:::o;47183:690::-;47320:4;47337:15;:2;:13;;;:15::i;:::-;47333:535;;;47392:2;47376:36;;;47413:12;:10;:12::i;:::-;47427:4;47433:7;47442:5;47376:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47363:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47624:1;47607:6;:13;:18;47603:215;;;47640:61;;;;;;;;;;:::i;:::-;;;;;;;;47603:215;47786:6;47780:13;47771:6;47767:2;47763:15;47756:38;47363:464;47508:45;;;47498:55;;;:6;:55;;;;47491:62;;;;;47333:535;47856:4;47849:11;;47183:690;;;;;;;:::o;38835:394::-;38933:13;38974:16;38982:7;38974;:16::i;:::-;38958:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;39064:21;39088:10;:8;:10::i;:::-;39064:34;;39143:1;39125:7;39119:21;:25;:104;;;;;;;;;;;;;;;;;39180:7;39189:18;:7;:16;:18::i;:::-;39163:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39119:104;39105:118;;;38835:394;;;:::o;10332:723::-;10388:13;10618:1;10609:5;:10;10605:53;;;10636:10;;;;;;;;;;;;;;;;;;;;;10605:53;10668:12;10683:5;10668:20;;10699:14;10724:78;10739:1;10731:4;:9;10724:78;;10757:8;;;;;:::i;:::-;;;;10788:2;10780:10;;;;;:::i;:::-;;;10724:78;;;10812:19;10844:6;10834:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10812:39;;10862:154;10878:1;10869:5;:10;10862:154;;10906:1;10896:11;;;;;:::i;:::-;;;10973:2;10965:5;:10;;;;:::i;:::-;10952:2;:24;;;;:::i;:::-;10939:39;;10922:6;10929;10922:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11002:2;10993:11;;;;;:::i;:::-;;;10862:154;;;11040:6;11026:21;;;;;10332:723;;;;:::o;2232:701::-;2315:7;2335:20;2358:4;2335:27;;2378:9;2373:523;2397:5;:12;2393:1;:16;2373:523;;;2431:20;2454:5;2460:1;2454:8;;;;;;;;:::i;:::-;;;;;;;;2431:31;;2497:12;2481;:28;2477:408;;2651:12;2665;2634:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2624:55;;;;;;2609:70;;2477:408;;;2841:12;2855;2824:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2814:55;;;;;;2799:70;;2477:408;2416:480;2411:3;;;;;:::i;:::-;;;;2373:523;;;;2913:12;2906:19;;;2232:701;;;;:::o;42333:1272::-;42438:20;42461:12;;42438:35;;42502:1;42488:16;;:2;:16;;;;42480:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;42679:21;42687:12;42679:7;:21::i;:::-;42678:22;42670:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42761:12;42749:8;:24;;42741:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;42821:61;42851:1;42855:2;42859:12;42873:8;42821:21;:61::i;:::-;42891:30;42924:12;:16;42937:2;42924:16;;;;;;;;;;;;;;;42891:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42966:119;;;;;;;;43016:8;42986:11;:19;;;:39;;;;:::i;:::-;42966:119;;;;;;43069:8;43034:11;:24;;;:44;;;;:::i;:::-;42966:119;;;;;42947:12;:16;42960:2;42947:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43120:43;;;;;;;;43135:2;43120:43;;;;;;43146:15;43120:43;;;;;43092:11;:25;43104:12;43092:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43172:20;43195:12;43172:35;;43221:9;43216:281;43240:8;43236:1;:12;43216:281;;;43294:12;43290:2;43269:38;;43286:1;43269:38;;;;;;;;;;;;43334:59;43365:1;43369:2;43373:12;43387:5;43334:22;:59::i;:::-;43316:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;43475:14;;;;;:::i;:::-;;;;43250:3;;;;;:::i;:::-;;;;43216:281;;;;43520:12;43505;:27;;;;43539:60;43568:1;43572:2;43576:12;43590:8;43539:20;:60::i;:::-;42431:1174;;;42333:1272;;;:::o;48335:141::-;;;;;:::o;48862:140::-;;;;;:::o;16334:387::-;16394:4;16602:12;16669:7;16657:20;16649:28;;16712:1;16705:4;:8;16698:15;;;16334:387;;;:::o;50827:100::-;50879:13;50912:7;50905:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50827:100;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:118::-;1839:24;1857:5;1839:24;:::i;:::-;1834:3;1827:37;1752:118;;:::o;1876:222::-;1969:4;2007:2;1996:9;1992:18;1984:26;;2020:71;2088:1;2077:9;2073:17;2064:6;2020:71;:::i;:::-;1876:222;;;;:::o;2104:99::-;2156:6;2190:5;2184:12;2174:22;;2104:99;;;:::o;2209:169::-;2293:11;2327:6;2322:3;2315:19;2367:4;2362:3;2358:14;2343:29;;2209:169;;;;:::o;2384:307::-;2452:1;2462:113;2476:6;2473:1;2470:13;2462:113;;;2561:1;2556:3;2552:11;2546:18;2542:1;2537:3;2533:11;2526:39;2498:2;2495:1;2491:10;2486:15;;2462:113;;;2593:6;2590:1;2587:13;2584:101;;;2673:1;2664:6;2659:3;2655:16;2648:27;2584:101;2433:258;2384:307;;;:::o;2697:102::-;2738:6;2789:2;2785:7;2780:2;2773:5;2769:14;2765:28;2755:38;;2697:102;;;:::o;2805:364::-;2893:3;2921:39;2954:5;2921:39;:::i;:::-;2976:71;3040:6;3035:3;2976:71;:::i;:::-;2969:78;;3056:52;3101:6;3096:3;3089:4;3082:5;3078:16;3056:52;:::i;:::-;3133:29;3155:6;3133:29;:::i;:::-;3128:3;3124:39;3117:46;;2897:272;2805:364;;;;:::o;3175:313::-;3288:4;3326:2;3315:9;3311:18;3303:26;;3375:9;3369:4;3365:20;3361:1;3350:9;3346:17;3339:47;3403:78;3476:4;3467:6;3403:78;:::i;:::-;3395:86;;3175:313;;;;:::o;3494:77::-;3531:7;3560:5;3549:16;;3494:77;;;:::o;3577:122::-;3650:24;3668:5;3650:24;:::i;:::-;3643:5;3640:35;3630:63;;3689:1;3686;3679:12;3630:63;3577:122;:::o;3705:139::-;3751:5;3789:6;3776:20;3767:29;;3805:33;3832:5;3805:33;:::i;:::-;3705:139;;;;:::o;3850:329::-;3909:6;3958:2;3946:9;3937:7;3933:23;3929:32;3926:119;;;3964:79;;:::i;:::-;3926:119;4084:1;4109:53;4154:7;4145:6;4134:9;4130:22;4109:53;:::i;:::-;4099:63;;4055:117;3850:329;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:117;5645:1;5642;5635:12;5676:568;5749:8;5759:6;5809:3;5802:4;5794:6;5790:17;5786:27;5776:122;;5817:79;;:::i;:::-;5776:122;5930:6;5917:20;5907:30;;5960:18;5952:6;5949:30;5946:117;;;5982:79;;:::i;:::-;5946:117;6096:4;6088:6;6084:17;6072:29;;6150:3;6142:4;6134:6;6130:17;6120:8;6116:32;6113:41;6110:128;;;6157:79;;:::i;:::-;6110:128;5676:568;;;;;:::o;6250:704::-;6345:6;6353;6361;6410:2;6398:9;6389:7;6385:23;6381:32;6378:119;;;6416:79;;:::i;:::-;6378:119;6536:1;6561:53;6606:7;6597:6;6586:9;6582:22;6561:53;:::i;:::-;6551:63;;6507:117;6691:2;6680:9;6676:18;6663:32;6722:18;6714:6;6711:30;6708:117;;;6744:79;;:::i;:::-;6708:117;6857:80;6929:7;6920:6;6909:9;6905:22;6857:80;:::i;:::-;6839:98;;;;6634:313;6250:704;;;;;:::o;6960:619::-;7037:6;7045;7053;7102:2;7090:9;7081:7;7077:23;7073:32;7070:119;;;7108:79;;:::i;:::-;7070:119;7228:1;7253:53;7298:7;7289:6;7278:9;7274:22;7253:53;:::i;:::-;7243:63;;7199:117;7355:2;7381:53;7426:7;7417:6;7406:9;7402:22;7381:53;:::i;:::-;7371:63;;7326:118;7483:2;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7454:118;6960:619;;;;;:::o;7585:77::-;7622:7;7651:5;7640:16;;7585:77;;;:::o;7668:118::-;7755:24;7773:5;7755:24;:::i;:::-;7750:3;7743:37;7668:118;;:::o;7792:222::-;7885:4;7923:2;7912:9;7908:18;7900:26;;7936:71;8004:1;7993:9;7989:17;7980:6;7936:71;:::i;:::-;7792:222;;;;:::o;8020:117::-;8129:1;8126;8119:12;8143:180;8191:77;8188:1;8181:88;8288:4;8285:1;8278:15;8312:4;8309:1;8302:15;8329:281;8412:27;8434:4;8412:27;:::i;:::-;8404:6;8400:40;8542:6;8530:10;8527:22;8506:18;8494:10;8491:34;8488:62;8485:88;;;8553:18;;:::i;:::-;8485:88;8593:10;8589:2;8582:22;8372:238;8329:281;;:::o;8616:129::-;8650:6;8677:20;;:::i;:::-;8667:30;;8706:33;8734:4;8726:6;8706:33;:::i;:::-;8616:129;;;:::o;8751:308::-;8813:4;8903:18;8895:6;8892:30;8889:56;;;8925:18;;:::i;:::-;8889:56;8963:29;8985:6;8963:29;:::i;:::-;8955:37;;9047:4;9041;9037:15;9029:23;;8751:308;;;:::o;9065:154::-;9149:6;9144:3;9139;9126:30;9211:1;9202:6;9197:3;9193:16;9186:27;9065:154;;;:::o;9225:412::-;9303:5;9328:66;9344:49;9386:6;9344:49;:::i;:::-;9328:66;:::i;:::-;9319:75;;9417:6;9410:5;9403:21;9455:4;9448:5;9444:16;9493:3;9484:6;9479:3;9475:16;9472:25;9469:112;;;9500:79;;:::i;:::-;9469:112;9590:41;9624:6;9619:3;9614;9590:41;:::i;:::-;9309:328;9225:412;;;;;:::o;9657:340::-;9713:5;9762:3;9755:4;9747:6;9743:17;9739:27;9729:122;;9770:79;;:::i;:::-;9729:122;9887:6;9874:20;9912:79;9987:3;9979:6;9972:4;9964:6;9960:17;9912:79;:::i;:::-;9903:88;;9719:278;9657:340;;;;:::o;10003:509::-;10072:6;10121:2;10109:9;10100:7;10096:23;10092:32;10089:119;;;10127:79;;:::i;:::-;10089:119;10275:1;10264:9;10260:17;10247:31;10305:18;10297:6;10294:30;10291:117;;;10327:79;;:::i;:::-;10291:117;10432:63;10487:7;10478:6;10467:9;10463:22;10432:63;:::i;:::-;10422:73;;10218:287;10003:509;;;;:::o;10518:329::-;10577:6;10626:2;10614:9;10605:7;10601:23;10597:32;10594:119;;;10632:79;;:::i;:::-;10594:119;10752:1;10777:53;10822:7;10813:6;10802:9;10798:22;10777:53;:::i;:::-;10767:63;;10723:117;10518:329;;;;:::o;10853:122::-;10926:24;10944:5;10926:24;:::i;:::-;10919:5;10916:35;10906:63;;10965:1;10962;10955:12;10906:63;10853:122;:::o;10981:139::-;11027:5;11065:6;11052:20;11043:29;;11081:33;11108:5;11081:33;:::i;:::-;10981:139;;;;:::o;11126:329::-;11185:6;11234:2;11222:9;11213:7;11209:23;11205:32;11202:119;;;11240:79;;:::i;:::-;11202:119;11360:1;11385:53;11430:7;11421:6;11410:9;11406:22;11385:53;:::i;:::-;11375:63;;11331:117;11126:329;;;;:::o;11461:116::-;11531:21;11546:5;11531:21;:::i;:::-;11524:5;11521:32;11511:60;;11567:1;11564;11557:12;11511:60;11461:116;:::o;11583:133::-;11626:5;11664:6;11651:20;11642:29;;11680:30;11704:5;11680:30;:::i;:::-;11583:133;;;;:::o;11722:468::-;11787:6;11795;11844:2;11832:9;11823:7;11819:23;11815:32;11812:119;;;11850:79;;:::i;:::-;11812:119;11970:1;11995:53;12040:7;12031:6;12020:9;12016:22;11995:53;:::i;:::-;11985:63;;11941:117;12097:2;12123:50;12165:7;12156:6;12145:9;12141:22;12123:50;:::i;:::-;12113:60;;12068:115;11722:468;;;;;:::o;12196:307::-;12257:4;12347:18;12339:6;12336:30;12333:56;;;12369:18;;:::i;:::-;12333:56;12407:29;12429:6;12407:29;:::i;:::-;12399:37;;12491:4;12485;12481:15;12473:23;;12196:307;;;:::o;12509:410::-;12586:5;12611:65;12627:48;12668:6;12627:48;:::i;:::-;12611:65;:::i;:::-;12602:74;;12699:6;12692:5;12685:21;12737:4;12730:5;12726:16;12775:3;12766:6;12761:3;12757:16;12754:25;12751:112;;;12782:79;;:::i;:::-;12751:112;12872:41;12906:6;12901:3;12896;12872:41;:::i;:::-;12592:327;12509:410;;;;;:::o;12938:338::-;12993:5;13042:3;13035:4;13027:6;13023:17;13019:27;13009:122;;13050:79;;:::i;:::-;13009:122;13167:6;13154:20;13192:78;13266:3;13258:6;13251:4;13243:6;13239:17;13192:78;:::i;:::-;13183:87;;12999:277;12938:338;;;;:::o;13282:943::-;13377:6;13385;13393;13401;13450:3;13438:9;13429:7;13425:23;13421:33;13418:120;;;13457:79;;:::i;:::-;13418:120;13577:1;13602:53;13647:7;13638:6;13627:9;13623:22;13602:53;:::i;:::-;13592:63;;13548:117;13704:2;13730:53;13775:7;13766:6;13755:9;13751:22;13730:53;:::i;:::-;13720:63;;13675:118;13832:2;13858:53;13903:7;13894:6;13883:9;13879:22;13858:53;:::i;:::-;13848:63;;13803:118;13988:2;13977:9;13973:18;13960:32;14019:18;14011:6;14008:30;14005:117;;;14041:79;;:::i;:::-;14005:117;14146:62;14200:7;14191:6;14180:9;14176:22;14146:62;:::i;:::-;14136:72;;13931:287;13282:943;;;;;;;:::o;14231:474::-;14299:6;14307;14356:2;14344:9;14335:7;14331:23;14327:32;14324:119;;;14362:79;;:::i;:::-;14324:119;14482:1;14507:53;14552:7;14543:6;14532:9;14528:22;14507:53;:::i;:::-;14497:63;;14453:117;14609:2;14635:53;14680:7;14671:6;14660:9;14656:22;14635:53;:::i;:::-;14625:63;;14580:118;14231:474;;;;;:::o;14711:180::-;14759:77;14756:1;14749:88;14856:4;14853:1;14846:15;14880:4;14877:1;14870:15;14897:320;14941:6;14978:1;14972:4;14968:12;14958:22;;15025:1;15019:4;15015:12;15046:18;15036:81;;15102:4;15094:6;15090:17;15080:27;;15036:81;15164:2;15156:6;15153:14;15133:18;15130:38;15127:84;;;15183:18;;:::i;:::-;15127:84;14948:269;14897:320;;;:::o;15223:232::-;15363:34;15359:1;15351:6;15347:14;15340:58;15432:15;15427:2;15419:6;15415:15;15408:40;15223:232;:::o;15461:366::-;15603:3;15624:67;15688:2;15683:3;15624:67;:::i;:::-;15617:74;;15700:93;15789:3;15700:93;:::i;:::-;15818:2;15813:3;15809:12;15802:19;;15461:366;;;:::o;15833:419::-;15999:4;16037:2;16026:9;16022:18;16014:26;;16086:9;16080:4;16076:20;16072:1;16061:9;16057:17;16050:47;16114:131;16240:4;16114:131;:::i;:::-;16106:139;;15833:419;;;:::o;16258:221::-;16398:34;16394:1;16386:6;16382:14;16375:58;16467:4;16462:2;16454:6;16450:15;16443:29;16258:221;:::o;16485:366::-;16627:3;16648:67;16712:2;16707:3;16648:67;:::i;:::-;16641:74;;16724:93;16813:3;16724:93;:::i;:::-;16842:2;16837:3;16833:12;16826:19;;16485:366;;;:::o;16857:419::-;17023:4;17061:2;17050:9;17046:18;17038:26;;17110:9;17104:4;17100:20;17096:1;17085:9;17081:17;17074:47;17138:131;17264:4;17138:131;:::i;:::-;17130:139;;16857:419;;;:::o;17282:244::-;17422:34;17418:1;17410:6;17406:14;17399:58;17491:27;17486:2;17478:6;17474:15;17467:52;17282:244;:::o;17532:366::-;17674:3;17695:67;17759:2;17754:3;17695:67;:::i;:::-;17688:74;;17771:93;17860:3;17771:93;:::i;:::-;17889:2;17884:3;17880:12;17873:19;;17532:366;;;:::o;17904:419::-;18070:4;18108:2;18097:9;18093:18;18085:26;;18157:9;18151:4;18147:20;18143:1;18132:9;18128:17;18121:47;18185:131;18311:4;18185:131;:::i;:::-;18177:139;;17904:419;;;:::o;18329:176::-;18469:28;18465:1;18457:6;18453:14;18446:52;18329:176;:::o;18511:366::-;18653:3;18674:67;18738:2;18733:3;18674:67;:::i;:::-;18667:74;;18750:93;18839:3;18750:93;:::i;:::-;18868:2;18863:3;18859:12;18852:19;;18511:366;;;:::o;18883:419::-;19049:4;19087:2;19076:9;19072:18;19064:26;;19136:9;19130:4;19126:20;19122:1;19111:9;19107:17;19100:47;19164:131;19290:4;19164:131;:::i;:::-;19156:139;;18883:419;;;:::o;19308:94::-;19341:8;19389:5;19385:2;19381:14;19360:35;;19308:94;;;:::o;19408:::-;19447:7;19476:20;19490:5;19476:20;:::i;:::-;19465:31;;19408:94;;;:::o;19508:100::-;19547:7;19576:26;19596:5;19576:26;:::i;:::-;19565:37;;19508:100;;;:::o;19614:157::-;19719:45;19739:24;19757:5;19739:24;:::i;:::-;19719:45;:::i;:::-;19714:3;19707:58;19614:157;;:::o;19777:256::-;19889:3;19904:75;19975:3;19966:6;19904:75;:::i;:::-;20004:2;19999:3;19995:12;19988:19;;20024:3;20017:10;;19777:256;;;;:::o;20039:226::-;20179:34;20175:1;20167:6;20163:14;20156:58;20248:9;20243:2;20235:6;20231:15;20224:34;20039:226;:::o;20271:366::-;20413:3;20434:67;20498:2;20493:3;20434:67;:::i;:::-;20427:74;;20510:93;20599:3;20510:93;:::i;:::-;20628:2;20623:3;20619:12;20612:19;;20271:366;;;:::o;20643:419::-;20809:4;20847:2;20836:9;20832:18;20824:26;;20896:9;20890:4;20886:20;20882:1;20871:9;20867:17;20860:47;20924:131;21050:4;20924:131;:::i;:::-;20916:139;;20643:419;;;:::o;21068:180::-;21116:77;21113:1;21106:88;21213:4;21210:1;21203:15;21237:4;21234:1;21227:15;21254:305;21294:3;21313:20;21331:1;21313:20;:::i;:::-;21308:25;;21347:20;21365:1;21347:20;:::i;:::-;21342:25;;21501:1;21433:66;21429:74;21426:1;21423:81;21420:107;;;21507:18;;:::i;:::-;21420:107;21551:1;21548;21544:9;21537:16;;21254:305;;;;:::o;21565:227::-;21705:34;21701:1;21693:6;21689:14;21682:58;21774:10;21769:2;21761:6;21757:15;21750:35;21565:227;:::o;21798:366::-;21940:3;21961:67;22025:2;22020:3;21961:67;:::i;:::-;21954:74;;22037:93;22126:3;22037:93;:::i;:::-;22155:2;22150:3;22146:12;22139:19;;21798:366;;;:::o;22170:419::-;22336:4;22374:2;22363:9;22359:18;22351:26;;22423:9;22417:4;22413:20;22409:1;22398:9;22394:17;22387:47;22451:131;22577:4;22451:131;:::i;:::-;22443:139;;22170:419;;;:::o;22595:239::-;22735:34;22731:1;22723:6;22719:14;22712:58;22804:22;22799:2;22791:6;22787:15;22780:47;22595:239;:::o;22840:366::-;22982:3;23003:67;23067:2;23062:3;23003:67;:::i;:::-;22996:74;;23079:93;23168:3;23079:93;:::i;:::-;23197:2;23192:3;23188:12;23181:19;;22840:366;;;:::o;23212:419::-;23378:4;23416:2;23405:9;23401:18;23393:26;;23465:9;23459:4;23455:20;23451:1;23440:9;23436:17;23429:47;23493:131;23619:4;23493:131;:::i;:::-;23485:139;;23212:419;;;:::o;23637:221::-;23777:34;23773:1;23765:6;23761:14;23754:58;23846:4;23841:2;23833:6;23829:15;23822:29;23637:221;:::o;23864:366::-;24006:3;24027:67;24091:2;24086:3;24027:67;:::i;:::-;24020:74;;24103:93;24192:3;24103:93;:::i;:::-;24221:2;24216:3;24212:12;24205:19;;23864:366;;;:::o;24236:419::-;24402:4;24440:2;24429:9;24425:18;24417:26;;24489:9;24483:4;24479:20;24475:1;24464:9;24460:17;24453:47;24517:131;24643:4;24517:131;:::i;:::-;24509:139;;24236:419;;;:::o;24661:181::-;24801:33;24797:1;24789:6;24785:14;24778:57;24661:181;:::o;24848:366::-;24990:3;25011:67;25075:2;25070:3;25011:67;:::i;:::-;25004:74;;25087:93;25176:3;25087:93;:::i;:::-;25205:2;25200:3;25196:12;25189:19;;24848:366;;;:::o;25220:419::-;25386:4;25424:2;25413:9;25409:18;25401:26;;25473:9;25467:4;25463:20;25459:1;25448:9;25444:17;25437:47;25501:131;25627:4;25501:131;:::i;:::-;25493:139;;25220:419;;;:::o;25645:348::-;25685:7;25708:20;25726:1;25708:20;:::i;:::-;25703:25;;25742:20;25760:1;25742:20;:::i;:::-;25737:25;;25930:1;25862:66;25858:74;25855:1;25852:81;25847:1;25840:9;25833:17;25829:105;25826:131;;;25937:18;;:::i;:::-;25826:131;25985:1;25982;25978:9;25967:20;;25645:348;;;;:::o;25999:176::-;26139:28;26135:1;26127:6;26123:14;26116:52;25999:176;:::o;26181:366::-;26323:3;26344:67;26408:2;26403:3;26344:67;:::i;:::-;26337:74;;26420:93;26509:3;26420:93;:::i;:::-;26538:2;26533:3;26529:12;26522:19;;26181:366;;;:::o;26553:419::-;26719:4;26757:2;26746:9;26742:18;26734:26;;26806:9;26800:4;26796:20;26792:1;26781:9;26777:17;26770:47;26834:131;26960:4;26834:131;:::i;:::-;26826:139;;26553:419;;;:::o;26978:221::-;27118:34;27114:1;27106:6;27102:14;27095:58;27187:4;27182:2;27174:6;27170:15;27163:29;26978:221;:::o;27205:366::-;27347:3;27368:67;27432:2;27427:3;27368:67;:::i;:::-;27361:74;;27444:93;27533:3;27444:93;:::i;:::-;27562:2;27557:3;27553:12;27546:19;;27205:366;;;:::o;27577:419::-;27743:4;27781:2;27770:9;27766:18;27758:26;;27830:9;27824:4;27820:20;27816:1;27805:9;27801:17;27794:47;27858:131;27984:4;27858:131;:::i;:::-;27850:139;;27577:419;;;:::o;28002:233::-;28041:3;28064:24;28082:5;28064:24;:::i;:::-;28055:33;;28110:66;28103:5;28100:77;28097:103;;;28180:18;;:::i;:::-;28097:103;28227:1;28220:5;28216:13;28209:20;;28002:233;;;:::o;28241:::-;28381:34;28377:1;28369:6;28365:14;28358:58;28450:16;28445:2;28437:6;28433:15;28426:41;28241:233;:::o;28480:366::-;28622:3;28643:67;28707:2;28702:3;28643:67;:::i;:::-;28636:74;;28719:93;28808:3;28719:93;:::i;:::-;28837:2;28832:3;28828:12;28821:19;;28480:366;;;:::o;28852:419::-;29018:4;29056:2;29045:9;29041:18;29033:26;;29105:9;29099:4;29095:20;29091:1;29080:9;29076:17;29069:47;29133:131;29259:4;29133:131;:::i;:::-;29125:139;;28852:419;;;:::o;29277:182::-;29417:34;29413:1;29405:6;29401:14;29394:58;29277:182;:::o;29465:366::-;29607:3;29628:67;29692:2;29687:3;29628:67;:::i;:::-;29621:74;;29704:93;29793:3;29704:93;:::i;:::-;29822:2;29817:3;29813:12;29806:19;;29465:366;;;:::o;29837:419::-;30003:4;30041:2;30030:9;30026:18;30018:26;;30090:9;30084:4;30080:20;30076:1;30065:9;30061:17;30054:47;30118:131;30244:4;30118:131;:::i;:::-;30110:139;;29837:419;;;:::o;30262:222::-;30402:34;30398:1;30390:6;30386:14;30379:58;30471:5;30466:2;30458:6;30454:15;30447:30;30262:222;:::o;30490:366::-;30632:3;30653:67;30717:2;30712:3;30653:67;:::i;:::-;30646:74;;30729:93;30818:3;30729:93;:::i;:::-;30847:2;30842:3;30838:12;30831:19;;30490:366;;;:::o;30862:419::-;31028:4;31066:2;31055:9;31051:18;31043:26;;31115:9;31109:4;31105:20;31101:1;31090:9;31086:17;31079:47;31143:131;31269:4;31143:131;:::i;:::-;31135:139;;30862:419;;;:::o;31287:230::-;31427:34;31423:1;31415:6;31411:14;31404:58;31496:13;31491:2;31483:6;31479:15;31472:38;31287:230;:::o;31523:366::-;31665:3;31686:67;31750:2;31745:3;31686:67;:::i;:::-;31679:74;;31762:93;31851:3;31762:93;:::i;:::-;31880:2;31875:3;31871:12;31864:19;;31523:366;;;:::o;31895:419::-;32061:4;32099:2;32088:9;32084:18;32076:26;;32148:9;32142:4;32138:20;32134:1;32123:9;32119:17;32112:47;32176:131;32302:4;32176:131;:::i;:::-;32168:139;;31895:419;;;:::o;32320:172::-;32460:24;32456:1;32448:6;32444:14;32437:48;32320:172;:::o;32498:366::-;32640:3;32661:67;32725:2;32720:3;32661:67;:::i;:::-;32654:74;;32737:93;32826:3;32737:93;:::i;:::-;32855:2;32850:3;32846:12;32839:19;;32498:366;;;:::o;32870:419::-;33036:4;33074:2;33063:9;33059:18;33051:26;;33123:9;33117:4;33113:20;33109:1;33098:9;33094:17;33087:47;33151:131;33277:4;33151:131;:::i;:::-;33143:139;;32870:419;;;:::o;33295:180::-;33343:77;33340:1;33333:88;33440:4;33437:1;33430:15;33464:4;33461:1;33454:15;33481:185;33521:1;33538:20;33556:1;33538:20;:::i;:::-;33533:25;;33572:20;33590:1;33572:20;:::i;:::-;33567:25;;33611:1;33601:35;;33616:18;;:::i;:::-;33601:35;33658:1;33655;33651:9;33646:14;;33481:185;;;;:::o;33672:180::-;33812:32;33808:1;33800:6;33796:14;33789:56;33672:180;:::o;33858:366::-;34000:3;34021:67;34085:2;34080:3;34021:67;:::i;:::-;34014:74;;34097:93;34186:3;34097:93;:::i;:::-;34215:2;34210:3;34206:12;34199:19;;33858:366;;;:::o;34230:419::-;34396:4;34434:2;34423:9;34419:18;34411:26;;34483:9;34477:4;34473:20;34469:1;34458:9;34454:17;34447:47;34511:131;34637:4;34511:131;:::i;:::-;34503:139;;34230:419;;;:::o;34655:176::-;34795:28;34791:1;34783:6;34779:14;34772:52;34655:176;:::o;34837:366::-;34979:3;35000:67;35064:2;35059:3;35000:67;:::i;:::-;34993:74;;35076:93;35165:3;35076:93;:::i;:::-;35194:2;35189:3;35185:12;35178:19;;34837:366;;;:::o;35209:419::-;35375:4;35413:2;35402:9;35398:18;35390:26;;35462:9;35456:4;35452:20;35448:1;35437:9;35433:17;35426:47;35490:131;35616:4;35490:131;:::i;:::-;35482:139;;35209:419;;;:::o;35634:238::-;35774:34;35770:1;35762:6;35758:14;35751:58;35843:21;35838:2;35830:6;35826:15;35819:46;35634:238;:::o;35878:366::-;36020:3;36041:67;36105:2;36100:3;36041:67;:::i;:::-;36034:74;;36117:93;36206:3;36117:93;:::i;:::-;36235:2;36230:3;36226:12;36219:19;;35878:366;;;:::o;36250:419::-;36416:4;36454:2;36443:9;36439:18;36431:26;;36503:9;36497:4;36493:20;36489:1;36478:9;36474:17;36467:47;36531:131;36657:4;36531:131;:::i;:::-;36523:139;;36250:419;;;:::o;36675:148::-;36777:11;36814:3;36799:18;;36675:148;;;;:::o;36829:317::-;36969:34;36965:1;36957:6;36953:14;36946:58;37042:34;37037:2;37029:6;37025:15;37018:59;37115:19;37110:2;37102:6;37098:15;37091:44;36829:317;:::o;37156:418::-;37316:3;37341:85;37423:2;37418:3;37341:85;:::i;:::-;37334:92;;37439:93;37528:3;37439:93;:::i;:::-;37561:2;37556:3;37552:12;37545:19;;37156:418;;;:::o;37584:397::-;37690:3;37722:39;37755:5;37722:39;:::i;:::-;37781:89;37863:6;37858:3;37781:89;:::i;:::-;37774:96;;37883:52;37928:6;37923:3;37916:4;37909:5;37905:16;37883:52;:::i;:::-;37964:6;37959:3;37955:16;37948:23;;37694:287;37584:397;;;;:::o;37991:557::-;38224:3;38250:148;38394:3;38250:148;:::i;:::-;38243:155;;38419:95;38510:3;38501:6;38419:95;:::i;:::-;38412:102;;38535:3;38528:10;;37991:557;;;;:::o;38558:237::-;38702:34;38698:1;38690:6;38686:14;38679:58;38775:8;38770:2;38762:6;38758:15;38751:33;38558:237;:::o;38805:382::-;38947:3;38972:67;39036:2;39031:3;38972:67;:::i;:::-;38965:74;;39052:93;39141:3;39052:93;:::i;:::-;39174:2;39169:3;39165:12;39158:19;;38805:382;;;:::o;39197:435::-;39363:4;39405:2;39394:9;39390:18;39382:26;;39458:9;39452:4;39448:20;39444:1;39433:9;39429:17;39422:47;39490:131;39616:4;39490:131;:::i;:::-;39482:139;;39197:435;;;:::o;39642:249::-;39786:34;39782:1;39774:6;39770:14;39763:58;39859:20;39854:2;39846:6;39842:15;39835:45;39642:249;:::o;39901:382::-;40043:3;40068:67;40132:2;40127:3;40068:67;:::i;:::-;40061:74;;40148:93;40237:3;40148:93;:::i;:::-;40270:2;40265:3;40261:12;40254:19;;39901:382;;;:::o;40293:435::-;40459:4;40501:2;40490:9;40486:18;40478:26;;40554:9;40548:4;40544:20;40540:1;40529:9;40525:17;40518:47;40586:131;40712:4;40586:131;:::i;:::-;40578:139;;40293:435;;;:::o;40738:237::-;40882:34;40878:1;40870:6;40866:14;40859:58;40955:8;40950:2;40942:6;40938:15;40931:33;40738:237;:::o;40985:382::-;41127:3;41152:67;41216:2;41211:3;41152:67;:::i;:::-;41145:74;;41232:93;41321:3;41232:93;:::i;:::-;41354:2;41349:3;41345:12;41338:19;;40985:382;;;:::o;41377:435::-;41543:4;41585:2;41574:9;41570:18;41562:26;;41638:9;41632:4;41628:20;41624:1;41613:9;41609:17;41602:47;41670:131;41796:4;41670:131;:::i;:::-;41662:139;;41377:435;;;:::o;41822:236::-;41966:34;41962:1;41954:6;41950:14;41943:58;42039:7;42034:2;42026:6;42022:15;42015:32;41822:236;:::o;42068:382::-;42210:3;42235:67;42299:2;42294:3;42235:67;:::i;:::-;42228:74;;42315:93;42404:3;42315:93;:::i;:::-;42437:2;42432:3;42428:12;42421:19;;42068:382;;;:::o;42460:435::-;42626:4;42668:2;42657:9;42653:18;42645:26;;42721:9;42715:4;42711:20;42707:1;42696:9;42692:17;42685:47;42753:131;42879:4;42753:131;:::i;:::-;42745:139;;42460:435;;;:::o;42905:126::-;42942:7;42986:34;42979:5;42975:46;42964:57;;42905:126;;;:::o;43041:211::-;43081:4;43105:20;43123:1;43105:20;:::i;:::-;43100:25;;43143:20;43161:1;43143:20;:::i;:::-;43138:25;;43186:1;43183;43180:8;43177:34;;;43191:18;;:::i;:::-;43177:34;43240:1;43237;43233:9;43225:17;;43041:211;;;;:::o;43262:297::-;43302:3;43325:20;43343:1;43325:20;:::i;:::-;43320:25;;43363:20;43381:1;43363:20;:::i;:::-;43358:25;;43493:1;43457:34;43453:42;43450:1;43447:49;43444:75;;;43499:18;;:::i;:::-;43444:75;43547:1;43544;43540:9;43533:16;;43262:297;;;;:::o;43569:241::-;43713:34;43709:1;43701:6;43697:14;43690:58;43786:12;43781:2;43773:6;43769:15;43762:37;43569:241;:::o;43820:382::-;43962:3;43987:67;44051:2;44046:3;43987:67;:::i;:::-;43980:74;;44067:93;44156:3;44067:93;:::i;:::-;44189:2;44184:3;44180:12;44173:19;;43820:382;;;:::o;44212:435::-;44378:4;44420:2;44409:9;44405:18;44397:26;;44473:9;44467:4;44463:20;44459:1;44448:9;44444:17;44437:47;44505:131;44631:4;44505:131;:::i;:::-;44497:139;;44212:435;;;:::o;44657:211::-;44697:4;44721:20;44739:1;44721:20;:::i;:::-;44716:25;;44759:20;44777:1;44759:20;:::i;:::-;44754:25;;44802:1;44799;44796:8;44793:34;;;44807:18;;:::i;:::-;44793:34;44856:1;44853;44849:9;44841:17;;44657:211;;;;:::o;44878:187::-;44917:3;44944:24;44962:5;44944:24;:::i;:::-;44935:33;;44994:4;44987:5;44984:15;44981:41;;;45002:18;;:::i;:::-;44981:41;45053:1;45046:5;45042:13;45035:20;;44878:187;;;:::o;45075:246::-;45219:34;45215:1;45207:6;45203:14;45196:58;45292:17;45287:2;45279:6;45275:15;45268:42;45075:246;:::o;45331:382::-;45473:3;45498:67;45562:2;45557:3;45498:67;:::i;:::-;45491:74;;45578:93;45667:3;45578:93;:::i;:::-;45700:2;45695:3;45691:12;45684:19;;45331:382;;;:::o;45723:435::-;45889:4;45931:2;45920:9;45916:18;45908:26;;45984:9;45978:4;45974:20;45970:1;45959:9;45955:17;45948:47;46016:131;46142:4;46016:131;:::i;:::-;46008:139;;45723:435;;;:::o;46168:155::-;46269:11;46310:3;46295:18;;46168:155;;;;:::o;46333:118::-;;:::o;46461:414::-;46620:3;46645:83;46726:1;46721:3;46645:83;:::i;:::-;46638:90;;46741:93;46830:3;46741:93;:::i;:::-;46863:1;46858:3;46854:11;46847:18;;46461:414;;;:::o;46885:391::-;47069:3;47095:147;47238:3;47095:147;:::i;:::-;47088:154;;47263:3;47256:10;;46885:391;;;:::o;47286:186::-;47430:30;47426:1;47418:6;47414:14;47407:54;47286:186;:::o;47482:382::-;47624:3;47649:67;47713:2;47708:3;47649:67;:::i;:::-;47642:74;;47729:93;47818:3;47729:93;:::i;:::-;47851:2;47846:3;47842:12;47835:19;;47482:382;;;:::o;47874:435::-;48040:4;48082:2;48071:9;48067:18;48059:26;;48135:9;48129:4;48125:20;48121:1;48110:9;48106:17;48099:47;48167:131;48293:4;48167:131;:::i;:::-;48159:139;;47874:435;;;:::o;48319:106::-;48370:6;48408:5;48402:12;48392:22;;48319:106;;;:::o;48435:180::-;48518:11;48556:6;48551:3;48544:19;48600:4;48595:3;48591:14;48576:29;;48435:180;;;;:::o;48625:380::-;48711:3;48743:38;48775:5;48743:38;:::i;:::-;48801:70;48864:6;48859:3;48801:70;:::i;:::-;48794:77;;48884:52;48929:6;48924:3;48917:4;48910:5;48906:16;48884:52;:::i;:::-;48965:29;48987:6;48965:29;:::i;:::-;48960:3;48956:39;48949:46;;48715:290;48625:380;;;;:::o;49015:668::-;49210:4;49252:3;49241:9;49237:19;49229:27;;49270:71;49338:1;49327:9;49323:17;49314:6;49270:71;:::i;:::-;49355:72;49423:2;49412:9;49408:18;49399:6;49355:72;:::i;:::-;49441;49509:2;49498:9;49494:18;49485:6;49441:72;:::i;:::-;49564:9;49558:4;49554:20;49549:2;49538:9;49534:18;49527:48;49596:76;49667:4;49658:6;49596:76;:::i;:::-;49588:84;;49015:668;;;;;;;:::o;49693:153::-;49749:5;49784:6;49778:13;49769:22;;49804:32;49830:5;49804:32;:::i;:::-;49693:153;;;;:::o;49856:373::-;49925:6;49978:2;49966:9;49957:7;49953:23;49949:32;49946:119;;;49984:79;;:::i;:::-;49946:119;50112:1;50141:63;50196:7;50187:6;50176:9;50172:22;50141:63;:::i;:::-;50131:73;;50079:139;49856:373;;;;:::o;50239:246::-;50383:34;50379:1;50371:6;50367:14;50360:58;50456:17;50451:2;50443:6;50439:15;50432:42;50239:246;:::o;50495:382::-;50637:3;50662:67;50726:2;50721:3;50662:67;:::i;:::-;50655:74;;50742:93;50831:3;50742:93;:::i;:::-;50864:2;50859:3;50855:12;50848:19;;50495:382;;;:::o;50887:435::-;51053:4;51095:2;51084:9;51080:18;51072:26;;51148:9;51142:4;51138:20;51134:1;51123:9;51119:17;51112:47;51180:131;51306:4;51180:131;:::i;:::-;51172:139;;50887:435;;;:::o;51332:451::-;51512:3;51538:95;51629:3;51620:6;51538:95;:::i;:::-;51531:102;;51654:95;51745:3;51736:6;51654:95;:::i;:::-;51647:102;;51770:3;51763:10;;51332:451;;;;;:::o;51793:196::-;51825:1;51846:20;51864:1;51846:20;:::i;:::-;51841:25;;51884:20;51902:1;51884:20;:::i;:::-;51879:25;;51927:1;51917:35;;51932:18;;:::i;:::-;51917:35;51977:1;51974;51970:9;51965:14;;51793:196;;;;:::o;51999:::-;52051:77;52048:1;52041:88;52152:4;52149:1;52142:15;52180:4;52177:1;52170:15;52205:87;52244:7;52277:5;52266:16;;52205:87;;;:::o;52302:165::-;52411:45;52431:24;52449:5;52431:24;:::i;:::-;52411:45;:::i;:::-;52406:3;52399:58;52302:165;;:::o;52477:421::-;52617:3;52636:75;52707:3;52698:6;52636:75;:::i;:::-;52740:2;52735:3;52731:12;52724:19;;52757:75;52828:3;52819:6;52757:75;:::i;:::-;52861:2;52856:3;52852:12;52845:19;;52885:3;52878:10;;52477:421;;;;;:::o;52908:232::-;53052:34;53048:1;53040:6;53036:14;53029:58;53125:3;53120:2;53112:6;53108:15;53101:28;52908:232;:::o;53150:382::-;53292:3;53317:67;53381:2;53376:3;53317:67;:::i;:::-;53310:74;;53397:93;53486:3;53397:93;:::i;:::-;53519:2;53514:3;53510:12;53503:19;;53150:382;;;:::o;53542:435::-;53708:4;53750:2;53739:9;53735:18;53727:26;;53803:9;53797:4;53793:20;53789:1;53778:9;53774:17;53767:47;53835:131;53961:4;53835:131;:::i;:::-;53827:139;;53542:435;;;:::o;53987:187::-;54131:31;54127:1;54119:6;54115:14;54108:55;53987:187;:::o;54184:382::-;54326:3;54351:67;54415:2;54410:3;54351:67;:::i;:::-;54344:74;;54431:93;54520:3;54431:93;:::i;:::-;54553:2;54548:3;54544:12;54537:19;;54184:382;;;:::o;54576:435::-;54742:4;54784:2;54773:9;54769:18;54761:26;;54837:9;54831:4;54827:20;54823:1;54812:9;54808:17;54801:47;54869:131;54995:4;54869:131;:::i;:::-;54861:139;;54576:435;;;:::o;55021:233::-;55165:34;55161:1;55153:6;55149:14;55142:58;55238:4;55233:2;55225:6;55221:15;55214:29;55021:233;:::o;55264:382::-;55406:3;55431:67;55495:2;55490:3;55431:67;:::i;:::-;55424:74;;55511:93;55600:3;55511:93;:::i;:::-;55633:2;55628:3;55624:12;55617:19;;55264:382;;;:::o;55656:435::-;55822:4;55864:2;55853:9;55849:18;55841:26;;55917:9;55911:4;55907:20;55903:1;55892:9;55888:17;55881:47;55949:131;56075:4;55949:131;:::i;:::-;55941:139;;55656:435;;;:::o

Swarm Source

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