ETH Price: $2,405.70 (-0.68%)

Token

Wicked X Gang (WXG)
 

Overview

Max Total Supply

18 WXG

Holders

16

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
WXGNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

//SPDX-License-Identifier: Unlicense
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/[email protected]

// 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/security/[email protected]

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

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/math/[email protected]

// 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/introspection/[email protected]

// 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/token/ERC721/[email protected]

// 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/[email protected]

// 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/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// 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/introspection/[email protected]

// 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/[email protected]

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/security/[email protected]

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File contracts/ContentMixin.sol

pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}


// File contracts/Factory.sol

pragma solidity ^0.8.0;

abstract contract Factory {
    enum Segment {
        AIRDROP,
        TEAM,
        WHITELIST,
        PUBLIC
    }

    struct Options {
        mapping(address => bool) _beneficiary;
        mapping(address => bool) _minted;
        uint256 _amount;
        uint256 _maxMint;
    }

    mapping(Segment => Options) public _segmentOptions;

    function _add(Segment segment, address account) internal {
        _segmentOptions[segment]._beneficiary[account] = true;
    }

    function _remove(Segment segment, address account) internal {
        require(
            _segmentOptions[segment]._beneficiary[account],
            "address is not in the whitelist"
        );
        delete _segmentOptions[segment]._beneficiary[account];
    }

    function _has(Segment segment, address account)
        internal
        view
        returns (bool)
    {
        return
            _segmentOptions[segment]._beneficiary[account] &&
            !_segmentOptions[segment]._minted[account];
    }
}


// File contracts/Whitelist.sol

pragma solidity ^0.8.0;




contract Whitelist is Factory, Ownable, ContextMixin {
    using SafeMath for uint256;

    uint256 public constant WHITELIST_PRICE = 0.069 ether;
    uint256 public constant TEAM_PRICE = 0.069 ether;
    uint256 public constant AIRDROP_PRICE = 0 ether;
    uint256 public constant PUBLIC_PRICE = 0.099 ether;

    constructor() {
        _segmentOptions[Segment.WHITELIST]._amount = WHITELIST_PRICE;
        _segmentOptions[Segment.WHITELIST]._maxMint = 1;
        _segmentOptions[Segment.TEAM]._amount = TEAM_PRICE;
        _segmentOptions[Segment.TEAM]._maxMint = 2;
        _segmentOptions[Segment.AIRDROP]._amount = AIRDROP_PRICE;
        _segmentOptions[Segment.AIRDROP]._maxMint = 1;
        _segmentOptions[Segment.PUBLIC]._amount = PUBLIC_PRICE;
        _segmentOptions[Segment.PUBLIC]._maxMint = 5;
    }

    function addBeneficiaryAirdrop(address _beneficiary) public onlyOwner {
        _add(Segment.AIRDROP, _beneficiary);
    }

    function addBeneficiaryAirdrop(address[] memory _beneficiary)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < _beneficiary.length; i++) {
            _add(Segment.AIRDROP, _beneficiary[i]);
        }
    }

    function airdropWhitelisted() public view returns (bool) {
        return _has(Segment.AIRDROP, _msgSender());
    }

    function addBeneficiaryWhitelist(address _beneficiary) public onlyOwner {
        _add(Segment.WHITELIST, _beneficiary);
    }

    function addBeneficiaryWhitelist(address[] memory _beneficiary)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < _beneficiary.length; i++) {
            _add(Segment.WHITELIST, _beneficiary[i]);
        }
    }

    function whitelisted() public view returns (bool) {
        return _has(Segment.WHITELIST, _msgSender());
    }

    function addBeneficiaryTeam(address _beneficiary) public onlyOwner {
        _add(Segment.TEAM, _beneficiary);
    }

    function addBeneficiaryTeam(address[] memory _beneficiary)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < _beneficiary.length; i++) {
            _add(Segment.TEAM, _beneficiary[i]);
        }
    }

    function teamWhitelisted() public view returns (bool) {
        return _has(Segment.TEAM, _msgSender());
    }
}


// File contracts/WXGNFT.sol

pragma solidity ^0.8.0;








contract OwnableDelegateProxy {
    // solhint-disable-previous-line no-empty-blocks
}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract WXGNFT is
    ERC721,
    Ownable,
    Pausable,
    ContextMixin,
    ReentrancyGuard,
    Whitelist
{
    using SafeMath for uint256;
    using Counters for Counters.Counter;
    uint256 public constant MAX_SUPPLY = 1001;
    uint256 public openTime;
    uint256 public closeTime;
    uint256 public whitelistOpentime;
    uint256 public whitelistClosetime;
    address public proxyRegistryAddress;
    address public fundWallet;
    string public baseTokenURI;
    Counters.Counter private _nextTokenId;
    bool public revealed = false;

    constructor(
        string memory _baseTokenURI,
        address _proxyRegistryAddress,
        address _fundWallet,
        uint256 _openTime,
        uint256 _closeTime,
        uint256 _whitelistOpentime,
        uint256 _whitelistClosetime
    ) ERC721("Wicked X Gang", "WXG") Whitelist() {
        proxyRegistryAddress = _proxyRegistryAddress;
        fundWallet = _fundWallet;
        openTime = _openTime;
        closeTime = _closeTime;
        whitelistClosetime = _whitelistClosetime;
        whitelistOpentime = _whitelistOpentime;
        _nextTokenId.increment();
        baseTokenURI = _baseTokenURI;
    }

    event MintWXCNFT(address indexed to, uint256 indexed tokenId);
    event WhitelistMint(address indexed _to, uint256 _amount);
    event AirdropMint(address indexed _to, uint256 _amount);
    event TeamMint(address indexed _to, uint256 _amount);
    event PublicMint(address indexed _to, uint256 _amount);

    receive() external payable {
        // solhint-disable-previous-line no-empty-blocks
    }

    modifier whenOpen() {
        require(
            block.timestamp >= openTime && block.timestamp < closeTime,
            "Not open yet"
        );
        _;
    }

    modifier whenWhitelistOpen() {
        require(
            block.timestamp >= whitelistOpentime &&
                block.timestamp < whitelistClosetime,
            "Whitelist not open yet"
        );
        _;
    }

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

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

    function reveal() public onlyOwner {
        require(!revealed, "Already revealed");
        revealed = true;
    }

    function setBaseURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function mintTo(address _to) public onlyOwner {
        require(totalSupply().add(1) <= MAX_SUPPLY, "Max supply reached");
        uint256 currentTokenId = _nextTokenId.current();
        _nextTokenId.increment();
        _safeMint(_to, currentTokenId);
    }

    function mint(uint256 _mintAmount)
        public
        payable
        nonReentrant
        whenNotPaused
        whenOpen
    {
        _mintNFT(Segment.PUBLIC, _mintAmount);
        emit PublicMint(_msgSender(), _mintAmount);
    }

    function mintWhitelist(uint256 _mintAmount)
        public
        payable
        nonReentrant
        whenNotPaused
        whenWhitelistOpen
    {
        _mintNFT(Segment.WHITELIST, _mintAmount);
        emit WhitelistMint(_msgSender(), _mintAmount);
    }

    function mintAirdrop(uint256 _mintAmount)
        public
        payable
        nonReentrant
        whenNotPaused
        whenWhitelistOpen
    {
        _mintNFT(Segment.AIRDROP, _mintAmount);
        emit AirdropMint(_msgSender(), _mintAmount);
    }

    function mintTeam(uint256 _mintAmount)
        public
        payable
        nonReentrant
        whenNotPaused
        whenWhitelistOpen
    {
        _mintNFT(Segment.TEAM, _mintAmount);
        emit TeamMint(_msgSender(), _mintAmount);
    }

    function _mintNFT(Segment _segment, uint256 _mintAmount) internal {
        _prevalidateMint(_segment, _mintAmount);
        for (uint256 i = 0; i < _mintAmount; i++) {
            uint256 currentTokenId = _nextTokenId.current();
            _nextTokenId.increment();
            _safeMint(_msgSender(), currentTokenId);
            emit MintWXCNFT(_msgSender(), currentTokenId);
        }
        _forwardFunds(price(_segment, _mintAmount));
    }

    function unpack(uint256 _tokenId) public view {
        require(ownerOf(_tokenId) == _msgSender(), "You are not the owner");
        tokenURI(_tokenId);
    }

    function _prevalidateMint(Segment _segment, uint256 _mintAmount) internal {
        require(_mintAmount > 0, "Mint amount zero");
        require(_msgSender() != address(0), "Mint to 0 address is not allowed");
        require(
            msg.value >= price(_segment, _mintAmount),
            "Insufficient funds"
        );
        require(
            _mintAmount <= _segmentOptions[_segment]._maxMint,
            "Max mint amount reached"
        );

        if (_segment != Segment.PUBLIC) {
            require(
                !_segmentOptions[_segment]._minted[_msgSender()],
                "Already minted"
            );
            require(
                _segmentOptions[_segment]._beneficiary[_msgSender()],
                "Not whitelisted"
            );
        }
        _segmentOptions[_segment]._minted[_msgSender()] = true;
    }

    function _forwardFunds(uint256 amount) internal {
        (bool succeed, ) = fundWallet.call{value: amount}("");
        require(succeed, "Failed to send Ether");
    }

    function price(Segment segment, uint256 amount)
        internal
        view
        returns (uint256)
    {
        return amount.mul(_segmentOptions[segment]._amount);
    }

    function totalSupply() public view returns (uint256) {
        return _nextTokenId.current() - 1;
    }

    function remainingSupply() public view returns (uint256) {
        return MAX_SUPPLY.sub(totalSupply());
    }

    function isCanMint()
        public
        view
        returns (
            bool,
            bool,
            bool,
            bool
        )
    {
        return (
            airdropWhitelisted(),
            teamWhitelisted(),
            whitelisted(),
            published()
        );
    }

    function wxcSeting(
        address _proxyRegistryAddress,
        address _fundWallet,
        uint256 _openTime,
        uint256 _closeTime,
        uint256 _whitelistOpentime,
        uint256 _whitelistClosetime
    ) public onlyOwner {
        proxyRegistryAddress = _proxyRegistryAddress;
        fundWallet = _fundWallet;
        openTime = _openTime;
        closeTime = _closeTime;
        whitelistClosetime = _whitelistClosetime;
        whitelistOpentime = _whitelistOpentime;
    }

    function published() public view returns (bool) {
        //return !_segmentOptions[Segment.PUBLIC]._minted[_msgSender()];
        return block.timestamp >= openTime && block.timestamp < closeTime;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "URI query for nonexistent token");
        if (revealed) {
            return
                string(
                    abi.encodePacked(baseTokenURI, Strings.toString(_tokenId))
                );
        }
        return baseTokenURI;
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"address","name":"_fundWallet","type":"address"},{"internalType":"uint256","name":"_openTime","type":"uint256"},{"internalType":"uint256","name":"_closeTime","type":"uint256"},{"internalType":"uint256","name":"_whitelistOpentime","type":"uint256"},{"internalType":"uint256","name":"_whitelistClosetime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AirdropMint","type":"event"},{"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":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintWXCNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"PublicMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TeamMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WhitelistMint","type":"event"},{"inputs":[],"name":"AIRDROP_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Factory.Segment","name":"","type":"uint8"}],"name":"_segmentOptions","outputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiary","type":"address[]"}],"name":"addBeneficiaryAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"addBeneficiaryAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiary","type":"address[]"}],"name":"addBeneficiaryTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"addBeneficiaryTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"addBeneficiaryWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiary","type":"address[]"}],"name":"addBeneficiaryWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"isCanMint","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintAirdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintTeam","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"published","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setBaseURI","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":"teamWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unpack","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistClosetime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistOpentime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"address","name":"_fundWallet","type":"address"},{"internalType":"uint256","name":"_openTime","type":"uint256"},{"internalType":"uint256","name":"_closeTime","type":"uint256"},{"internalType":"uint256","name":"_whitelistOpentime","type":"uint256"},{"internalType":"uint256","name":"_whitelistClosetime","type":"uint256"}],"name":"wxcSeting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000601160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162006aeb38038062006aeb83398181016040528101906200005291906200098a565b6040518060400160405280600d81526020017f5769636b656420582047616e67000000000000000000000000000000000000008152506040518060400160405280600381526020017f57584700000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000d69291906200083a565b508060029080519060200190620000ef9291906200083a565b50505062000112620001066200068f60201b60201c565b620006ab60201b60201c565b6000600760146101000a81548160ff021916908315150217905550600160088190555066f5232269808000600080600260038111156200017b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115620001b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002018190555060016000806002600381111562000209577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381111562000242577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206003018190555066f5232269808000600080600160038111156200029d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115620002d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600201819055506002600080600160038111156200032b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381111562000364577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600301819055506000806000806003811115620003b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115620003f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060020181905550600160008080600381111562000445577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038111156200047e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206003018190555067015fb7f9b8c38000600080600380811115620004d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381111562000512577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060020181905550600560008060038081111562000566577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038111156200059f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206003018190555085600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360098190555082600a8190555080600c8190555081600b819055506200066960106200077160201b6200276e1760201c565b86600f9080519060200190620006819291906200083a565b505050505050505062000c32565b6000620006a66200078760201b620027841760201c565b905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156200083357600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505062000837565b3390505b90565b828054620008489062000b23565b90600052602060002090601f0160209004810192826200086c5760008555620008b8565b82601f106200088757805160ff1916838001178555620008b8565b82800160010185558215620008b8579182015b82811115620008b75782518255916020019190600101906200089a565b5b509050620008c79190620008cb565b5090565b5b80821115620008e6576000816000905550600101620008cc565b5090565b600062000901620008fb8462000a79565b62000a50565b9050828152602081018484840111156200091a57600080fd5b6200092784828562000aed565b509392505050565b600081519050620009408162000bfe565b92915050565b600082601f8301126200095857600080fd5b81516200096a848260208601620008ea565b91505092915050565b600081519050620009848162000c18565b92915050565b600080600080600080600060e0888a031215620009a657600080fd5b600088015167ffffffffffffffff811115620009c157600080fd5b620009cf8a828b0162000946565b9750506020620009e28a828b016200092f565b9650506040620009f58a828b016200092f565b955050606062000a088a828b0162000973565b945050608062000a1b8a828b0162000973565b93505060a062000a2e8a828b0162000973565b92505060c062000a418a828b0162000973565b91505092959891949750929550565b600062000a5c62000a6f565b905062000a6a828262000b59565b919050565b6000604051905090565b600067ffffffffffffffff82111562000a975762000a9662000bbe565b5b62000aa28262000bed565b9050602081019050919050565b600062000abc8262000ac3565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b0d57808201518184015260208101905062000af0565b8381111562000b1d576000848401525b50505050565b6000600282049050600182168062000b3c57607f821691505b6020821081141562000b535762000b5262000b8f565b5b50919050565b62000b648262000bed565b810181811067ffffffffffffffff8211171562000b865762000b8562000bbe565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b62000c098162000aaf565b811462000c1557600080fd5b50565b62000c238162000ae3565b811462000c2f57600080fd5b50565b615ea98062000c426000396000f3fe6080604052600436106103545760003560e01c8063664a1ad6116101c6578063a475b5dd116100f7578063da0239a611610095578063e985e9c51161006f578063e985e9c514610bb9578063f0c9a8cc14610bf6578063f2fde38b14610c21578063f6875be014610c4a5761035b565b8063da0239a614610b3c578063e0a7e61b14610b67578063e4d44c9714610b905761035b565b8063c5a1d0ff116100d1578063c5a1d0ff14610a7e578063c87b56dd14610aa9578063cd7c032614610ae6578063d547cfb714610b115761035b565b8063a475b5dd14610a13578063b425688814610a2a578063b88d4fde14610a555761035b565b80638d4d2b0c116101645780639785a6161161013e5780639785a61614610975578063a0712d68146109a3578063a22cb465146109bf578063a41fd6d9146109e85761035b565b80638d4d2b0c146108f45780638da5cb5b1461091f57806395d89b411461094a5761035b565b8063755edd17116101a0578063755edd17146108625780637d48aa191461088b5780638456cb59146108b45780638a02be68146108cb5761035b565b8063664a1ad6146107e357806370a082311461080e578063715018a61461084b5761035b565b8063342f48aa116102a0578063518302271161023e5780635c975abb116102185780635c975abb14610725578063611f3f1014610750578063627749e61461077b5780636352211e146107a65761035b565b806351830227146106a857806355f804b3146106d35780635c58bad4146106fc5761035b565b80633f4ba83a1161027a5780633f4ba83a1461062157806342842e0e146106385780634618163e146106615780634c9b3ca81461067d5761035b565b8063342f48aa146105b157806334c47321146105cd5780633d9287fa146105f65761035b565b806317e7f2951161030d578063209f3fba116102e7578063209f3fba1461050957806320a017751461053257806323b872dd1461055d57806332cb6b0c146105865761035b565b806317e7f2951461048857806318160ddd146104b35780631c139513146104de5761035b565b806301ffc9a71461036057806306fdde031461039d578063081812fc146103c857806308564ae314610405578063095ea7b314610421578063109b8a7f1461044a5761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b50610387600480360381019061038291906146b4565b610c73565b6040516103949190614e11565b60405180910390f35b3480156103a957600080fd5b506103b2610d55565b6040516103bf9190614e71565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190614799565b610de7565b6040516103fc9190614daa565b60405180910390f35b61041f600480360381019061041a9190614799565b610e6c565b005b34801561042d57600080fd5b5061044860048036038101906104439190614637565b610fbf565b005b34801561045657600080fd5b50610471600480360381019061046c919061472f565b6110d7565b60405161047f92919061528e565b60405180910390f35b34801561049457600080fd5b5061049d6110fb565b6040516104aa9190615273565b60405180910390f35b3480156104bf57600080fd5b506104c8611106565b6040516104d59190615273565b60405180910390f35b3480156104ea57600080fd5b506104f3611123565b6040516105009190615273565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b9190614443565b611129565b005b34801561053e57600080fd5b506105476111b3565b6040516105549190615273565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f91906144a8565b6111be565b005b34801561059257600080fd5b5061059b61121e565b6040516105a89190615273565b60405180910390f35b6105cb60048036038101906105c69190614799565b611224565b005b3480156105d957600080fd5b506105f460048036038101906105ef9190614673565b611377565b005b34801561060257600080fd5b5061060b611461565b6040516106189190614e11565b60405180910390f35b34801561062d57600080fd5b5061063661147a565b005b34801561064457600080fd5b5061065f600480360381019061065a91906144a8565b611500565b005b61067b60048036038101906106769190614799565b611520565b005b34801561068957600080fd5b50610692611673565b60405161069f9190615273565b60405180910390f35b3480156106b457600080fd5b506106bd611678565b6040516106ca9190614e11565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190614758565b61168b565b005b34801561070857600080fd5b50610723600480360381019061071e9190614673565b611721565b005b34801561073157600080fd5b5061073a61180b565b6040516107479190614e11565b60405180910390f35b34801561075c57600080fd5b50610765611822565b6040516107729190615273565b60405180910390f35b34801561078757600080fd5b5061079061182e565b60405161079d9190615273565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c89190614799565b611834565b6040516107da9190614daa565b60405180910390f35b3480156107ef57600080fd5b506107f86118e6565b6040516108059190614daa565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190614443565b61190c565b6040516108429190615273565b60405180910390f35b34801561085757600080fd5b506108606119c4565b005b34801561086e57600080fd5b5061088960048036038101906108849190614443565b611a4c565b005b34801561089757600080fd5b506108b260048036038101906108ad9190614443565b611b4d565b005b3480156108c057600080fd5b506108c9611bd7565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190614799565b611c5d565b005b34801561090057600080fd5b50610909611ce7565b6040516109169190614e11565b60405180910390f35b34801561092b57600080fd5b50610934611d01565b6040516109419190614daa565b60405180910390f35b34801561095657600080fd5b5061095f611d2b565b60405161096c9190614e71565b60405180910390f35b34801561098157600080fd5b5061098a611dbd565b60405161099a9493929190614e2c565b60405180910390f35b6109bd60048036038101906109b89190614799565b611df1565b005b3480156109cb57600080fd5b506109e660048036038101906109e191906145fb565b611f44565b005b3480156109f457600080fd5b506109fd611f5a565b604051610a0a9190615273565b60405180910390f35b348015610a1f57600080fd5b50610a28611f60565b005b348015610a3657600080fd5b50610a3f612049565b604051610a4c9190615273565b60405180910390f35b348015610a6157600080fd5b50610a7c6004803603810190610a7791906144f7565b61204f565b005b348015610a8a57600080fd5b50610a936120b1565b604051610aa09190614e11565b60405180910390f35b348015610ab557600080fd5b50610ad06004803603810190610acb9190614799565b6120ca565b604051610add9190614e71565b60405180910390f35b348015610af257600080fd5b50610afb6121ee565b604051610b089190614daa565b60405180910390f35b348015610b1d57600080fd5b50610b26612214565b604051610b339190614e71565b60405180910390f35b348015610b4857600080fd5b50610b516122a2565b604051610b5e9190615273565b60405180910390f35b348015610b7357600080fd5b50610b8e6004803603810190610b899190614572565b6122c5565b005b348015610b9c57600080fd5b50610bb76004803603810190610bb29190614443565b6123e7565b005b348015610bc557600080fd5b50610be06004803603810190610bdb919061446c565b612471565b604051610bed9190614e11565b60405180910390f35b348015610c0257600080fd5b50610c0b612573565b604051610c189190614e11565b60405180910390f35b348015610c2d57600080fd5b50610c486004803603810190610c439190614443565b61258c565b005b348015610c5657600080fd5b50610c716004803603810190610c6c9190614673565b612684565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d3e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d4e5750610d4d82612835565b5b9050919050565b606060018054610d64906155aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610d90906155aa565b8015610ddd5780601f10610db257610100808354040283529160200191610ddd565b820191906000526020600020905b815481529060010190602001808311610dc057829003601f168201915b5050505050905090565b6000610df28261289f565b610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890615173565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60026008541415610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990615253565b60405180910390fd5b6002600881905550610ec261180b565b15610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990615093565b60405180910390fd5b600b544210158015610f155750600c5442105b610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90614fd3565b60405180910390fd5b610f5f60008261290b565b610f676129bf565b73ffffffffffffffffffffffffffffffffffffffff167f7f9c9cb9137926c7f7c3bdbb971b627d14e5f95ded13be068becbd8ce819836182604051610fac9190615273565b60405180910390a2600160088190555050565b6000610fca82611834565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611032906151b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661105a6129bf565b73ffffffffffffffffffffffffffffffffffffffff1614806110895750611088816110836129bf565b612471565b5b6110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf906150b3565b60405180910390fd5b6110d283836129ce565b505050565b60006020528060005260406000206000915090508060020154908060030154905082565b66f523226980800081565b600060016111146010612a87565b61111e91906154ae565b905090565b600c5481565b6111316129bf565b73ffffffffffffffffffffffffffffffffffffffff1661114f611d01565b73ffffffffffffffffffffffffffffffffffffffff16146111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c90615193565b60405180910390fd5b6111b0600282612a95565b50565b66f523226980800081565b6111cf6111c96129bf565b82612b74565b61120e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611205906151f3565b60405180910390fd5b611219838383612c52565b505050565b6103e981565b6002600854141561126a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126190615253565b60405180910390fd5b600260088190555061127a61180b565b156112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190615093565b60405180910390fd5b600b5442101580156112cd5750600c5442105b61130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390614fd3565b60405180910390fd5b61131760018261290b565b61131f6129bf565b73ffffffffffffffffffffffffffffffffffffffff167f5d3a6b0dd9fbc17e3d7180bed2fcb7c0002bb1f4729b285322cacde3f136aefd826040516113649190615273565b60405180910390a2600160088190555050565b61137f6129bf565b73ffffffffffffffffffffffffffffffffffffffff1661139d611d01565b73ffffffffffffffffffffffffffffffffffffffff16146113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90615193565b60405180910390fd5b60005b815181101561145d5761144a600083838151811061143d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612a95565b80806114559061560d565b9150506113f6565b5050565b600061147560026114706129bf565b612eb9565b905090565b6114826129bf565b73ffffffffffffffffffffffffffffffffffffffff166114a0611d01565b73ffffffffffffffffffffffffffffffffffffffff16146114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed90615193565b60405180910390fd5b6114fe61306c565b565b61151b8383836040518060200160405280600081525061204f565b505050565b60026008541415611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90615253565b60405180910390fd5b600260088190555061157661180b565b156115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad90615093565b60405180910390fd5b600b5442101580156115c95750600c5442105b611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff90614fd3565b60405180910390fd5b61161360028261290b565b61161b6129bf565b73ffffffffffffffffffffffffffffffffffffffff167f3175668c3bc41d83dd982a992932fc7512416b71850f41443845d2a4c2e3ec63826040516116609190615273565b60405180910390a2600160088190555050565b600081565b601160009054906101000a900460ff1681565b6116936129bf565b73ffffffffffffffffffffffffffffffffffffffff166116b1611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90615193565b60405180910390fd5b80600f908051906020019061171d9291906141a7565b5050565b6117296129bf565b73ffffffffffffffffffffffffffffffffffffffff16611747611d01565b73ffffffffffffffffffffffffffffffffffffffff161461179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490615193565b60405180910390fd5b60005b8151811015611807576117f460018383815181106117e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612a95565b80806117ff9061560d565b9150506117a0565b5050565b6000600760149054906101000a900460ff16905090565b67015fb7f9b8c3800081565b600a5481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d490615113565b60405180910390fd5b80915050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611974906150f3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119cc6129bf565b73ffffffffffffffffffffffffffffffffffffffff166119ea611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790615193565b60405180910390fd5b611a4a600061310e565b565b611a546129bf565b73ffffffffffffffffffffffffffffffffffffffff16611a72611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90615193565b60405180910390fd5b6103e9611ae66001611ad8611106565b6131d490919063ffffffff16565b1115611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90615213565b60405180910390fd5b6000611b336010612a87565b9050611b3f601061276e565b611b4982826131ea565b5050565b611b556129bf565b73ffffffffffffffffffffffffffffffffffffffff16611b73611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090615193565b60405180910390fd5b611bd4600182612a95565b50565b611bdf6129bf565b73ffffffffffffffffffffffffffffffffffffffff16611bfd611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90615193565b60405180910390fd5b611c5b613208565b565b611c656129bf565b73ffffffffffffffffffffffffffffffffffffffff16611c8482611834565b73ffffffffffffffffffffffffffffffffffffffff1614611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190615033565b60405180910390fd5b611ce3816120ca565b5050565b60006009544210158015611cfc5750600a5442105b905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611d3a906155aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611d66906155aa565b8015611db35780601f10611d8857610100808354040283529160200191611db3565b820191906000526020600020905b815481529060010190602001808311611d9657829003601f168201915b5050505050905090565b600080600080611dcb612573565b611dd36120b1565b611ddb611461565b611de3611ce7565b935093509350935090919293565b60026008541415611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90615253565b60405180910390fd5b6002600881905550611e4761180b565b15611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e90615093565b60405180910390fd5b6009544210158015611e9a5750600a5442105b611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090614ed3565b60405180910390fd5b611ee460038261290b565b611eec6129bf565b73ffffffffffffffffffffffffffffffffffffffff167f748a2986091c2034d6e93b6f44f771a79f0e1d6acd8a60c68c17d4e1e2feaed282604051611f319190615273565b60405180910390a2600160088190555050565b611f56611f4f6129bf565b83836132ab565b5050565b600b5481565b611f686129bf565b73ffffffffffffffffffffffffffffffffffffffff16611f86611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390615193565b60405180910390fd5b601160009054906101000a900460ff161561202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202390615133565b60405180910390fd5b6001601160006101000a81548160ff021916908315150217905550565b60095481565b61206061205a6129bf565b83612b74565b61209f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612096906151f3565b60405180910390fd5b6120ab84848484613418565b50505050565b60006120c560016120c06129bf565b612eb9565b905090565b60606120d58261289f565b612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b90614ef3565b60405180910390fd5b601160009054906101000a900460ff161561215b57600f61213483613474565b604051602001612145929190614d71565b60405160208183030381529060405290506121e9565b600f8054612168906155aa565b80601f0160208091040260200160405190810160405280929190818152602001828054612194906155aa565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b505050505090505b919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f8054612221906155aa565b80601f016020809104026020016040519081016040528092919081815260200182805461224d906155aa565b801561229a5780601f1061226f5761010080835404028352916020019161229a565b820191906000526020600020905b81548152906001019060200180831161227d57829003601f168201915b505050505081565b60006122c06122af611106565b6103e961362190919063ffffffff16565b905090565b6122cd6129bf565b73ffffffffffffffffffffffffffffffffffffffff166122eb611d01565b73ffffffffffffffffffffffffffffffffffffffff1614612341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233890615193565b60405180910390fd5b85600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360098190555082600a8190555080600c8190555081600b81905550505050505050565b6123ef6129bf565b73ffffffffffffffffffffffffffffffffffffffff1661240d611d01565b73ffffffffffffffffffffffffffffffffffffffff1614612463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245a90615193565b60405180910390fd5b61246e600082612a95565b50565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016124e99190614daa565b60206040518083038186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125399190614706565b73ffffffffffffffffffffffffffffffffffffffff16141561255f57600191505061256d565b6125698484613637565b9150505b92915050565b600061258760006125826129bf565b612eb9565b905090565b6125946129bf565b73ffffffffffffffffffffffffffffffffffffffff166125b2611d01565b73ffffffffffffffffffffffffffffffffffffffff1614612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff90615193565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266f90614f33565b60405180910390fd5b6126818161310e565b50565b61268c6129bf565b73ffffffffffffffffffffffffffffffffffffffff166126aa611d01565b73ffffffffffffffffffffffffffffffffffffffff1614612700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f790615193565b60405180910390fd5b60005b815181101561276a57612757600283838151811061274a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612a95565b80806127629061560d565b915050612703565b5050565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561282e57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050612832565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61291582826136cb565b60005b818110156129a857600061292c6010612a87565b9050612938601061276e565b6129496129436129bf565b826131ea565b806129526129bf565b73ffffffffffffffffffffffffffffffffffffffff167fbd3c55c5e8f6366c44c61be984033bf0500ba5dcc94adef65c6e3001ab3773ed60405160405180910390a35080806129a09061560d565b915050612918565b506129bb6129b68383613c24565b613cc6565b5050565b60006129c9612784565b905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a4183611834565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001600080846003811115612ad3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115612b0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000612b7f8261289f565b612bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb590615053565b60405180910390fd5b6000612bc983611834565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c3857508373ffffffffffffffffffffffffffffffffffffffff16612c2084610de7565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c495750612c488185612471565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c7282611834565b73ffffffffffffffffffffffffffffffffffffffff1614612cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbf90614f53565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2f90614ff3565b60405180910390fd5b612d43838383613d98565b612d4e6000826129ce565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d9e91906154ae565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612df591906153cd565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612eb4838383613d9d565b505050565b6000806000846003811115612ef7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115612f2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130645750600080846003811115612fce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613006577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b905092915050565b61307461180b565b6130b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130aa90614eb3565b60405180910390fd5b6000600760146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130f76129bf565b6040516131049190614daa565b60405180910390a1565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836131e291906153cd565b905092915050565b613204828260405180602001604052806000815250613da2565b5050565b61321061180b565b15613250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324790615093565b60405180910390fd5b6001600760146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586132946129bf565b6040516132a19190614daa565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331190615013565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161340b9190614e11565b60405180910390a3505050565b613423848484612c52565b61342f84848484613dfd565b61346e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346590614f13565b60405180910390fd5b50505050565b606060008214156134bc576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061361c565b600082905060005b600082146134ee5780806134d79061560d565b915050600a826134e79190615423565b91506134c4565b60008167ffffffffffffffff811115613530577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135625781602001600182028036833780820191505090505b5090505b600085146136155760018261357b91906154ae565b9150600a8561358a9190615656565b603061359691906153cd565b60f81b8183815181106135d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561360e9190615423565b9450613566565b8093505050505b919050565b6000818361362f91906154ae565b905092915050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000811161370e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370590615233565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1661372e6129bf565b73ffffffffffffffffffffffffffffffffffffffff161415613785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377c90614f93565b60405180910390fd5b61378f8282613c24565b3410156137d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c890615073565b60405180910390fd5b60008083600381111561380d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613845577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060030154811115613899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613890906151d3565b60405180910390fd5b6003808111156138d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82600381111561390b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14613b3e5760008083600381111561394c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613984577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600101600061399f6129bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1e90614e93565b60405180910390fd5b600080836003811115613a63577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613a9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206000016000613ab66129bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b34906150d3565b60405180910390fd5b5b6001600080846003811115613b7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613bb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206001016000613bcf6129bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000613cbe600080856003811115613c65577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613c9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002015483613f9490919063ffffffff16565b905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613d0e90614d95565b60006040518083038185875af1925050503d8060008114613d4b576040519150601f19603f3d011682016040523d82523d6000602084013e613d50565b606091505b5050905080613d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d8b90614fb3565b60405180910390fd5b5050565b505050565b505050565b613dac8383613faa565b613db96000848484613dfd565b613df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613def90614f13565b60405180910390fd5b505050565b6000613e1e8473ffffffffffffffffffffffffffffffffffffffff16614184565b15613f87578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613e476129bf565b8786866040518563ffffffff1660e01b8152600401613e699493929190614dc5565b602060405180830381600087803b158015613e8357600080fd5b505af1925050508015613eb457506040513d601f19601f82011682018060405250810190613eb191906146dd565b60015b613f37573d8060008114613ee4576040519150601f19603f3d011682016040523d82523d6000602084013e613ee9565b606091505b50600081511415613f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f2690614f13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613f8c565b600190505b949350505050565b60008183613fa29190615454565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561401a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161401190615153565b60405180910390fd5b6140238161289f565b15614063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161405a90614f73565b60405180910390fd5b61406f60008383613d98565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546140bf91906153cd565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461418060008383613d9d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546141b3906155aa565b90600052602060002090601f0160209004810192826141d5576000855561421c565b82601f106141ee57805160ff191683800117855561421c565b8280016001018555821561421c579182015b8281111561421b578251825591602001919060010190614200565b5b509050614229919061422d565b5090565b5b8082111561424657600081600090555060010161422e565b5090565b600061425d614258846152dc565b6152b7565b9050808382526020820190508285602086028201111561427c57600080fd5b60005b858110156142ac57816142928882614332565b84526020840193506020830192505060018101905061427f565b5050509392505050565b60006142c96142c484615308565b6152b7565b9050828152602081018484840111156142e157600080fd5b6142ec848285615568565b509392505050565b600061430761430284615339565b6152b7565b90508281526020810184848401111561431f57600080fd5b61432a848285615568565b509392505050565b60008135905061434181615df0565b92915050565b600082601f83011261435857600080fd5b813561436884826020860161424a565b91505092915050565b60008135905061438081615e07565b92915050565b60008135905061439581615e1e565b92915050565b6000815190506143aa81615e1e565b92915050565b600082601f8301126143c157600080fd5b81356143d18482602086016142b6565b91505092915050565b6000815190506143e981615e35565b92915050565b6000813590506143fe81615e4c565b92915050565b600082601f83011261441557600080fd5b81356144258482602086016142f4565b91505092915050565b60008135905061443d81615e5c565b92915050565b60006020828403121561445557600080fd5b600061446384828501614332565b91505092915050565b6000806040838503121561447f57600080fd5b600061448d85828601614332565b925050602061449e85828601614332565b9150509250929050565b6000806000606084860312156144bd57600080fd5b60006144cb86828701614332565b93505060206144dc86828701614332565b92505060406144ed8682870161442e565b9150509250925092565b6000806000806080858703121561450d57600080fd5b600061451b87828801614332565b945050602061452c87828801614332565b935050604061453d8782880161442e565b925050606085013567ffffffffffffffff81111561455a57600080fd5b614566878288016143b0565b91505092959194509250565b60008060008060008060c0878903121561458b57600080fd5b600061459989828a01614332565b96505060206145aa89828a01614332565b95505060406145bb89828a0161442e565b94505060606145cc89828a0161442e565b93505060806145dd89828a0161442e565b92505060a06145ee89828a0161442e565b9150509295509295509295565b6000806040838503121561460e57600080fd5b600061461c85828601614332565b925050602061462d85828601614371565b9150509250929050565b6000806040838503121561464a57600080fd5b600061465885828601614332565b92505060206146698582860161442e565b9150509250929050565b60006020828403121561468557600080fd5b600082013567ffffffffffffffff81111561469f57600080fd5b6146ab84828501614347565b91505092915050565b6000602082840312156146c657600080fd5b60006146d484828501614386565b91505092915050565b6000602082840312156146ef57600080fd5b60006146fd8482850161439b565b91505092915050565b60006020828403121561471857600080fd5b6000614726848285016143da565b91505092915050565b60006020828403121561474157600080fd5b600061474f848285016143ef565b91505092915050565b60006020828403121561476a57600080fd5b600082013567ffffffffffffffff81111561478457600080fd5b61479084828501614404565b91505092915050565b6000602082840312156147ab57600080fd5b60006147b98482850161442e565b91505092915050565b6147cb816154e2565b82525050565b6147da816154f4565b82525050565b60006147eb8261537f565b6147f58185615395565b9350614805818560208601615577565b61480e81615743565b840191505092915050565b60006148248261538a565b61482e81856153b1565b935061483e818560208601615577565b61484781615743565b840191505092915050565b600061485d8261538a565b61486781856153c2565b9350614877818560208601615577565b80840191505092915050565b60008154614890816155aa565b61489a81866153c2565b945060018216600081146148b557600181146148c6576148f9565b60ff198316865281860193506148f9565b6148cf8561536a565b60005b838110156148f1578154818901526001820191506020810190506148d2565b838801955050505b50505092915050565b600061490f600e836153b1565b915061491a82615754565b602082019050919050565b60006149326014836153b1565b915061493d8261577d565b602082019050919050565b6000614955600c836153b1565b9150614960826157a6565b602082019050919050565b6000614978601f836153b1565b9150614983826157cf565b602082019050919050565b600061499b6032836153b1565b91506149a6826157f8565b604082019050919050565b60006149be6026836153b1565b91506149c982615847565b604082019050919050565b60006149e16025836153b1565b91506149ec82615896565b604082019050919050565b6000614a04601c836153b1565b9150614a0f826158e5565b602082019050919050565b6000614a276020836153b1565b9150614a328261590e565b602082019050919050565b6000614a4a6014836153b1565b9150614a5582615937565b602082019050919050565b6000614a6d6016836153b1565b9150614a7882615960565b602082019050919050565b6000614a906024836153b1565b9150614a9b82615989565b604082019050919050565b6000614ab36019836153b1565b9150614abe826159d8565b602082019050919050565b6000614ad66015836153b1565b9150614ae182615a01565b602082019050919050565b6000614af9602c836153b1565b9150614b0482615a2a565b604082019050919050565b6000614b1c6012836153b1565b9150614b2782615a79565b602082019050919050565b6000614b3f6010836153b1565b9150614b4a82615aa2565b602082019050919050565b6000614b626038836153b1565b9150614b6d82615acb565b604082019050919050565b6000614b85600f836153b1565b9150614b9082615b1a565b602082019050919050565b6000614ba8602a836153b1565b9150614bb382615b43565b604082019050919050565b6000614bcb6029836153b1565b9150614bd682615b92565b604082019050919050565b6000614bee6010836153b1565b9150614bf982615be1565b602082019050919050565b6000614c116020836153b1565b9150614c1c82615c0a565b602082019050919050565b6000614c34602c836153b1565b9150614c3f82615c33565b604082019050919050565b6000614c576020836153b1565b9150614c6282615c82565b602082019050919050565b6000614c7a6021836153b1565b9150614c8582615cab565b604082019050919050565b6000614c9d6017836153b1565b9150614ca882615cfa565b602082019050919050565b6000614cc06000836153a6565b9150614ccb82615d23565b600082019050919050565b6000614ce36031836153b1565b9150614cee82615d26565b604082019050919050565b6000614d066012836153b1565b9150614d1182615d75565b602082019050919050565b6000614d296010836153b1565b9150614d3482615d9e565b602082019050919050565b6000614d4c601f836153b1565b9150614d5782615dc7565b602082019050919050565b614d6b8161555e565b82525050565b6000614d7d8285614883565b9150614d898284614852565b91508190509392505050565b6000614da082614cb3565b9150819050919050565b6000602082019050614dbf60008301846147c2565b92915050565b6000608082019050614dda60008301876147c2565b614de760208301866147c2565b614df46040830185614d62565b8181036060830152614e0681846147e0565b905095945050505050565b6000602082019050614e2660008301846147d1565b92915050565b6000608082019050614e4160008301876147d1565b614e4e60208301866147d1565b614e5b60408301856147d1565b614e6860608301846147d1565b95945050505050565b60006020820190508181036000830152614e8b8184614819565b905092915050565b60006020820190508181036000830152614eac81614902565b9050919050565b60006020820190508181036000830152614ecc81614925565b9050919050565b60006020820190508181036000830152614eec81614948565b9050919050565b60006020820190508181036000830152614f0c8161496b565b9050919050565b60006020820190508181036000830152614f2c8161498e565b9050919050565b60006020820190508181036000830152614f4c816149b1565b9050919050565b60006020820190508181036000830152614f6c816149d4565b9050919050565b60006020820190508181036000830152614f8c816149f7565b9050919050565b60006020820190508181036000830152614fac81614a1a565b9050919050565b60006020820190508181036000830152614fcc81614a3d565b9050919050565b60006020820190508181036000830152614fec81614a60565b9050919050565b6000602082019050818103600083015261500c81614a83565b9050919050565b6000602082019050818103600083015261502c81614aa6565b9050919050565b6000602082019050818103600083015261504c81614ac9565b9050919050565b6000602082019050818103600083015261506c81614aec565b9050919050565b6000602082019050818103600083015261508c81614b0f565b9050919050565b600060208201905081810360008301526150ac81614b32565b9050919050565b600060208201905081810360008301526150cc81614b55565b9050919050565b600060208201905081810360008301526150ec81614b78565b9050919050565b6000602082019050818103600083015261510c81614b9b565b9050919050565b6000602082019050818103600083015261512c81614bbe565b9050919050565b6000602082019050818103600083015261514c81614be1565b9050919050565b6000602082019050818103600083015261516c81614c04565b9050919050565b6000602082019050818103600083015261518c81614c27565b9050919050565b600060208201905081810360008301526151ac81614c4a565b9050919050565b600060208201905081810360008301526151cc81614c6d565b9050919050565b600060208201905081810360008301526151ec81614c90565b9050919050565b6000602082019050818103600083015261520c81614cd6565b9050919050565b6000602082019050818103600083015261522c81614cf9565b9050919050565b6000602082019050818103600083015261524c81614d1c565b9050919050565b6000602082019050818103600083015261526c81614d3f565b9050919050565b60006020820190506152886000830184614d62565b92915050565b60006040820190506152a36000830185614d62565b6152b06020830184614d62565b9392505050565b60006152c16152d2565b90506152cd82826155dc565b919050565b6000604051905090565b600067ffffffffffffffff8211156152f7576152f6615714565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561532357615322615714565b5b61532c82615743565b9050602081019050919050565b600067ffffffffffffffff82111561535457615353615714565b5b61535d82615743565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006153d88261555e565b91506153e38361555e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561541857615417615687565b5b828201905092915050565b600061542e8261555e565b91506154398361555e565b925082615449576154486156b6565b5b828204905092915050565b600061545f8261555e565b915061546a8361555e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154a3576154a2615687565b5b828202905092915050565b60006154b98261555e565b91506154c48361555e565b9250828210156154d7576154d6615687565b5b828203905092915050565b60006154ed8261553e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000615537826154e2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561559557808201518184015260208101905061557a565b838111156155a4576000848401525b50505050565b600060028204905060018216806155c257607f821691505b602082108114156155d6576155d56156e5565b5b50919050565b6155e582615743565b810181811067ffffffffffffffff8211171561560457615603615714565b5b80604052505050565b60006156188261555e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561564b5761564a615687565b5b600182019050919050565b60006156618261555e565b915061566c8361555e565b92508261567c5761567b6156b6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4e6f74206f70656e207965740000000000000000000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e7420746f20302061646472657373206973206e6f7420616c6c6f776564600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f57686974656c697374206e6f74206f70656e2079657400000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f416c72656164792072657665616c656400000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e7420616d6f756e742072656163686564000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f4d696e7420616d6f756e74207a65726f00000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615df9816154e2565b8114615e0457600080fd5b50565b615e10816154f4565b8114615e1b57600080fd5b50565b615e2781615500565b8114615e3257600080fd5b50565b615e3e8161552c565b8114615e4957600080fd5b50565b60048110615e5957600080fd5b50565b615e658161555e565b8114615e7057600080fd5b5056fea26469706673582212202804ac38ada9f3fa3579a416eaf1064d5f4ba0c8e9393043f433c7867636c78c64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000a1ee60cc54525685afc472162149f9e87c4d383700000000000000000000000000000000000000000000000000000000622e94bc0000000000000000000000000000000000000000000000000000000062a53bbc00000000000000000000000000000000000000000000000000000000622d421000000000000000000000000000000000000000000000000000000000622e9390000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e696f2f697066732f6261666b7265696673336d756a6e323336617a686771346e73613269636f626c72636c65726f366e7073707865666578696636777375786e7a6a7100000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103545760003560e01c8063664a1ad6116101c6578063a475b5dd116100f7578063da0239a611610095578063e985e9c51161006f578063e985e9c514610bb9578063f0c9a8cc14610bf6578063f2fde38b14610c21578063f6875be014610c4a5761035b565b8063da0239a614610b3c578063e0a7e61b14610b67578063e4d44c9714610b905761035b565b8063c5a1d0ff116100d1578063c5a1d0ff14610a7e578063c87b56dd14610aa9578063cd7c032614610ae6578063d547cfb714610b115761035b565b8063a475b5dd14610a13578063b425688814610a2a578063b88d4fde14610a555761035b565b80638d4d2b0c116101645780639785a6161161013e5780639785a61614610975578063a0712d68146109a3578063a22cb465146109bf578063a41fd6d9146109e85761035b565b80638d4d2b0c146108f45780638da5cb5b1461091f57806395d89b411461094a5761035b565b8063755edd17116101a0578063755edd17146108625780637d48aa191461088b5780638456cb59146108b45780638a02be68146108cb5761035b565b8063664a1ad6146107e357806370a082311461080e578063715018a61461084b5761035b565b8063342f48aa116102a0578063518302271161023e5780635c975abb116102185780635c975abb14610725578063611f3f1014610750578063627749e61461077b5780636352211e146107a65761035b565b806351830227146106a857806355f804b3146106d35780635c58bad4146106fc5761035b565b80633f4ba83a1161027a5780633f4ba83a1461062157806342842e0e146106385780634618163e146106615780634c9b3ca81461067d5761035b565b8063342f48aa146105b157806334c47321146105cd5780633d9287fa146105f65761035b565b806317e7f2951161030d578063209f3fba116102e7578063209f3fba1461050957806320a017751461053257806323b872dd1461055d57806332cb6b0c146105865761035b565b806317e7f2951461048857806318160ddd146104b35780631c139513146104de5761035b565b806301ffc9a71461036057806306fdde031461039d578063081812fc146103c857806308564ae314610405578063095ea7b314610421578063109b8a7f1461044a5761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b50610387600480360381019061038291906146b4565b610c73565b6040516103949190614e11565b60405180910390f35b3480156103a957600080fd5b506103b2610d55565b6040516103bf9190614e71565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190614799565b610de7565b6040516103fc9190614daa565b60405180910390f35b61041f600480360381019061041a9190614799565b610e6c565b005b34801561042d57600080fd5b5061044860048036038101906104439190614637565b610fbf565b005b34801561045657600080fd5b50610471600480360381019061046c919061472f565b6110d7565b60405161047f92919061528e565b60405180910390f35b34801561049457600080fd5b5061049d6110fb565b6040516104aa9190615273565b60405180910390f35b3480156104bf57600080fd5b506104c8611106565b6040516104d59190615273565b60405180910390f35b3480156104ea57600080fd5b506104f3611123565b6040516105009190615273565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b9190614443565b611129565b005b34801561053e57600080fd5b506105476111b3565b6040516105549190615273565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f91906144a8565b6111be565b005b34801561059257600080fd5b5061059b61121e565b6040516105a89190615273565b60405180910390f35b6105cb60048036038101906105c69190614799565b611224565b005b3480156105d957600080fd5b506105f460048036038101906105ef9190614673565b611377565b005b34801561060257600080fd5b5061060b611461565b6040516106189190614e11565b60405180910390f35b34801561062d57600080fd5b5061063661147a565b005b34801561064457600080fd5b5061065f600480360381019061065a91906144a8565b611500565b005b61067b60048036038101906106769190614799565b611520565b005b34801561068957600080fd5b50610692611673565b60405161069f9190615273565b60405180910390f35b3480156106b457600080fd5b506106bd611678565b6040516106ca9190614e11565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190614758565b61168b565b005b34801561070857600080fd5b50610723600480360381019061071e9190614673565b611721565b005b34801561073157600080fd5b5061073a61180b565b6040516107479190614e11565b60405180910390f35b34801561075c57600080fd5b50610765611822565b6040516107729190615273565b60405180910390f35b34801561078757600080fd5b5061079061182e565b60405161079d9190615273565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c89190614799565b611834565b6040516107da9190614daa565b60405180910390f35b3480156107ef57600080fd5b506107f86118e6565b6040516108059190614daa565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190614443565b61190c565b6040516108429190615273565b60405180910390f35b34801561085757600080fd5b506108606119c4565b005b34801561086e57600080fd5b5061088960048036038101906108849190614443565b611a4c565b005b34801561089757600080fd5b506108b260048036038101906108ad9190614443565b611b4d565b005b3480156108c057600080fd5b506108c9611bd7565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190614799565b611c5d565b005b34801561090057600080fd5b50610909611ce7565b6040516109169190614e11565b60405180910390f35b34801561092b57600080fd5b50610934611d01565b6040516109419190614daa565b60405180910390f35b34801561095657600080fd5b5061095f611d2b565b60405161096c9190614e71565b60405180910390f35b34801561098157600080fd5b5061098a611dbd565b60405161099a9493929190614e2c565b60405180910390f35b6109bd60048036038101906109b89190614799565b611df1565b005b3480156109cb57600080fd5b506109e660048036038101906109e191906145fb565b611f44565b005b3480156109f457600080fd5b506109fd611f5a565b604051610a0a9190615273565b60405180910390f35b348015610a1f57600080fd5b50610a28611f60565b005b348015610a3657600080fd5b50610a3f612049565b604051610a4c9190615273565b60405180910390f35b348015610a6157600080fd5b50610a7c6004803603810190610a7791906144f7565b61204f565b005b348015610a8a57600080fd5b50610a936120b1565b604051610aa09190614e11565b60405180910390f35b348015610ab557600080fd5b50610ad06004803603810190610acb9190614799565b6120ca565b604051610add9190614e71565b60405180910390f35b348015610af257600080fd5b50610afb6121ee565b604051610b089190614daa565b60405180910390f35b348015610b1d57600080fd5b50610b26612214565b604051610b339190614e71565b60405180910390f35b348015610b4857600080fd5b50610b516122a2565b604051610b5e9190615273565b60405180910390f35b348015610b7357600080fd5b50610b8e6004803603810190610b899190614572565b6122c5565b005b348015610b9c57600080fd5b50610bb76004803603810190610bb29190614443565b6123e7565b005b348015610bc557600080fd5b50610be06004803603810190610bdb919061446c565b612471565b604051610bed9190614e11565b60405180910390f35b348015610c0257600080fd5b50610c0b612573565b604051610c189190614e11565b60405180910390f35b348015610c2d57600080fd5b50610c486004803603810190610c439190614443565b61258c565b005b348015610c5657600080fd5b50610c716004803603810190610c6c9190614673565b612684565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d3e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d4e5750610d4d82612835565b5b9050919050565b606060018054610d64906155aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610d90906155aa565b8015610ddd5780601f10610db257610100808354040283529160200191610ddd565b820191906000526020600020905b815481529060010190602001808311610dc057829003601f168201915b5050505050905090565b6000610df28261289f565b610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890615173565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60026008541415610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990615253565b60405180910390fd5b6002600881905550610ec261180b565b15610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990615093565b60405180910390fd5b600b544210158015610f155750600c5442105b610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90614fd3565b60405180910390fd5b610f5f60008261290b565b610f676129bf565b73ffffffffffffffffffffffffffffffffffffffff167f7f9c9cb9137926c7f7c3bdbb971b627d14e5f95ded13be068becbd8ce819836182604051610fac9190615273565b60405180910390a2600160088190555050565b6000610fca82611834565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611032906151b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661105a6129bf565b73ffffffffffffffffffffffffffffffffffffffff1614806110895750611088816110836129bf565b612471565b5b6110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf906150b3565b60405180910390fd5b6110d283836129ce565b505050565b60006020528060005260406000206000915090508060020154908060030154905082565b66f523226980800081565b600060016111146010612a87565b61111e91906154ae565b905090565b600c5481565b6111316129bf565b73ffffffffffffffffffffffffffffffffffffffff1661114f611d01565b73ffffffffffffffffffffffffffffffffffffffff16146111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c90615193565b60405180910390fd5b6111b0600282612a95565b50565b66f523226980800081565b6111cf6111c96129bf565b82612b74565b61120e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611205906151f3565b60405180910390fd5b611219838383612c52565b505050565b6103e981565b6002600854141561126a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126190615253565b60405180910390fd5b600260088190555061127a61180b565b156112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190615093565b60405180910390fd5b600b5442101580156112cd5750600c5442105b61130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390614fd3565b60405180910390fd5b61131760018261290b565b61131f6129bf565b73ffffffffffffffffffffffffffffffffffffffff167f5d3a6b0dd9fbc17e3d7180bed2fcb7c0002bb1f4729b285322cacde3f136aefd826040516113649190615273565b60405180910390a2600160088190555050565b61137f6129bf565b73ffffffffffffffffffffffffffffffffffffffff1661139d611d01565b73ffffffffffffffffffffffffffffffffffffffff16146113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90615193565b60405180910390fd5b60005b815181101561145d5761144a600083838151811061143d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612a95565b80806114559061560d565b9150506113f6565b5050565b600061147560026114706129bf565b612eb9565b905090565b6114826129bf565b73ffffffffffffffffffffffffffffffffffffffff166114a0611d01565b73ffffffffffffffffffffffffffffffffffffffff16146114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed90615193565b60405180910390fd5b6114fe61306c565b565b61151b8383836040518060200160405280600081525061204f565b505050565b60026008541415611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90615253565b60405180910390fd5b600260088190555061157661180b565b156115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad90615093565b60405180910390fd5b600b5442101580156115c95750600c5442105b611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff90614fd3565b60405180910390fd5b61161360028261290b565b61161b6129bf565b73ffffffffffffffffffffffffffffffffffffffff167f3175668c3bc41d83dd982a992932fc7512416b71850f41443845d2a4c2e3ec63826040516116609190615273565b60405180910390a2600160088190555050565b600081565b601160009054906101000a900460ff1681565b6116936129bf565b73ffffffffffffffffffffffffffffffffffffffff166116b1611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90615193565b60405180910390fd5b80600f908051906020019061171d9291906141a7565b5050565b6117296129bf565b73ffffffffffffffffffffffffffffffffffffffff16611747611d01565b73ffffffffffffffffffffffffffffffffffffffff161461179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490615193565b60405180910390fd5b60005b8151811015611807576117f460018383815181106117e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612a95565b80806117ff9061560d565b9150506117a0565b5050565b6000600760149054906101000a900460ff16905090565b67015fb7f9b8c3800081565b600a5481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d490615113565b60405180910390fd5b80915050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611974906150f3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119cc6129bf565b73ffffffffffffffffffffffffffffffffffffffff166119ea611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790615193565b60405180910390fd5b611a4a600061310e565b565b611a546129bf565b73ffffffffffffffffffffffffffffffffffffffff16611a72611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90615193565b60405180910390fd5b6103e9611ae66001611ad8611106565b6131d490919063ffffffff16565b1115611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90615213565b60405180910390fd5b6000611b336010612a87565b9050611b3f601061276e565b611b4982826131ea565b5050565b611b556129bf565b73ffffffffffffffffffffffffffffffffffffffff16611b73611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090615193565b60405180910390fd5b611bd4600182612a95565b50565b611bdf6129bf565b73ffffffffffffffffffffffffffffffffffffffff16611bfd611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90615193565b60405180910390fd5b611c5b613208565b565b611c656129bf565b73ffffffffffffffffffffffffffffffffffffffff16611c8482611834565b73ffffffffffffffffffffffffffffffffffffffff1614611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190615033565b60405180910390fd5b611ce3816120ca565b5050565b60006009544210158015611cfc5750600a5442105b905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611d3a906155aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611d66906155aa565b8015611db35780601f10611d8857610100808354040283529160200191611db3565b820191906000526020600020905b815481529060010190602001808311611d9657829003601f168201915b5050505050905090565b600080600080611dcb612573565b611dd36120b1565b611ddb611461565b611de3611ce7565b935093509350935090919293565b60026008541415611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90615253565b60405180910390fd5b6002600881905550611e4761180b565b15611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e90615093565b60405180910390fd5b6009544210158015611e9a5750600a5442105b611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090614ed3565b60405180910390fd5b611ee460038261290b565b611eec6129bf565b73ffffffffffffffffffffffffffffffffffffffff167f748a2986091c2034d6e93b6f44f771a79f0e1d6acd8a60c68c17d4e1e2feaed282604051611f319190615273565b60405180910390a2600160088190555050565b611f56611f4f6129bf565b83836132ab565b5050565b600b5481565b611f686129bf565b73ffffffffffffffffffffffffffffffffffffffff16611f86611d01565b73ffffffffffffffffffffffffffffffffffffffff1614611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390615193565b60405180910390fd5b601160009054906101000a900460ff161561202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202390615133565b60405180910390fd5b6001601160006101000a81548160ff021916908315150217905550565b60095481565b61206061205a6129bf565b83612b74565b61209f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612096906151f3565b60405180910390fd5b6120ab84848484613418565b50505050565b60006120c560016120c06129bf565b612eb9565b905090565b60606120d58261289f565b612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b90614ef3565b60405180910390fd5b601160009054906101000a900460ff161561215b57600f61213483613474565b604051602001612145929190614d71565b60405160208183030381529060405290506121e9565b600f8054612168906155aa565b80601f0160208091040260200160405190810160405280929190818152602001828054612194906155aa565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b505050505090505b919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f8054612221906155aa565b80601f016020809104026020016040519081016040528092919081815260200182805461224d906155aa565b801561229a5780601f1061226f5761010080835404028352916020019161229a565b820191906000526020600020905b81548152906001019060200180831161227d57829003601f168201915b505050505081565b60006122c06122af611106565b6103e961362190919063ffffffff16565b905090565b6122cd6129bf565b73ffffffffffffffffffffffffffffffffffffffff166122eb611d01565b73ffffffffffffffffffffffffffffffffffffffff1614612341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233890615193565b60405180910390fd5b85600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360098190555082600a8190555080600c8190555081600b81905550505050505050565b6123ef6129bf565b73ffffffffffffffffffffffffffffffffffffffff1661240d611d01565b73ffffffffffffffffffffffffffffffffffffffff1614612463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245a90615193565b60405180910390fd5b61246e600082612a95565b50565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016124e99190614daa565b60206040518083038186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125399190614706565b73ffffffffffffffffffffffffffffffffffffffff16141561255f57600191505061256d565b6125698484613637565b9150505b92915050565b600061258760006125826129bf565b612eb9565b905090565b6125946129bf565b73ffffffffffffffffffffffffffffffffffffffff166125b2611d01565b73ffffffffffffffffffffffffffffffffffffffff1614612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff90615193565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266f90614f33565b60405180910390fd5b6126818161310e565b50565b61268c6129bf565b73ffffffffffffffffffffffffffffffffffffffff166126aa611d01565b73ffffffffffffffffffffffffffffffffffffffff1614612700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f790615193565b60405180910390fd5b60005b815181101561276a57612757600283838151811061274a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612a95565b80806127629061560d565b915050612703565b5050565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561282e57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050612832565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61291582826136cb565b60005b818110156129a857600061292c6010612a87565b9050612938601061276e565b6129496129436129bf565b826131ea565b806129526129bf565b73ffffffffffffffffffffffffffffffffffffffff167fbd3c55c5e8f6366c44c61be984033bf0500ba5dcc94adef65c6e3001ab3773ed60405160405180910390a35080806129a09061560d565b915050612918565b506129bb6129b68383613c24565b613cc6565b5050565b60006129c9612784565b905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a4183611834565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001600080846003811115612ad3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115612b0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000612b7f8261289f565b612bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb590615053565b60405180910390fd5b6000612bc983611834565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c3857508373ffffffffffffffffffffffffffffffffffffffff16612c2084610de7565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c495750612c488185612471565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c7282611834565b73ffffffffffffffffffffffffffffffffffffffff1614612cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbf90614f53565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2f90614ff3565b60405180910390fd5b612d43838383613d98565b612d4e6000826129ce565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d9e91906154ae565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612df591906153cd565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612eb4838383613d9d565b505050565b6000806000846003811115612ef7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115612f2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130645750600080846003811115612fce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613006577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b905092915050565b61307461180b565b6130b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130aa90614eb3565b60405180910390fd5b6000600760146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130f76129bf565b6040516131049190614daa565b60405180910390a1565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836131e291906153cd565b905092915050565b613204828260405180602001604052806000815250613da2565b5050565b61321061180b565b15613250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324790615093565b60405180910390fd5b6001600760146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586132946129bf565b6040516132a19190614daa565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331190615013565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161340b9190614e11565b60405180910390a3505050565b613423848484612c52565b61342f84848484613dfd565b61346e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346590614f13565b60405180910390fd5b50505050565b606060008214156134bc576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061361c565b600082905060005b600082146134ee5780806134d79061560d565b915050600a826134e79190615423565b91506134c4565b60008167ffffffffffffffff811115613530577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135625781602001600182028036833780820191505090505b5090505b600085146136155760018261357b91906154ae565b9150600a8561358a9190615656565b603061359691906153cd565b60f81b8183815181106135d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561360e9190615423565b9450613566565b8093505050505b919050565b6000818361362f91906154ae565b905092915050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000811161370e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370590615233565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1661372e6129bf565b73ffffffffffffffffffffffffffffffffffffffff161415613785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377c90614f93565b60405180910390fd5b61378f8282613c24565b3410156137d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c890615073565b60405180910390fd5b60008083600381111561380d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613845577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060030154811115613899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613890906151d3565b60405180910390fd5b6003808111156138d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82600381111561390b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14613b3e5760008083600381111561394c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613984577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600101600061399f6129bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1e90614e93565b60405180910390fd5b600080836003811115613a63577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613a9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206000016000613ab66129bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b34906150d3565b60405180910390fd5b5b6001600080846003811115613b7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613bb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206001016000613bcf6129bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000613cbe600080856003811115613c65577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115613c9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002015483613f9490919063ffffffff16565b905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613d0e90614d95565b60006040518083038185875af1925050503d8060008114613d4b576040519150601f19603f3d011682016040523d82523d6000602084013e613d50565b606091505b5050905080613d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d8b90614fb3565b60405180910390fd5b5050565b505050565b505050565b613dac8383613faa565b613db96000848484613dfd565b613df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613def90614f13565b60405180910390fd5b505050565b6000613e1e8473ffffffffffffffffffffffffffffffffffffffff16614184565b15613f87578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613e476129bf565b8786866040518563ffffffff1660e01b8152600401613e699493929190614dc5565b602060405180830381600087803b158015613e8357600080fd5b505af1925050508015613eb457506040513d601f19601f82011682018060405250810190613eb191906146dd565b60015b613f37573d8060008114613ee4576040519150601f19603f3d011682016040523d82523d6000602084013e613ee9565b606091505b50600081511415613f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f2690614f13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613f8c565b600190505b949350505050565b60008183613fa29190615454565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561401a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161401190615153565b60405180910390fd5b6140238161289f565b15614063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161405a90614f73565b60405180910390fd5b61406f60008383613d98565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546140bf91906153cd565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461418060008383613d9d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546141b3906155aa565b90600052602060002090601f0160209004810192826141d5576000855561421c565b82601f106141ee57805160ff191683800117855561421c565b8280016001018555821561421c579182015b8281111561421b578251825591602001919060010190614200565b5b509050614229919061422d565b5090565b5b8082111561424657600081600090555060010161422e565b5090565b600061425d614258846152dc565b6152b7565b9050808382526020820190508285602086028201111561427c57600080fd5b60005b858110156142ac57816142928882614332565b84526020840193506020830192505060018101905061427f565b5050509392505050565b60006142c96142c484615308565b6152b7565b9050828152602081018484840111156142e157600080fd5b6142ec848285615568565b509392505050565b600061430761430284615339565b6152b7565b90508281526020810184848401111561431f57600080fd5b61432a848285615568565b509392505050565b60008135905061434181615df0565b92915050565b600082601f83011261435857600080fd5b813561436884826020860161424a565b91505092915050565b60008135905061438081615e07565b92915050565b60008135905061439581615e1e565b92915050565b6000815190506143aa81615e1e565b92915050565b600082601f8301126143c157600080fd5b81356143d18482602086016142b6565b91505092915050565b6000815190506143e981615e35565b92915050565b6000813590506143fe81615e4c565b92915050565b600082601f83011261441557600080fd5b81356144258482602086016142f4565b91505092915050565b60008135905061443d81615e5c565b92915050565b60006020828403121561445557600080fd5b600061446384828501614332565b91505092915050565b6000806040838503121561447f57600080fd5b600061448d85828601614332565b925050602061449e85828601614332565b9150509250929050565b6000806000606084860312156144bd57600080fd5b60006144cb86828701614332565b93505060206144dc86828701614332565b92505060406144ed8682870161442e565b9150509250925092565b6000806000806080858703121561450d57600080fd5b600061451b87828801614332565b945050602061452c87828801614332565b935050604061453d8782880161442e565b925050606085013567ffffffffffffffff81111561455a57600080fd5b614566878288016143b0565b91505092959194509250565b60008060008060008060c0878903121561458b57600080fd5b600061459989828a01614332565b96505060206145aa89828a01614332565b95505060406145bb89828a0161442e565b94505060606145cc89828a0161442e565b93505060806145dd89828a0161442e565b92505060a06145ee89828a0161442e565b9150509295509295509295565b6000806040838503121561460e57600080fd5b600061461c85828601614332565b925050602061462d85828601614371565b9150509250929050565b6000806040838503121561464a57600080fd5b600061465885828601614332565b92505060206146698582860161442e565b9150509250929050565b60006020828403121561468557600080fd5b600082013567ffffffffffffffff81111561469f57600080fd5b6146ab84828501614347565b91505092915050565b6000602082840312156146c657600080fd5b60006146d484828501614386565b91505092915050565b6000602082840312156146ef57600080fd5b60006146fd8482850161439b565b91505092915050565b60006020828403121561471857600080fd5b6000614726848285016143da565b91505092915050565b60006020828403121561474157600080fd5b600061474f848285016143ef565b91505092915050565b60006020828403121561476a57600080fd5b600082013567ffffffffffffffff81111561478457600080fd5b61479084828501614404565b91505092915050565b6000602082840312156147ab57600080fd5b60006147b98482850161442e565b91505092915050565b6147cb816154e2565b82525050565b6147da816154f4565b82525050565b60006147eb8261537f565b6147f58185615395565b9350614805818560208601615577565b61480e81615743565b840191505092915050565b60006148248261538a565b61482e81856153b1565b935061483e818560208601615577565b61484781615743565b840191505092915050565b600061485d8261538a565b61486781856153c2565b9350614877818560208601615577565b80840191505092915050565b60008154614890816155aa565b61489a81866153c2565b945060018216600081146148b557600181146148c6576148f9565b60ff198316865281860193506148f9565b6148cf8561536a565b60005b838110156148f1578154818901526001820191506020810190506148d2565b838801955050505b50505092915050565b600061490f600e836153b1565b915061491a82615754565b602082019050919050565b60006149326014836153b1565b915061493d8261577d565b602082019050919050565b6000614955600c836153b1565b9150614960826157a6565b602082019050919050565b6000614978601f836153b1565b9150614983826157cf565b602082019050919050565b600061499b6032836153b1565b91506149a6826157f8565b604082019050919050565b60006149be6026836153b1565b91506149c982615847565b604082019050919050565b60006149e16025836153b1565b91506149ec82615896565b604082019050919050565b6000614a04601c836153b1565b9150614a0f826158e5565b602082019050919050565b6000614a276020836153b1565b9150614a328261590e565b602082019050919050565b6000614a4a6014836153b1565b9150614a5582615937565b602082019050919050565b6000614a6d6016836153b1565b9150614a7882615960565b602082019050919050565b6000614a906024836153b1565b9150614a9b82615989565b604082019050919050565b6000614ab36019836153b1565b9150614abe826159d8565b602082019050919050565b6000614ad66015836153b1565b9150614ae182615a01565b602082019050919050565b6000614af9602c836153b1565b9150614b0482615a2a565b604082019050919050565b6000614b1c6012836153b1565b9150614b2782615a79565b602082019050919050565b6000614b3f6010836153b1565b9150614b4a82615aa2565b602082019050919050565b6000614b626038836153b1565b9150614b6d82615acb565b604082019050919050565b6000614b85600f836153b1565b9150614b9082615b1a565b602082019050919050565b6000614ba8602a836153b1565b9150614bb382615b43565b604082019050919050565b6000614bcb6029836153b1565b9150614bd682615b92565b604082019050919050565b6000614bee6010836153b1565b9150614bf982615be1565b602082019050919050565b6000614c116020836153b1565b9150614c1c82615c0a565b602082019050919050565b6000614c34602c836153b1565b9150614c3f82615c33565b604082019050919050565b6000614c576020836153b1565b9150614c6282615c82565b602082019050919050565b6000614c7a6021836153b1565b9150614c8582615cab565b604082019050919050565b6000614c9d6017836153b1565b9150614ca882615cfa565b602082019050919050565b6000614cc06000836153a6565b9150614ccb82615d23565b600082019050919050565b6000614ce36031836153b1565b9150614cee82615d26565b604082019050919050565b6000614d066012836153b1565b9150614d1182615d75565b602082019050919050565b6000614d296010836153b1565b9150614d3482615d9e565b602082019050919050565b6000614d4c601f836153b1565b9150614d5782615dc7565b602082019050919050565b614d6b8161555e565b82525050565b6000614d7d8285614883565b9150614d898284614852565b91508190509392505050565b6000614da082614cb3565b9150819050919050565b6000602082019050614dbf60008301846147c2565b92915050565b6000608082019050614dda60008301876147c2565b614de760208301866147c2565b614df46040830185614d62565b8181036060830152614e0681846147e0565b905095945050505050565b6000602082019050614e2660008301846147d1565b92915050565b6000608082019050614e4160008301876147d1565b614e4e60208301866147d1565b614e5b60408301856147d1565b614e6860608301846147d1565b95945050505050565b60006020820190508181036000830152614e8b8184614819565b905092915050565b60006020820190508181036000830152614eac81614902565b9050919050565b60006020820190508181036000830152614ecc81614925565b9050919050565b60006020820190508181036000830152614eec81614948565b9050919050565b60006020820190508181036000830152614f0c8161496b565b9050919050565b60006020820190508181036000830152614f2c8161498e565b9050919050565b60006020820190508181036000830152614f4c816149b1565b9050919050565b60006020820190508181036000830152614f6c816149d4565b9050919050565b60006020820190508181036000830152614f8c816149f7565b9050919050565b60006020820190508181036000830152614fac81614a1a565b9050919050565b60006020820190508181036000830152614fcc81614a3d565b9050919050565b60006020820190508181036000830152614fec81614a60565b9050919050565b6000602082019050818103600083015261500c81614a83565b9050919050565b6000602082019050818103600083015261502c81614aa6565b9050919050565b6000602082019050818103600083015261504c81614ac9565b9050919050565b6000602082019050818103600083015261506c81614aec565b9050919050565b6000602082019050818103600083015261508c81614b0f565b9050919050565b600060208201905081810360008301526150ac81614b32565b9050919050565b600060208201905081810360008301526150cc81614b55565b9050919050565b600060208201905081810360008301526150ec81614b78565b9050919050565b6000602082019050818103600083015261510c81614b9b565b9050919050565b6000602082019050818103600083015261512c81614bbe565b9050919050565b6000602082019050818103600083015261514c81614be1565b9050919050565b6000602082019050818103600083015261516c81614c04565b9050919050565b6000602082019050818103600083015261518c81614c27565b9050919050565b600060208201905081810360008301526151ac81614c4a565b9050919050565b600060208201905081810360008301526151cc81614c6d565b9050919050565b600060208201905081810360008301526151ec81614c90565b9050919050565b6000602082019050818103600083015261520c81614cd6565b9050919050565b6000602082019050818103600083015261522c81614cf9565b9050919050565b6000602082019050818103600083015261524c81614d1c565b9050919050565b6000602082019050818103600083015261526c81614d3f565b9050919050565b60006020820190506152886000830184614d62565b92915050565b60006040820190506152a36000830185614d62565b6152b06020830184614d62565b9392505050565b60006152c16152d2565b90506152cd82826155dc565b919050565b6000604051905090565b600067ffffffffffffffff8211156152f7576152f6615714565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561532357615322615714565b5b61532c82615743565b9050602081019050919050565b600067ffffffffffffffff82111561535457615353615714565b5b61535d82615743565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006153d88261555e565b91506153e38361555e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561541857615417615687565b5b828201905092915050565b600061542e8261555e565b91506154398361555e565b925082615449576154486156b6565b5b828204905092915050565b600061545f8261555e565b915061546a8361555e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154a3576154a2615687565b5b828202905092915050565b60006154b98261555e565b91506154c48361555e565b9250828210156154d7576154d6615687565b5b828203905092915050565b60006154ed8261553e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000615537826154e2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561559557808201518184015260208101905061557a565b838111156155a4576000848401525b50505050565b600060028204905060018216806155c257607f821691505b602082108114156155d6576155d56156e5565b5b50919050565b6155e582615743565b810181811067ffffffffffffffff8211171561560457615603615714565b5b80604052505050565b60006156188261555e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561564b5761564a615687565b5b600182019050919050565b60006156618261555e565b915061566c8361555e565b92508261567c5761567b6156b6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4e6f74206f70656e207965740000000000000000000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e7420746f20302061646472657373206973206e6f7420616c6c6f776564600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f57686974656c697374206e6f74206f70656e2079657400000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f416c72656164792072657665616c656400000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e7420616d6f756e742072656163686564000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f4d696e7420616d6f756e74207a65726f00000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615df9816154e2565b8114615e0457600080fd5b50565b615e10816154f4565b8114615e1b57600080fd5b50565b615e2781615500565b8114615e3257600080fd5b50565b615e3e8161552c565b8114615e4957600080fd5b50565b60048110615e5957600080fd5b50565b615e658161555e565b8114615e7057600080fd5b5056fea26469706673582212202804ac38ada9f3fa3579a416eaf1064d5f4ba0c8e9393043f433c7867636c78c64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000a1ee60cc54525685afc472162149f9e87c4d383700000000000000000000000000000000000000000000000000000000622e94bc0000000000000000000000000000000000000000000000000000000062a53bbc00000000000000000000000000000000000000000000000000000000622d421000000000000000000000000000000000000000000000000000000000622e9390000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e696f2f697066732f6261666b7265696673336d756a6e323336617a686771346e73613269636f626c72636c65726f366e7073707865666578696636777375786e7a6a7100000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseTokenURI (string): https://ipfs.io/ipfs/bafkreifs3mujn236azhgq4nsa2icoblrclero6npspxefexif6wsuxnzjq
Arg [1] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [2] : _fundWallet (address): 0xa1ee60cC54525685AfC472162149f9e87c4d3837
Arg [3] : _openTime (uint256): 1647219900
Arg [4] : _closeTime (uint256): 1654995900
Arg [5] : _whitelistOpentime (uint256): 1647133200
Arg [6] : _whitelistClosetime (uint256): 1647219600

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [2] : 000000000000000000000000a1ee60cc54525685afc472162149f9e87c4d3837
Arg [3] : 00000000000000000000000000000000000000000000000000000000622e94bc
Arg [4] : 0000000000000000000000000000000000000000000000000000000062a53bbc
Arg [5] : 00000000000000000000000000000000000000000000000000000000622d4210
Arg [6] : 00000000000000000000000000000000000000000000000000000000622e9390
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f6261666b7265696673336d
Arg [9] : 756a6e323336617a686771346e73613269636f626c72636c65726f366e707370
Arg [10] : 7865666578696636777375786e7a6a7100000000000000000000000000000000


Deployed Bytecode Sourcemap

55161:7875:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33434:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34379:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35938:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58395:263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35461:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51771:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;52670:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60815:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55509:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53915:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52730:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36688:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55361:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58666:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53546:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54298:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57281:65;;;;;;;;;;;;;:::i;:::-;;37098:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58118:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52785:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55700:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57480:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54545:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4489:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52839:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55439:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34073:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55591:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33803:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2536:103;;;;;;;;;;;;;:::i;:::-;;57593:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54419:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57212:61;;;;;;;;;;;;;:::i;:::-;;59393:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61890:206;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1885:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34548:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61048:319;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;57865:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36231:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55470:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57354:118;;;;;;;;;;;;;:::i;:::-;;55409:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37354:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54782:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62104:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55549:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55623:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60928:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61375:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53414:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62525:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53789:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2794:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54051:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33434:305;33536:4;33588:25;33573:40;;;:11;:40;;;;:105;;;;33645:33;33630:48;;;:11;:48;;;;33573:105;:158;;;;33695:36;33719:11;33695:23;:36::i;:::-;33573:158;33553:178;;33434:305;;;:::o;34379:100::-;34433:13;34466:5;34459:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:100;:::o;35938:221::-;36014:7;36042:16;36050:7;36042;:16::i;:::-;36034:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36127:15;:24;36143:7;36127:24;;;;;;;;;;;;;;;;;;;;;36120:31;;35938:221;;;:::o;58395:263::-;49837:1;50435:7;;:19;;50427:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49837:1;50568:7;:18;;;;4815:8:::1;:6;:8::i;:::-;4814:9;4806:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57060:17:::2;;57041:15;:36;;:93;;;;;57116:18;;57098:15;:36;57041:93;57019:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;58558:38:::3;58567:15;58584:11;58558:8;:38::i;:::-;58624:12;:10;:12::i;:::-;58612:38;;;58638:11;58612:38;;;;;;:::i;:::-;;;;;;;;49793:1:::0;50747:7;:22;;;;58395:263;:::o;35461:411::-;35542:13;35558:23;35573:7;35558:14;:23::i;:::-;35542:39;;35606:5;35600:11;;:2;:11;;;;35592:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35700:5;35684:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35709:37;35726:5;35733:12;:10;:12::i;:::-;35709:16;:37::i;:::-;35684:62;35662:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35843:21;35852:2;35856:7;35843:8;:21::i;:::-;35461:411;;;:::o;51771:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52670:53::-;52712:11;52670:53;:::o;60815:105::-;60859:7;60911:1;60886:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;60879:33;;60815:105;:::o;55509:33::-;;;;:::o;53915:128::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53998:37:::1;54003:17;54022:12;53998:4;:37::i;:::-;53915:128:::0;:::o;52730:48::-;52767:11;52730:48;:::o;36688:339::-;36883:41;36902:12;:10;:12::i;:::-;36916:7;36883:18;:41::i;:::-;36875:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36991:28;37001:4;37007:2;37011:7;36991:9;:28::i;:::-;36688:339;;;:::o;55361:41::-;55398:4;55361:41;:::o;58666:254::-;49837:1;50435:7;;:19;;50427:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49837:1;50568:7;:18;;;;4815:8:::1;:6;:8::i;:::-;4814:9;4806:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57060:17:::2;;57041:15;:36;;:93;;;;;57116:18;;57098:15;:36;57041:93;57019:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;58826:35:::3;58835:12;58849:11;58826:8;:35::i;:::-;58886:12;:10;:12::i;:::-;58877:35;;;58900:11;58877:35;;;;;;:::i;:::-;;;;;;;;49793:1:::0;50747:7;:22;;;;58666:254;:::o;53546:235::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53664:9:::1;53659:115;53683:12;:19;53679:1;:23;53659:115;;;53724:38;53729:15;53746:12;53759:1;53746:15;;;;;;;;;;;;;;;;;;;;;;53724:4;:38::i;:::-;53704:3;;;;;:::i;:::-;;;;53659:115;;;;53546:235:::0;:::o;54298:113::-;54342:4;54366:37;54371:17;54390:12;:10;:12::i;:::-;54366:4;:37::i;:::-;54359:44;;54298:113;:::o;57281:65::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57328:10:::1;:8;:10::i;:::-;57281:65::o:0;37098:185::-;37236:39;37253:4;37259:2;37263:7;37236:39;;;;;;;;;;;;:16;:39::i;:::-;37098:185;;;:::o;58118:269::-;49837:1;50435:7;;:19;;50427:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49837:1;50568:7;:18;;;;4815:8:::1;:6;:8::i;:::-;4814:9;4806:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57060:17:::2;;57041:15;:36;;:93;;;;;57116:18;;57098:15;:36;57041:93;57019:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;58283:40:::3;58292:17;58311:11;58283:8;:40::i;:::-;58353:12;:10;:12::i;:::-;58339:40;;;58367:11;58339:40;;;;;;:::i;:::-;;;;;;;;49793:1:::0;50747:7;:22;;;;58118:269;:::o;52785:47::-;52825:7;52785:47;:::o;55700:28::-;;;;;;;;;;;;;:::o;57480:105::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57568:9:::1;57553:12;:24;;;;;;;;;;;;:::i;:::-;;57480:105:::0;:::o;54545:229::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54660:9:::1;54655:112;54679:12;:19;54675:1;:23;54655:112;;;54720:35;54725:12;54739;54752:1;54739:15;;;;;;;;;;;;;;;;;;;;;;54720:4;:35::i;:::-;54700:3;;;;;:::i;:::-;;;;54655:112;;;;54545:229:::0;:::o;4489:86::-;4536:4;4560:7;;;;;;;;;;;4553:14;;4489:86;:::o;52839:50::-;52878:11;52839:50;:::o;55439:24::-;;;;:::o;34073:239::-;34145:7;34165:13;34181:7;:16;34189:7;34181:16;;;;;;;;;;;;;;;;;;;;;34165:32;;34233:1;34216:19;;:5;:19;;;;34208:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34299:5;34292:12;;;34073:239;;;:::o;55591:25::-;;;;;;;;;;;;;:::o;33803:208::-;33875:7;33920:1;33903:19;;:5;:19;;;;33895:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33987:9;:16;33997:5;33987:16;;;;;;;;;;;;;;;;33980:23;;33803:208;;;:::o;2536:103::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2601:30:::1;2628:1;2601:18;:30::i;:::-;2536:103::o:0;57593:264::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55398:4:::1;57658:20;57676:1;57658:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:34;;57650:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57726:22;57751;:12;:20;:22::i;:::-;57726:47;;57784:24;:12;:22;:24::i;:::-;57819:30;57829:3;57834:14;57819:9;:30::i;:::-;2176:1;57593:264:::0;:::o;54419:118::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54497:32:::1;54502:12;54516;54497:4;:32::i;:::-;54419:118:::0;:::o;57212:61::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57257:8:::1;:6;:8::i;:::-;57212:61::o:0;59393:161::-;59479:12;:10;:12::i;:::-;59458:33;;:17;59466:8;59458:7;:17::i;:::-;:33;;;59450:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59528:18;59537:8;59528;:18::i;:::-;;59393:161;:::o;61890:206::-;61932:4;62049:8;;62030:15;:27;;:58;;;;;62079:9;;62061:15;:27;62030:58;62023:65;;61890:206;:::o;1885:87::-;1931:7;1958:6;;;;;;;;;;;1951:13;;1885:87;:::o;34548:104::-;34604:13;34637:7;34630:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34548:104;:::o;61048:319::-;61131:4;61150;61169;61188;61242:20;:18;:20::i;:::-;61277:17;:15;:17::i;:::-;61309:13;:11;:13::i;:::-;61337:11;:9;:11::i;:::-;61220:139;;;;;;;;61048:319;;;;:::o;57865:245::-;49837:1;50435:7;;:19;;50427:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49837:1;50568:7;:18;;;;4815:8:::1;:6;:8::i;:::-;4814:9;4806:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56872:8:::2;;56853:15;:27;;:58;;;;;56902:9;;56884:15;:27;56853:58;56831:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;58012:37:::3;58021:14;58037:11;58012:8;:37::i;:::-;58076:12;:10;:12::i;:::-;58065:37;;;58090:11;58065:37;;;;;;:::i;:::-;;;;;;;;49793:1:::0;50747:7;:22;;;;57865:245;:::o;36231:155::-;36326:52;36345:12;:10;:12::i;:::-;36359:8;36369;36326:18;:52::i;:::-;36231:155;;:::o;55470:32::-;;;;:::o;57354:118::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57409:8:::1;;;;;;;;;;;57408:9;57400:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57460:4;57449:8;;:15;;;;;;;;;;;;;;;;;;57354:118::o:0;55409:23::-;;;;:::o;37354:328::-;37529:41;37548:12;:10;:12::i;:::-;37562:7;37529:18;:41::i;:::-;37521:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37635:39;37649:4;37655:2;37659:7;37668:5;37635:13;:39::i;:::-;37354:328;;;;:::o;54782:112::-;54830:4;54854:32;54859:12;54873;:10;:12::i;:::-;54854:4;:32::i;:::-;54847:39;;54782:112;:::o;62104:413::-;62206:13;62245:17;62253:8;62245:7;:17::i;:::-;62237:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;62313:8;;;;;;;;;;;62309:171;;;62408:12;62422:26;62439:8;62422:16;:26::i;:::-;62391:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62338:130;;;;62309:171;62497:12;62490:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62104:413;;;;:::o;55549:35::-;;;;;;;;;;;;;:::o;55623:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60928:112::-;60976:7;61003:29;61018:13;:11;:13::i;:::-;55398:4;61003:14;;:29;;;;:::i;:::-;60996:36;;60928:112;:::o;61375:507::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61654:21:::1;61631:20;;:44;;;;;;;;;;;;;;;;;;61699:11;61686:10;;:24;;;;;;;;;;;;;;;;;;61732:9;61721:8;:20;;;;61764:10;61752:9;:22;;;;61806:19;61785:18;:40;;;;61856:18;61836:17;:38;;;;61375:507:::0;;;;;;:::o;53414:124::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53495:35:::1;53500:15;53517:12;53495:4;:35::i;:::-;53414:124:::0;:::o;62525:380::-;62650:4;62672:27;62716:20;;;;;;;;;;;62672:65;;62793:8;62752:49;;62760:13;:21;;;62782:5;62760:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62752:49;;;62748:93;;;62825:4;62818:11;;;;;62748:93;62858:39;62881:5;62888:8;62858:22;:39::i;:::-;62851:46;;;62525:380;;;;;:::o;53789:118::-;53840:4;53864:35;53869:15;53886:12;:10;:12::i;:::-;53864:4;:35::i;:::-;53857:42;;53789:118;:::o;2794:201::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2903:1:::1;2883:22;;:8;:22;;;;2875:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2959:28;2978:8;2959:18;:28::i;:::-;2794:201:::0;:::o;54051:239::-;2116:12;:10;:12::i;:::-;2105:23;;:7;:5;:7::i;:::-;:23;;;2097:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54171:9:::1;54166:117;54190:12;:19;54186:1;:23;54166:117;;;54231:40;54236:17;54255:12;54268:1;54255:15;;;;;;;;;;;;;;;;;;;;;;54231:4;:40::i;:::-;54211:3;;;;;:::i;:::-;;;;54166:117;;;;54051:239:::0;:::o;47548:127::-;47655:1;47637:7;:14;;;:19;;;;;;;;;;;47548:127;:::o;50889:507::-;50933:22;50994:4;50972:27;;:10;:27;;;50968:397;;;51016:18;51037:8;;51016:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51060:13;51076:8;;:15;;51060:31;;51217:42;51187:5;51180;51176:17;51170:24;51144:134;51134:144;;51115:178;;;;;51342:10;51325:28;;50968:397;50889:507;:::o;31859:157::-;31944:4;31983:25;31968:40;;;:11;:40;;;;31961:47;;31859:157;;;:::o;39192:127::-;39257:4;39309:1;39281:30;;:7;:16;39289:7;39281:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39274:37;;39192:127;;;:::o;58928:457::-;59005:39;59022:8;59032:11;59005:16;:39::i;:::-;59060:9;59055:269;59079:11;59075:1;:15;59055:269;;;59112:22;59137;:12;:20;:22::i;:::-;59112:47;;59174:24;:12;:22;:24::i;:::-;59213:39;59223:12;:10;:12::i;:::-;59237:14;59213:9;:39::i;:::-;59297:14;59283:12;:10;:12::i;:::-;59272:40;;;;;;;;;;;;59055:269;59092:3;;;;;:::i;:::-;;;;59055:269;;;;59334:43;59348:28;59354:8;59364:11;59348:5;:28::i;:::-;59334:13;:43::i;:::-;58928:457;;:::o;62913:120::-;62967:14;63001:24;:22;:24::i;:::-;62994:31;;62913:120;:::o;43338:174::-;43440:2;43413:15;:24;43429:7;43413:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43496:7;43492:2;43458:46;;43467:23;43482:7;43467:14;:23::i;:::-;43458:46;;;;;;;;;;;;43338:174;;:::o;47426:114::-;47491:7;47518;:14;;;47511:21;;47426:114;;;:::o;51830:129::-;51947:4;51898:15;:24;51914:7;51898:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;:46;51936:7;51898:46;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51830:129;;:::o;39486:348::-;39579:4;39604:16;39612:7;39604;:16::i;:::-;39596:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39680:13;39696:23;39711:7;39696:14;:23::i;:::-;39680:39;;39749:5;39738:16;;:7;:16;;;:51;;;;39782:7;39758:31;;:20;39770:7;39758:11;:20::i;:::-;:31;;;39738:51;:87;;;;39793:32;39810:5;39817:7;39793:16;:32::i;:::-;39738:87;39730:96;;;39486:348;;;;:::o;42595:625::-;42754:4;42727:31;;:23;42742:7;42727:14;:23::i;:::-;:31;;;42719:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42833:1;42819:16;;:2;:16;;;;42811:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42889:39;42910:4;42916:2;42920:7;42889:20;:39::i;:::-;42993:29;43010:1;43014:7;42993:8;:29::i;:::-;43054:1;43035:9;:15;43045:4;43035:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43083:1;43066:9;:13;43076:2;43066:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43114:2;43095:7;:16;43103:7;43095:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43153:7;43149:2;43134:27;;43143:4;43134:27;;;;;;;;;;;;43174:38;43194:4;43200:2;43204:7;43174:19;:38::i;:::-;42595:625;;;:::o;52245:253::-;52343:4;52385:15;:24;52401:7;52385:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;:46;52423:7;52385:46;;;;;;;;;;;;;;;;;;;;;;;;;:105;;;;;52449:15;:24;52465:7;52449:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;:41;52482:7;52449:41;;;;;;;;;;;;;;;;;;;;;;;;;52448:42;52385:105;52365:125;;52245:253;;;;:::o;5548:120::-;5092:8;:6;:8::i;:::-;5084:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;5617:5:::1;5607:7;;:15;;;;;;;;;;;;;;;;;;5638:22;5647:12;:10;:12::i;:::-;5638:22;;;;;;:::i;:::-;;;;;;;;5548:120::o:0;3155:191::-;3229:16;3248:6;;;;;;;;;;;3229:25;;3274:8;3265:6;;:17;;;;;;;;;;;;;;;;;;3329:8;3298:40;;3319:8;3298:40;;;;;;;;;;;;3155:191;;:::o;8543:98::-;8601:7;8632:1;8628;:5;;;;:::i;:::-;8621:12;;8543:98;;;;:::o;40176:110::-;40252:26;40262:2;40266:7;40252:26;;;;;;;;;;;;:9;:26::i;:::-;40176:110;;:::o;5289:118::-;4815:8;:6;:8::i;:::-;4814:9;4806:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;5359:4:::1;5349:7;;:14;;;;;;;;;;;;;;;;;;5379:20;5386:12;:10;:12::i;:::-;5379:20;;;;;;:::i;:::-;;;;;;;;5289:118::o:0;43654:315::-;43809:8;43800:17;;:5;:17;;;;43792:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43896:8;43858:18;:25;43877:5;43858:25;;;;;;;;;;;;;;;:35;43884:8;43858:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43942:8;43920:41;;43935:5;43920:41;;;43952:8;43920:41;;;;;;:::i;:::-;;;;;;;;43654:315;;;:::o;38564:::-;38721:28;38731:4;38737:2;38741:7;38721:9;:28::i;:::-;38768:48;38791:4;38797:2;38801:7;38810:5;38768:22;:48::i;:::-;38760:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38564:315;;;;:::o;29231:723::-;29287:13;29517:1;29508:5;:10;29504:53;;;29535:10;;;;;;;;;;;;;;;;;;;;;29504:53;29567:12;29582:5;29567:20;;29598:14;29623:78;29638:1;29630:4;:9;29623:78;;29656:8;;;;;:::i;:::-;;;;29687:2;29679:10;;;;;:::i;:::-;;;29623:78;;;29711:19;29743:6;29733:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29711:39;;29761:154;29777:1;29768:5;:10;29761:154;;29805:1;29795:11;;;;;:::i;:::-;;;29872:2;29864:5;:10;;;;:::i;:::-;29851:2;:24;;;;:::i;:::-;29838:39;;29821:6;29828;29821:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;29901:2;29892:11;;;;;:::i;:::-;;;29761:154;;;29939:6;29925:21;;;;;29231:723;;;;:::o;8924:98::-;8982:7;9013:1;9009;:5;;;;:::i;:::-;9002:12;;8924:98;;;;:::o;36457:164::-;36554:4;36578:18;:25;36597:5;36578:25;;;;;;;;;;;;;;;:35;36604:8;36578:35;;;;;;;;;;;;;;;;;;;;;;;;;36571:42;;36457:164;;;;:::o;59562:876::-;59669:1;59655:11;:15;59647:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59734:1;59710:26;;:12;:10;:12::i;:::-;:26;;;;59702:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;59819:28;59825:8;59835:11;59819:5;:28::i;:::-;59806:9;:41;;59784:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;59941:15;:25;59957:8;59941:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;59926:11;:49;;59904:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;60055:14;60043:26;;;;;;;;;;;;;;;;:8;:26;;;;;;;;;;;;;;;;;60039:327;;60113:15;:25;60129:8;60113:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:47;60147:12;:10;:12::i;:::-;60113:47;;;;;;;;;;;;;;;;;;;;;;;;;60112:48;60086:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;60251:15;:25;60267:8;60251:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;:52;60290:12;:10;:12::i;:::-;60251:52;;;;;;;;;;;;;;;;;;;;;;;;;60225:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;60039:327;60426:4;60376:15;:25;60392:8;60376:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:47;60410:12;:10;:12::i;:::-;60376:47;;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;59562:876;;:::o;60625:182::-;60723:7;60755:44;60766:15;:24;60782:7;60766:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;60755:6;:10;;:44;;;;:::i;:::-;60748:51;;60625:182;;;;:::o;60446:171::-;60506:12;60524:10;;;;;;;;;;;:15;;60547:6;60524:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60505:53;;;60577:7;60569:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;60446:171;;:::o;45905:126::-;;;;:::o;46416:125::-;;;;:::o;40513:321::-;40643:18;40649:2;40653:7;40643:5;:18::i;:::-;40694:54;40725:1;40729:2;40733:7;40742:5;40694:22;:54::i;:::-;40672:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40513:321;;;:::o;44534:799::-;44689:4;44710:15;:2;:13;;;:15::i;:::-;44706:620;;;44762:2;44746:36;;;44783:12;:10;:12::i;:::-;44797:4;44803:7;44812:5;44746:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44742:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45005:1;44988:6;:13;:18;44984:272;;;45031:60;;;;;;;;;;:::i;:::-;;;;;;;;44984:272;45206:6;45200:13;45191:6;45187:2;45183:15;45176:38;44742:529;44879:41;;;44869:51;;;:6;:51;;;;44862:58;;;;;44706:620;45310:4;45303:11;;44534:799;;;;;;;:::o;9281:98::-;9339:7;9370:1;9366;:5;;;;:::i;:::-;9359:12;;9281:98;;;;:::o;41170:439::-;41264:1;41250:16;;:2;:16;;;;41242:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41323:16;41331:7;41323;:16::i;:::-;41322:17;41314:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41385:45;41414:1;41418:2;41422:7;41385:20;:45::i;:::-;41460:1;41443:9;:13;41453:2;41443:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41491:2;41472:7;:16;41480:7;41472:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41536:7;41532:2;41511:33;;41528:1;41511:33;;;;;;;;;;;;41557:44;41585:1;41589:2;41593:7;41557:19;:44::i;:::-;41170:439;;:::o;21590:326::-;21650:4;21907:1;21885:7;:19;;;:23;21878:30;;21590:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2040:5;2078:6;2065:20;2056:29;;2094:32;2120:5;2094:32;:::i;:::-;2046:86;;;;:::o;2138:141::-;2194:5;2225:6;2219:13;2210:22;;2241:32;2267:5;2241:32;:::i;:::-;2200:79;;;;:::o;2298:271::-;2353:5;2402:3;2395:4;2387:6;2383:17;2379:27;2369:2;;2420:1;2417;2410:12;2369:2;2460:6;2447:20;2485:78;2559:3;2551:6;2544:4;2536:6;2532:17;2485:78;:::i;:::-;2476:87;;2359:210;;;;;:::o;2575:201::-;2661:5;2692:6;2686:13;2677:22;;2708:62;2764:5;2708:62;:::i;:::-;2667:109;;;;:::o;2782:163::-;2840:5;2878:6;2865:20;2856:29;;2894:45;2933:5;2894:45;:::i;:::-;2846:99;;;;:::o;2965:273::-;3021:5;3070:3;3063:4;3055:6;3051:17;3047:27;3037:2;;3088:1;3085;3078:12;3037:2;3128:6;3115:20;3153:79;3228:3;3220:6;3213:4;3205:6;3201:17;3153:79;:::i;:::-;3144:88;;3027:211;;;;;:::o;3244:139::-;3290:5;3328:6;3315:20;3306:29;;3344:33;3371:5;3344:33;:::i;:::-;3296:87;;;;:::o;3389:262::-;3448:6;3497:2;3485:9;3476:7;3472:23;3468:32;3465:2;;;3513:1;3510;3503:12;3465:2;3556:1;3581:53;3626:7;3617:6;3606:9;3602:22;3581:53;:::i;:::-;3571:63;;3527:117;3455:196;;;;:::o;3657:407::-;3725:6;3733;3782:2;3770:9;3761:7;3757:23;3753:32;3750:2;;;3798:1;3795;3788:12;3750:2;3841:1;3866:53;3911:7;3902:6;3891:9;3887:22;3866:53;:::i;:::-;3856:63;;3812:117;3968:2;3994:53;4039:7;4030:6;4019:9;4015:22;3994:53;:::i;:::-;3984:63;;3939:118;3740:324;;;;;:::o;4070:552::-;4147:6;4155;4163;4212:2;4200:9;4191:7;4187:23;4183:32;4180:2;;;4228:1;4225;4218:12;4180:2;4271:1;4296:53;4341:7;4332:6;4321:9;4317:22;4296:53;:::i;:::-;4286:63;;4242:117;4398:2;4424:53;4469:7;4460:6;4449:9;4445:22;4424:53;:::i;:::-;4414:63;;4369:118;4526:2;4552:53;4597:7;4588:6;4577:9;4573:22;4552:53;:::i;:::-;4542:63;;4497:118;4170:452;;;;;:::o;4628:809::-;4723:6;4731;4739;4747;4796:3;4784:9;4775:7;4771:23;4767:33;4764:2;;;4813:1;4810;4803:12;4764:2;4856:1;4881:53;4926:7;4917:6;4906:9;4902:22;4881:53;:::i;:::-;4871:63;;4827:117;4983:2;5009:53;5054:7;5045:6;5034:9;5030:22;5009:53;:::i;:::-;4999:63;;4954:118;5111:2;5137:53;5182:7;5173:6;5162:9;5158:22;5137:53;:::i;:::-;5127:63;;5082:118;5267:2;5256:9;5252:18;5239:32;5298:18;5290:6;5287:30;5284:2;;;5330:1;5327;5320:12;5284:2;5358:62;5412:7;5403:6;5392:9;5388:22;5358:62;:::i;:::-;5348:72;;5210:220;4754:683;;;;;;;:::o;5443:990::-;5547:6;5555;5563;5571;5579;5587;5636:3;5624:9;5615:7;5611:23;5607:33;5604:2;;;5653:1;5650;5643:12;5604:2;5696:1;5721:53;5766:7;5757:6;5746:9;5742:22;5721:53;:::i;:::-;5711:63;;5667:117;5823:2;5849:53;5894:7;5885:6;5874:9;5870:22;5849:53;:::i;:::-;5839:63;;5794:118;5951:2;5977:53;6022:7;6013:6;6002:9;5998:22;5977:53;:::i;:::-;5967:63;;5922:118;6079:2;6105:53;6150:7;6141:6;6130:9;6126:22;6105:53;:::i;:::-;6095:63;;6050:118;6207:3;6234:53;6279:7;6270:6;6259:9;6255:22;6234:53;:::i;:::-;6224:63;;6178:119;6336:3;6363:53;6408:7;6399:6;6388:9;6384:22;6363:53;:::i;:::-;6353:63;;6307:119;5594:839;;;;;;;;:::o;6439:401::-;6504:6;6512;6561:2;6549:9;6540:7;6536:23;6532:32;6529:2;;;6577:1;6574;6567:12;6529:2;6620:1;6645:53;6690:7;6681:6;6670:9;6666:22;6645:53;:::i;:::-;6635:63;;6591:117;6747:2;6773:50;6815:7;6806:6;6795:9;6791:22;6773:50;:::i;:::-;6763:60;;6718:115;6519:321;;;;;:::o;6846:407::-;6914:6;6922;6971:2;6959:9;6950:7;6946:23;6942:32;6939:2;;;6987:1;6984;6977:12;6939:2;7030:1;7055:53;7100:7;7091:6;7080:9;7076:22;7055:53;:::i;:::-;7045:63;;7001:117;7157:2;7183:53;7228:7;7219:6;7208:9;7204:22;7183:53;:::i;:::-;7173:63;;7128:118;6929:324;;;;;:::o;7259:405::-;7343:6;7392:2;7380:9;7371:7;7367:23;7363:32;7360:2;;;7408:1;7405;7398:12;7360:2;7479:1;7468:9;7464:17;7451:31;7509:18;7501:6;7498:30;7495:2;;;7541:1;7538;7531:12;7495:2;7569:78;7639:7;7630:6;7619:9;7615:22;7569:78;:::i;:::-;7559:88;;7422:235;7350:314;;;;:::o;7670:260::-;7728:6;7777:2;7765:9;7756:7;7752:23;7748:32;7745:2;;;7793:1;7790;7783:12;7745:2;7836:1;7861:52;7905:7;7896:6;7885:9;7881:22;7861:52;:::i;:::-;7851:62;;7807:116;7735:195;;;;:::o;7936:282::-;8005:6;8054:2;8042:9;8033:7;8029:23;8025:32;8022:2;;;8070:1;8067;8060:12;8022:2;8113:1;8138:63;8193:7;8184:6;8173:9;8169:22;8138:63;:::i;:::-;8128:73;;8084:127;8012:206;;;;:::o;8224:342::-;8323:6;8372:2;8360:9;8351:7;8347:23;8343:32;8340:2;;;8388:1;8385;8378:12;8340:2;8431:1;8456:93;8541:7;8532:6;8521:9;8517:22;8456:93;:::i;:::-;8446:103;;8402:157;8330:236;;;;:::o;8572:286::-;8643:6;8692:2;8680:9;8671:7;8667:23;8663:32;8660:2;;;8708:1;8705;8698:12;8660:2;8751:1;8776:65;8833:7;8824:6;8813:9;8809:22;8776:65;:::i;:::-;8766:75;;8722:129;8650:208;;;;:::o;8864:375::-;8933:6;8982:2;8970:9;8961:7;8957:23;8953:32;8950:2;;;8998:1;8995;8988:12;8950:2;9069:1;9058:9;9054:17;9041:31;9099:18;9091:6;9088:30;9085:2;;;9131:1;9128;9121:12;9085:2;9159:63;9214:7;9205:6;9194:9;9190:22;9159:63;:::i;:::-;9149:73;;9012:220;8940:299;;;;:::o;9245:262::-;9304:6;9353:2;9341:9;9332:7;9328:23;9324:32;9321:2;;;9369:1;9366;9359:12;9321:2;9412:1;9437:53;9482:7;9473:6;9462:9;9458:22;9437:53;:::i;:::-;9427:63;;9383:117;9311:196;;;;:::o;9513:118::-;9600:24;9618:5;9600:24;:::i;:::-;9595:3;9588:37;9578:53;;:::o;9637:109::-;9718:21;9733:5;9718:21;:::i;:::-;9713:3;9706:34;9696:50;;:::o;9752:360::-;9838:3;9866:38;9898:5;9866:38;:::i;:::-;9920:70;9983:6;9978:3;9920:70;:::i;:::-;9913:77;;9999:52;10044:6;10039:3;10032:4;10025:5;10021:16;9999:52;:::i;:::-;10076:29;10098:6;10076:29;:::i;:::-;10071:3;10067:39;10060:46;;9842:270;;;;;:::o;10118:364::-;10206:3;10234:39;10267:5;10234:39;:::i;:::-;10289:71;10353:6;10348:3;10289:71;:::i;:::-;10282:78;;10369:52;10414:6;10409:3;10402:4;10395:5;10391:16;10369:52;:::i;:::-;10446:29;10468:6;10446:29;:::i;:::-;10441:3;10437:39;10430:46;;10210:272;;;;;:::o;10488:377::-;10594:3;10622:39;10655:5;10622:39;:::i;:::-;10677:89;10759:6;10754:3;10677:89;:::i;:::-;10670:96;;10775:52;10820:6;10815:3;10808:4;10801:5;10797:16;10775:52;:::i;:::-;10852:6;10847:3;10843:16;10836:23;;10598:267;;;;;:::o;10895:845::-;10998:3;11035:5;11029:12;11064:36;11090:9;11064:36;:::i;:::-;11116:89;11198:6;11193:3;11116:89;:::i;:::-;11109:96;;11236:1;11225:9;11221:17;11252:1;11247:137;;;;11398:1;11393:341;;;;11214:520;;11247:137;11331:4;11327:9;11316;11312:25;11307:3;11300:38;11367:6;11362:3;11358:16;11351:23;;11247:137;;11393:341;11460:38;11492:5;11460:38;:::i;:::-;11520:1;11534:154;11548:6;11545:1;11542:13;11534:154;;;11622:7;11616:14;11612:1;11607:3;11603:11;11596:35;11672:1;11663:7;11659:15;11648:26;;11570:4;11567:1;11563:12;11558:17;;11534:154;;;11717:6;11712:3;11708:16;11701:23;;11400:334;;11214:520;;11002:738;;;;;;:::o;11746:366::-;11888:3;11909:67;11973:2;11968:3;11909:67;:::i;:::-;11902:74;;11985:93;12074:3;11985:93;:::i;:::-;12103:2;12098:3;12094:12;12087:19;;11892:220;;;:::o;12118:366::-;12260:3;12281:67;12345:2;12340:3;12281:67;:::i;:::-;12274:74;;12357:93;12446:3;12357:93;:::i;:::-;12475:2;12470:3;12466:12;12459:19;;12264:220;;;:::o;12490:366::-;12632:3;12653:67;12717:2;12712:3;12653:67;:::i;:::-;12646:74;;12729:93;12818:3;12729:93;:::i;:::-;12847:2;12842:3;12838:12;12831:19;;12636:220;;;:::o;12862:366::-;13004:3;13025:67;13089:2;13084:3;13025:67;:::i;:::-;13018:74;;13101:93;13190:3;13101:93;:::i;:::-;13219:2;13214:3;13210:12;13203:19;;13008:220;;;:::o;13234:366::-;13376:3;13397:67;13461:2;13456:3;13397:67;:::i;:::-;13390:74;;13473:93;13562:3;13473:93;:::i;:::-;13591:2;13586:3;13582:12;13575:19;;13380:220;;;:::o;13606:366::-;13748:3;13769:67;13833:2;13828:3;13769:67;:::i;:::-;13762:74;;13845:93;13934:3;13845:93;:::i;:::-;13963:2;13958:3;13954:12;13947:19;;13752:220;;;:::o;13978:366::-;14120:3;14141:67;14205:2;14200:3;14141:67;:::i;:::-;14134:74;;14217:93;14306:3;14217:93;:::i;:::-;14335:2;14330:3;14326:12;14319:19;;14124:220;;;:::o;14350:366::-;14492:3;14513:67;14577:2;14572:3;14513:67;:::i;:::-;14506:74;;14589:93;14678:3;14589:93;:::i;:::-;14707:2;14702:3;14698:12;14691:19;;14496:220;;;:::o;14722:366::-;14864:3;14885:67;14949:2;14944:3;14885:67;:::i;:::-;14878:74;;14961:93;15050:3;14961:93;:::i;:::-;15079:2;15074:3;15070:12;15063:19;;14868:220;;;:::o;15094:366::-;15236:3;15257:67;15321:2;15316:3;15257:67;:::i;:::-;15250:74;;15333:93;15422:3;15333:93;:::i;:::-;15451:2;15446:3;15442:12;15435:19;;15240:220;;;:::o;15466:366::-;15608:3;15629:67;15693:2;15688:3;15629:67;:::i;:::-;15622:74;;15705:93;15794:3;15705:93;:::i;:::-;15823:2;15818:3;15814:12;15807:19;;15612:220;;;:::o;15838:366::-;15980:3;16001:67;16065:2;16060:3;16001:67;:::i;:::-;15994:74;;16077:93;16166:3;16077:93;:::i;:::-;16195:2;16190:3;16186:12;16179:19;;15984:220;;;:::o;16210:366::-;16352:3;16373:67;16437:2;16432:3;16373:67;:::i;:::-;16366:74;;16449:93;16538:3;16449:93;:::i;:::-;16567:2;16562:3;16558:12;16551:19;;16356:220;;;:::o;16582:366::-;16724:3;16745:67;16809:2;16804:3;16745:67;:::i;:::-;16738:74;;16821:93;16910:3;16821:93;:::i;:::-;16939:2;16934:3;16930:12;16923:19;;16728:220;;;:::o;16954:366::-;17096:3;17117:67;17181:2;17176:3;17117:67;:::i;:::-;17110:74;;17193:93;17282:3;17193:93;:::i;:::-;17311:2;17306:3;17302:12;17295:19;;17100:220;;;:::o;17326:366::-;17468:3;17489:67;17553:2;17548:3;17489:67;:::i;:::-;17482:74;;17565:93;17654:3;17565:93;:::i;:::-;17683:2;17678:3;17674:12;17667:19;;17472:220;;;:::o;17698:366::-;17840:3;17861:67;17925:2;17920:3;17861:67;:::i;:::-;17854:74;;17937:93;18026:3;17937:93;:::i;:::-;18055:2;18050:3;18046:12;18039:19;;17844:220;;;:::o;18070:366::-;18212:3;18233:67;18297:2;18292:3;18233:67;:::i;:::-;18226:74;;18309:93;18398:3;18309:93;:::i;:::-;18427:2;18422:3;18418:12;18411:19;;18216:220;;;:::o;18442:366::-;18584:3;18605:67;18669:2;18664:3;18605:67;:::i;:::-;18598:74;;18681:93;18770:3;18681:93;:::i;:::-;18799:2;18794:3;18790:12;18783:19;;18588:220;;;:::o;18814:366::-;18956:3;18977:67;19041:2;19036:3;18977:67;:::i;:::-;18970:74;;19053:93;19142:3;19053:93;:::i;:::-;19171:2;19166:3;19162:12;19155:19;;18960:220;;;:::o;19186:366::-;19328:3;19349:67;19413:2;19408:3;19349:67;:::i;:::-;19342:74;;19425:93;19514:3;19425:93;:::i;:::-;19543:2;19538:3;19534:12;19527:19;;19332:220;;;:::o;19558:366::-;19700:3;19721:67;19785:2;19780:3;19721:67;:::i;:::-;19714:74;;19797:93;19886:3;19797:93;:::i;:::-;19915:2;19910:3;19906:12;19899:19;;19704:220;;;:::o;19930:366::-;20072:3;20093:67;20157:2;20152:3;20093:67;:::i;:::-;20086:74;;20169:93;20258:3;20169:93;:::i;:::-;20287:2;20282:3;20278:12;20271:19;;20076:220;;;:::o;20302:366::-;20444:3;20465:67;20529:2;20524:3;20465:67;:::i;:::-;20458:74;;20541:93;20630:3;20541:93;:::i;:::-;20659:2;20654:3;20650:12;20643:19;;20448:220;;;:::o;20674:366::-;20816:3;20837:67;20901:2;20896:3;20837:67;:::i;:::-;20830:74;;20913:93;21002:3;20913:93;:::i;:::-;21031:2;21026:3;21022:12;21015:19;;20820:220;;;:::o;21046:366::-;21188:3;21209:67;21273:2;21268:3;21209:67;:::i;:::-;21202:74;;21285:93;21374:3;21285:93;:::i;:::-;21403:2;21398:3;21394:12;21387:19;;21192:220;;;:::o;21418:366::-;21560:3;21581:67;21645:2;21640:3;21581:67;:::i;:::-;21574:74;;21657:93;21746:3;21657:93;:::i;:::-;21775:2;21770:3;21766:12;21759:19;;21564:220;;;:::o;21790:398::-;21949:3;21970:83;22051:1;22046:3;21970:83;:::i;:::-;21963:90;;22062:93;22151:3;22062:93;:::i;:::-;22180:1;22175:3;22171:11;22164:18;;21953:235;;;:::o;22194:366::-;22336:3;22357:67;22421:2;22416:3;22357:67;:::i;:::-;22350:74;;22433:93;22522:3;22433:93;:::i;:::-;22551:2;22546:3;22542:12;22535:19;;22340:220;;;:::o;22566:366::-;22708:3;22729:67;22793:2;22788:3;22729:67;:::i;:::-;22722:74;;22805:93;22894:3;22805:93;:::i;:::-;22923:2;22918:3;22914:12;22907:19;;22712:220;;;:::o;22938:366::-;23080:3;23101:67;23165:2;23160:3;23101:67;:::i;:::-;23094:74;;23177:93;23266:3;23177:93;:::i;:::-;23295:2;23290:3;23286:12;23279:19;;23084:220;;;:::o;23310:366::-;23452:3;23473:67;23537:2;23532:3;23473:67;:::i;:::-;23466:74;;23549:93;23638:3;23549:93;:::i;:::-;23667:2;23662:3;23658:12;23651:19;;23456:220;;;:::o;23682:118::-;23769:24;23787:5;23769:24;:::i;:::-;23764:3;23757:37;23747:53;;:::o;23806:429::-;23983:3;24005:92;24093:3;24084:6;24005:92;:::i;:::-;23998:99;;24114:95;24205:3;24196:6;24114:95;:::i;:::-;24107:102;;24226:3;24219:10;;23987:248;;;;;:::o;24241:379::-;24425:3;24447:147;24590:3;24447:147;:::i;:::-;24440:154;;24611:3;24604:10;;24429:191;;;:::o;24626:222::-;24719:4;24757:2;24746:9;24742:18;24734:26;;24770:71;24838:1;24827:9;24823:17;24814:6;24770:71;:::i;:::-;24724:124;;;;:::o;24854:640::-;25049:4;25087:3;25076:9;25072:19;25064:27;;25101:71;25169:1;25158:9;25154:17;25145:6;25101:71;:::i;:::-;25182:72;25250:2;25239:9;25235:18;25226:6;25182:72;:::i;:::-;25264;25332:2;25321:9;25317:18;25308:6;25264:72;:::i;:::-;25383:9;25377:4;25373:20;25368:2;25357:9;25353:18;25346:48;25411:76;25482:4;25473:6;25411:76;:::i;:::-;25403:84;;25054:440;;;;;;;:::o;25500:210::-;25587:4;25625:2;25614:9;25610:18;25602:26;;25638:65;25700:1;25689:9;25685:17;25676:6;25638:65;:::i;:::-;25592:118;;;;:::o;25716:505::-;25869:4;25907:3;25896:9;25892:19;25884:27;;25921:65;25983:1;25972:9;25968:17;25959:6;25921:65;:::i;:::-;25996:66;26058:2;26047:9;26043:18;26034:6;25996:66;:::i;:::-;26072;26134:2;26123:9;26119:18;26110:6;26072:66;:::i;:::-;26148;26210:2;26199:9;26195:18;26186:6;26148:66;:::i;:::-;25874:347;;;;;;;:::o;26227:313::-;26340:4;26378:2;26367:9;26363:18;26355:26;;26427:9;26421:4;26417:20;26413:1;26402:9;26398:17;26391:47;26455:78;26528:4;26519:6;26455:78;:::i;:::-;26447:86;;26345:195;;;;:::o;26546:419::-;26712:4;26750:2;26739:9;26735:18;26727:26;;26799:9;26793:4;26789:20;26785:1;26774:9;26770:17;26763:47;26827:131;26953:4;26827:131;:::i;:::-;26819:139;;26717:248;;;:::o;26971:419::-;27137:4;27175:2;27164:9;27160:18;27152:26;;27224:9;27218:4;27214:20;27210:1;27199:9;27195:17;27188:47;27252:131;27378:4;27252:131;:::i;:::-;27244:139;;27142:248;;;:::o;27396:419::-;27562:4;27600:2;27589:9;27585:18;27577:26;;27649:9;27643:4;27639:20;27635:1;27624:9;27620:17;27613:47;27677:131;27803:4;27677:131;:::i;:::-;27669:139;;27567:248;;;:::o;27821:419::-;27987:4;28025:2;28014:9;28010:18;28002:26;;28074:9;28068:4;28064:20;28060:1;28049:9;28045:17;28038:47;28102:131;28228:4;28102:131;:::i;:::-;28094:139;;27992:248;;;:::o;28246:419::-;28412:4;28450:2;28439:9;28435:18;28427:26;;28499:9;28493:4;28489:20;28485:1;28474:9;28470:17;28463:47;28527:131;28653:4;28527:131;:::i;:::-;28519:139;;28417:248;;;:::o;28671:419::-;28837:4;28875:2;28864:9;28860:18;28852:26;;28924:9;28918:4;28914:20;28910:1;28899:9;28895:17;28888:47;28952:131;29078:4;28952:131;:::i;:::-;28944:139;;28842:248;;;:::o;29096:419::-;29262:4;29300:2;29289:9;29285:18;29277:26;;29349:9;29343:4;29339:20;29335:1;29324:9;29320:17;29313:47;29377:131;29503:4;29377:131;:::i;:::-;29369:139;;29267:248;;;:::o;29521:419::-;29687:4;29725:2;29714:9;29710:18;29702:26;;29774:9;29768:4;29764:20;29760:1;29749:9;29745:17;29738:47;29802:131;29928:4;29802:131;:::i;:::-;29794:139;;29692:248;;;:::o;29946:419::-;30112:4;30150:2;30139:9;30135:18;30127:26;;30199:9;30193:4;30189:20;30185:1;30174:9;30170:17;30163:47;30227:131;30353:4;30227:131;:::i;:::-;30219:139;;30117:248;;;:::o;30371:419::-;30537:4;30575:2;30564:9;30560:18;30552:26;;30624:9;30618:4;30614:20;30610:1;30599:9;30595:17;30588:47;30652:131;30778:4;30652:131;:::i;:::-;30644:139;;30542:248;;;:::o;30796:419::-;30962:4;31000:2;30989:9;30985:18;30977:26;;31049:9;31043:4;31039:20;31035:1;31024:9;31020:17;31013:47;31077:131;31203:4;31077:131;:::i;:::-;31069:139;;30967:248;;;:::o;31221:419::-;31387:4;31425:2;31414:9;31410:18;31402:26;;31474:9;31468:4;31464:20;31460:1;31449:9;31445:17;31438:47;31502:131;31628:4;31502:131;:::i;:::-;31494:139;;31392:248;;;:::o;31646:419::-;31812:4;31850:2;31839:9;31835:18;31827:26;;31899:9;31893:4;31889:20;31885:1;31874:9;31870:17;31863:47;31927:131;32053:4;31927:131;:::i;:::-;31919:139;;31817:248;;;:::o;32071:419::-;32237:4;32275:2;32264:9;32260:18;32252:26;;32324:9;32318:4;32314:20;32310:1;32299:9;32295:17;32288:47;32352:131;32478:4;32352:131;:::i;:::-;32344:139;;32242:248;;;:::o;32496:419::-;32662:4;32700:2;32689:9;32685:18;32677:26;;32749:9;32743:4;32739:20;32735:1;32724:9;32720:17;32713:47;32777:131;32903:4;32777:131;:::i;:::-;32769:139;;32667:248;;;:::o;32921:419::-;33087:4;33125:2;33114:9;33110:18;33102:26;;33174:9;33168:4;33164:20;33160:1;33149:9;33145:17;33138:47;33202:131;33328:4;33202:131;:::i;:::-;33194:139;;33092:248;;;:::o;33346:419::-;33512:4;33550:2;33539:9;33535:18;33527:26;;33599:9;33593:4;33589:20;33585:1;33574:9;33570:17;33563:47;33627:131;33753:4;33627:131;:::i;:::-;33619:139;;33517:248;;;:::o;33771:419::-;33937:4;33975:2;33964:9;33960:18;33952:26;;34024:9;34018:4;34014:20;34010:1;33999:9;33995:17;33988:47;34052:131;34178:4;34052:131;:::i;:::-;34044:139;;33942:248;;;:::o;34196:419::-;34362:4;34400:2;34389:9;34385:18;34377:26;;34449:9;34443:4;34439:20;34435:1;34424:9;34420:17;34413:47;34477:131;34603:4;34477:131;:::i;:::-;34469:139;;34367:248;;;:::o;34621:419::-;34787:4;34825:2;34814:9;34810:18;34802:26;;34874:9;34868:4;34864:20;34860:1;34849:9;34845:17;34838:47;34902:131;35028:4;34902:131;:::i;:::-;34894:139;;34792:248;;;:::o;35046:419::-;35212:4;35250:2;35239:9;35235:18;35227:26;;35299:9;35293:4;35289:20;35285:1;35274:9;35270:17;35263:47;35327:131;35453:4;35327:131;:::i;:::-;35319:139;;35217:248;;;:::o;35471:419::-;35637:4;35675:2;35664:9;35660:18;35652:26;;35724:9;35718:4;35714:20;35710:1;35699:9;35695:17;35688:47;35752:131;35878:4;35752:131;:::i;:::-;35744:139;;35642:248;;;:::o;35896:419::-;36062:4;36100:2;36089:9;36085:18;36077:26;;36149:9;36143:4;36139:20;36135:1;36124:9;36120:17;36113:47;36177:131;36303:4;36177:131;:::i;:::-;36169:139;;36067:248;;;:::o;36321:419::-;36487:4;36525:2;36514:9;36510:18;36502:26;;36574:9;36568:4;36564:20;36560:1;36549:9;36545:17;36538:47;36602:131;36728:4;36602:131;:::i;:::-;36594:139;;36492:248;;;:::o;36746:419::-;36912:4;36950:2;36939:9;36935:18;36927:26;;36999:9;36993:4;36989:20;36985:1;36974:9;36970:17;36963:47;37027:131;37153:4;37027:131;:::i;:::-;37019:139;;36917:248;;;:::o;37171:419::-;37337:4;37375:2;37364:9;37360:18;37352:26;;37424:9;37418:4;37414:20;37410:1;37399:9;37395:17;37388:47;37452:131;37578:4;37452:131;:::i;:::-;37444:139;;37342:248;;;:::o;37596:419::-;37762:4;37800:2;37789:9;37785:18;37777:26;;37849:9;37843:4;37839:20;37835:1;37824:9;37820:17;37813:47;37877:131;38003:4;37877:131;:::i;:::-;37869:139;;37767:248;;;:::o;38021:419::-;38187:4;38225:2;38214:9;38210:18;38202:26;;38274:9;38268:4;38264:20;38260:1;38249:9;38245:17;38238:47;38302:131;38428:4;38302:131;:::i;:::-;38294:139;;38192:248;;;:::o;38446:419::-;38612:4;38650:2;38639:9;38635:18;38627:26;;38699:9;38693:4;38689:20;38685:1;38674:9;38670:17;38663:47;38727:131;38853:4;38727:131;:::i;:::-;38719:139;;38617:248;;;:::o;38871:419::-;39037:4;39075:2;39064:9;39060:18;39052:26;;39124:9;39118:4;39114:20;39110:1;39099:9;39095:17;39088:47;39152:131;39278:4;39152:131;:::i;:::-;39144:139;;39042:248;;;:::o;39296:419::-;39462:4;39500:2;39489:9;39485:18;39477:26;;39549:9;39543:4;39539:20;39535:1;39524:9;39520:17;39513:47;39577:131;39703:4;39577:131;:::i;:::-;39569:139;;39467:248;;;:::o;39721:222::-;39814:4;39852:2;39841:9;39837:18;39829:26;;39865:71;39933:1;39922:9;39918:17;39909:6;39865:71;:::i;:::-;39819:124;;;;:::o;39949:332::-;40070:4;40108:2;40097:9;40093:18;40085:26;;40121:71;40189:1;40178:9;40174:17;40165:6;40121:71;:::i;:::-;40202:72;40270:2;40259:9;40255:18;40246:6;40202:72;:::i;:::-;40075:206;;;;;:::o;40287:129::-;40321:6;40348:20;;:::i;:::-;40338:30;;40377:33;40405:4;40397:6;40377:33;:::i;:::-;40328:88;;;:::o;40422:75::-;40455:6;40488:2;40482:9;40472:19;;40462:35;:::o;40503:311::-;40580:4;40670:18;40662:6;40659:30;40656:2;;;40692:18;;:::i;:::-;40656:2;40742:4;40734:6;40730:17;40722:25;;40802:4;40796;40792:15;40784:23;;40585:229;;;:::o;40820:307::-;40881:4;40971:18;40963:6;40960:30;40957:2;;;40993:18;;:::i;:::-;40957:2;41031:29;41053:6;41031:29;:::i;:::-;41023:37;;41115:4;41109;41105:15;41097:23;;40886:241;;;:::o;41133:308::-;41195:4;41285:18;41277:6;41274:30;41271:2;;;41307:18;;:::i;:::-;41271:2;41345:29;41367:6;41345:29;:::i;:::-;41337:37;;41429:4;41423;41419:15;41411:23;;41200:241;;;:::o;41447:141::-;41496:4;41519:3;41511:11;;41542:3;41539:1;41532:14;41576:4;41573:1;41563:18;41555:26;;41501:87;;;:::o;41594:98::-;41645:6;41679:5;41673:12;41663:22;;41652:40;;;:::o;41698:99::-;41750:6;41784:5;41778:12;41768:22;;41757:40;;;:::o;41803:168::-;41886:11;41920:6;41915:3;41908:19;41960:4;41955:3;41951:14;41936:29;;41898:73;;;;:::o;41977:147::-;42078:11;42115:3;42100:18;;42090:34;;;;:::o;42130:169::-;42214:11;42248:6;42243:3;42236:19;42288:4;42283:3;42279:14;42264:29;;42226:73;;;;:::o;42305:148::-;42407:11;42444:3;42429:18;;42419:34;;;;:::o;42459:305::-;42499:3;42518:20;42536:1;42518:20;:::i;:::-;42513:25;;42552:20;42570:1;42552:20;:::i;:::-;42547:25;;42706:1;42638:66;42634:74;42631:1;42628:81;42625:2;;;42712:18;;:::i;:::-;42625:2;42756:1;42753;42749:9;42742:16;;42503:261;;;;:::o;42770:185::-;42810:1;42827:20;42845:1;42827:20;:::i;:::-;42822:25;;42861:20;42879:1;42861:20;:::i;:::-;42856:25;;42900:1;42890:2;;42905:18;;:::i;:::-;42890:2;42947:1;42944;42940:9;42935:14;;42812:143;;;;:::o;42961:348::-;43001:7;43024:20;43042:1;43024:20;:::i;:::-;43019:25;;43058:20;43076:1;43058:20;:::i;:::-;43053:25;;43246:1;43178:66;43174:74;43171:1;43168:81;43163:1;43156:9;43149:17;43145:105;43142:2;;;43253:18;;:::i;:::-;43142:2;43301:1;43298;43294:9;43283:20;;43009:300;;;;:::o;43315:191::-;43355:4;43375:20;43393:1;43375:20;:::i;:::-;43370:25;;43409:20;43427:1;43409:20;:::i;:::-;43404:25;;43448:1;43445;43442:8;43439:2;;;43453:18;;:::i;:::-;43439:2;43498:1;43495;43491:9;43483:17;;43360:146;;;;:::o;43512:96::-;43549:7;43578:24;43596:5;43578:24;:::i;:::-;43567:35;;43557:51;;;:::o;43614:90::-;43648:7;43691:5;43684:13;43677:21;43666:32;;43656:48;;;:::o;43710:149::-;43746:7;43786:66;43779:5;43775:78;43764:89;;43754:105;;;:::o;43865:125::-;43931:7;43960:24;43978:5;43960:24;:::i;:::-;43949:35;;43939:51;;;:::o;43996:126::-;44033:7;44073:42;44066:5;44062:54;44051:65;;44041:81;;;:::o;44128:77::-;44165:7;44194:5;44183:16;;44173:32;;;:::o;44211:154::-;44295:6;44290:3;44285;44272:30;44357:1;44348:6;44343:3;44339:16;44332:27;44262:103;;;:::o;44371:307::-;44439:1;44449:113;44463:6;44460:1;44457:13;44449:113;;;44548:1;44543:3;44539:11;44533:18;44529:1;44524:3;44520:11;44513:39;44485:2;44482:1;44478:10;44473:15;;44449:113;;;44580:6;44577:1;44574:13;44571:2;;;44660:1;44651:6;44646:3;44642:16;44635:27;44571:2;44420:258;;;;:::o;44684:320::-;44728:6;44765:1;44759:4;44755:12;44745:22;;44812:1;44806:4;44802:12;44833:18;44823:2;;44889:4;44881:6;44877:17;44867:27;;44823:2;44951;44943:6;44940:14;44920:18;44917:38;44914:2;;;44970:18;;:::i;:::-;44914:2;44735:269;;;;:::o;45010:281::-;45093:27;45115:4;45093:27;:::i;:::-;45085:6;45081:40;45223:6;45211:10;45208:22;45187:18;45175:10;45172:34;45169:62;45166:2;;;45234:18;;:::i;:::-;45166:2;45274:10;45270:2;45263:22;45053:238;;;:::o;45297:233::-;45336:3;45359:24;45377:5;45359:24;:::i;:::-;45350:33;;45405:66;45398:5;45395:77;45392:2;;;45475:18;;:::i;:::-;45392:2;45522:1;45515:5;45511:13;45504:20;;45340:190;;;:::o;45536:176::-;45568:1;45585:20;45603:1;45585:20;:::i;:::-;45580:25;;45619:20;45637:1;45619:20;:::i;:::-;45614:25;;45658:1;45648:2;;45663:18;;:::i;:::-;45648:2;45704:1;45701;45697:9;45692:14;;45570:142;;;;:::o;45718:180::-;45766:77;45763:1;45756:88;45863:4;45860:1;45853:15;45887:4;45884:1;45877:15;45904:180;45952:77;45949:1;45942:88;46049:4;46046:1;46039:15;46073:4;46070:1;46063:15;46090:180;46138:77;46135:1;46128:88;46235:4;46232:1;46225:15;46259:4;46256:1;46249:15;46276:180;46324:77;46321:1;46314:88;46421:4;46418:1;46411:15;46445:4;46442:1;46435:15;46462:102;46503:6;46554:2;46550:7;46545:2;46538:5;46534:14;46530:28;46520:38;;46510:54;;;:::o;46570:164::-;46710:16;46706:1;46698:6;46694:14;46687:40;46676:58;:::o;46740:170::-;46880:22;46876:1;46868:6;46864:14;46857:46;46846:64;:::o;46916:162::-;47056:14;47052:1;47044:6;47040:14;47033:38;47022:56;:::o;47084:181::-;47224:33;47220:1;47212:6;47208:14;47201:57;47190:75;:::o;47271:237::-;47411:34;47407:1;47399:6;47395:14;47388:58;47480:20;47475:2;47467:6;47463:15;47456:45;47377:131;:::o;47514:225::-;47654:34;47650:1;47642:6;47638:14;47631:58;47723:8;47718:2;47710:6;47706:15;47699:33;47620:119;:::o;47745:224::-;47885:34;47881:1;47873:6;47869:14;47862:58;47954:7;47949:2;47941:6;47937:15;47930:32;47851:118;:::o;47975:178::-;48115:30;48111:1;48103:6;48099:14;48092:54;48081:72;:::o;48159:182::-;48299:34;48295:1;48287:6;48283:14;48276:58;48265:76;:::o;48347:170::-;48487:22;48483:1;48475:6;48471:14;48464:46;48453:64;:::o;48523:172::-;48663:24;48659:1;48651:6;48647:14;48640:48;48629:66;:::o;48701:223::-;48841:34;48837:1;48829:6;48825:14;48818:58;48910:6;48905:2;48897:6;48893:15;48886:31;48807:117;:::o;48930:175::-;49070:27;49066:1;49058:6;49054:14;49047:51;49036:69;:::o;49111:171::-;49251:23;49247:1;49239:6;49235:14;49228:47;49217:65;:::o;49288:231::-;49428:34;49424:1;49416:6;49412:14;49405:58;49497:14;49492:2;49484:6;49480:15;49473:39;49394:125;:::o;49525:168::-;49665:20;49661:1;49653:6;49649:14;49642:44;49631:62;:::o;49699:166::-;49839:18;49835:1;49827:6;49823:14;49816:42;49805:60;:::o;49871:243::-;50011:34;50007:1;49999:6;49995:14;49988:58;50080:26;50075:2;50067:6;50063:15;50056:51;49977:137;:::o;50120:165::-;50260:17;50256:1;50248:6;50244:14;50237:41;50226:59;:::o;50291:229::-;50431:34;50427:1;50419:6;50415:14;50408:58;50500:12;50495:2;50487:6;50483:15;50476:37;50397:123;:::o;50526:228::-;50666:34;50662:1;50654:6;50650:14;50643:58;50735:11;50730:2;50722:6;50718:15;50711:36;50632:122;:::o;50760:166::-;50900:18;50896:1;50888:6;50884:14;50877:42;50866:60;:::o;50932:182::-;51072:34;51068:1;51060:6;51056:14;51049:58;51038:76;:::o;51120:231::-;51260:34;51256:1;51248:6;51244:14;51237:58;51329:14;51324:2;51316:6;51312:15;51305:39;51226:125;:::o;51357:182::-;51497:34;51493:1;51485:6;51481:14;51474:58;51463:76;:::o;51545:220::-;51685:34;51681:1;51673:6;51669:14;51662:58;51754:3;51749:2;51741:6;51737:15;51730:28;51651:114;:::o;51771:173::-;51911:25;51907:1;51899:6;51895:14;51888:49;51877:67;:::o;51950:114::-;52056:8;:::o;52070:236::-;52210:34;52206:1;52198:6;52194:14;52187:58;52279:19;52274:2;52266:6;52262:15;52255:44;52176:130;:::o;52312:168::-;52452:20;52448:1;52440:6;52436:14;52429:44;52418:62;:::o;52486:166::-;52626:18;52622:1;52614:6;52610:14;52603:42;52592:60;:::o;52658:181::-;52798:33;52794:1;52786:6;52782:14;52775:57;52764:75;:::o;52845:122::-;52918:24;52936:5;52918:24;:::i;:::-;52911:5;52908:35;52898:2;;52957:1;52954;52947:12;52898:2;52888:79;:::o;52973:116::-;53043:21;53058:5;53043:21;:::i;:::-;53036:5;53033:32;53023:2;;53079:1;53076;53069:12;53023:2;53013:76;:::o;53095:120::-;53167:23;53184:5;53167:23;:::i;:::-;53160:5;53157:34;53147:2;;53205:1;53202;53195:12;53147:2;53137:78;:::o;53221:180::-;53323:53;53370:5;53323:53;:::i;:::-;53316:5;53313:64;53303:2;;53391:1;53388;53381:12;53303:2;53293:108;:::o;53407:111::-;53492:1;53485:5;53482:12;53472:2;;53508:1;53505;53498:12;53472:2;53462:56;:::o;53524:122::-;53597:24;53615:5;53597:24;:::i;:::-;53590:5;53587:35;53577:2;;53636:1;53633;53626:12;53577:2;53567:79;:::o

Swarm Source

ipfs://2804ac38ada9f3fa3579a416eaf1064d5f4ba0c8e9393043f433c7867636c78c
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.