ETH Price: $3,954.70 (+2.20%)

Token

Ether Royale (ER)
 

Overview

Max Total Supply

4,791 ER

Holders

570

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
randydiaz.eth
Balance
3 ER
0x7553fe26599bb3bc9a23dc0591bc155df6488d1b
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:
EtherRoyale

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-07
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/interfaces/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721A.sol



// Creator: Chiru Labs



pragma solidity ^0.8.4;











error ApprovalCallerNotOwnerNorApproved();

error ApprovalQueryForNonexistentToken();

error ApproveToCaller();

error ApprovalToCurrentOwner();

error BalanceQueryForZeroAddress();

error MintedQueryForZeroAddress();

error BurnedQueryForZeroAddress();

error AuxQueryForZeroAddress();

error MintToZeroAddress();

error MintZeroQuantity();

error OwnerIndexOutOfBounds();

error OwnerQueryForNonexistentToken();

error TokenIndexOutOfBounds();

error TransferCallerNotOwnerNorApproved();

error TransferFromIncorrectOwner();

error TransferToNonERC721ReceiverImplementer();

error TransferToZeroAddress();

error URIQueryForNonexistentToken();



/**

 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including

 * the Metadata extension. Built to optimize for lower gas during batch mints.

 *

 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).

 *

 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.

 *

 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).

 */

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {

    using Address for address;

    using Strings for uint256;



    // Compiler will pack this into a single 256bit word.

    struct TokenOwnership {

        // The address of the owner.

        address addr;

        // Keeps track of the start time of ownership with minimal overhead for tokenomics.

        uint64 startTimestamp;

        // Whether the token has been burned.

        bool burned;

    }



    // Compiler will pack this into a single 256bit word.

    struct AddressData {

        // Realistically, 2**64-1 is more than enough.

        uint64 balance;

        // Keeps track of mint count with minimal overhead for tokenomics.

        uint64 numberMinted;

        // Keeps track of burn count with minimal overhead for tokenomics.

        uint64 numberBurned;

        // For miscellaneous variable(s) pertaining to the address

        // (e.g. number of whitelist mint slots used).

        // If there are multiple variables, please pack them into a uint64.

        uint64 aux;

    }



    // The tokenId of the next token to be minted.

    uint256 internal _currentIndex;



    // The number of tokens burned.

    uint256 internal _burnCounter;



    // Token name

    string private _name;



    // Token symbol

    string private _symbol;



    // Mapping from token ID to ownership details

    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.

    mapping(uint256 => TokenOwnership) internal _ownerships;



    // Mapping owner address to address data

    mapping(address => AddressData) private _addressData;



    // Mapping from token ID to approved address

    mapping(uint256 => address) private _tokenApprovals;



    // Mapping from owner to operator approvals

    mapping(address => mapping(address => bool)) private _operatorApprovals;



    constructor(string memory name_, string memory symbol_) {

        _name = name_;

        _symbol = symbol_;

        _currentIndex = _startTokenId();

    }



    /**

     * To change the starting tokenId, please override this function.

     */

    function _startTokenId() internal view virtual returns (uint256) {

        return 0;

    }



    /**

     * @dev See {IERC721Enumerable-totalSupply}.

     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.

     */

    function totalSupply() public view returns (uint256) {

        // Counter underflow is impossible as _burnCounter cannot be incremented

        // more than _currentIndex - _startTokenId() times

        unchecked {

            return _currentIndex - _burnCounter - _startTokenId();

        }

    }



    /**

     * Returns the total amount of tokens minted in the contract.

     */

    function _totalMinted() internal view returns (uint256) {

        // Counter underflow is impossible as _currentIndex does not decrement,

        // and it is initialized to _startTokenId()

        unchecked {

            return _currentIndex - _startTokenId();

        }

    }



    /**

     * @dev See {IERC165-supportsInterface}.

     */

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {

        return

            interfaceId == type(IERC721).interfaceId ||

            interfaceId == type(IERC721Metadata).interfaceId ||

            super.supportsInterface(interfaceId);

    }



    /**

     * @dev See {IERC721-balanceOf}.

     */

    function balanceOf(address owner) public view override returns (uint256) {

        if (owner == address(0)) revert BalanceQueryForZeroAddress();

        return uint256(_addressData[owner].balance);

    }



    /**

     * Returns the number of tokens minted by `owner`.

     */

    function _numberMinted(address owner) internal view returns (uint256) {

        if (owner == address(0)) revert MintedQueryForZeroAddress();

        return uint256(_addressData[owner].numberMinted);

    }



    /**

     * Returns the number of tokens burned by or on behalf of `owner`.

     */

    function _numberBurned(address owner) internal view returns (uint256) {

        if (owner == address(0)) revert BurnedQueryForZeroAddress();

        return uint256(_addressData[owner].numberBurned);

    }



    /**

     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).

     */

    function _getAux(address owner) internal view returns (uint64) {

        if (owner == address(0)) revert AuxQueryForZeroAddress();

        return _addressData[owner].aux;

    }



    /**

     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).

     * If there are multiple variables, please pack them into a uint64.

     */

    function _setAux(address owner, uint64 aux) internal {

        if (owner == address(0)) revert AuxQueryForZeroAddress();

        _addressData[owner].aux = aux;

    }



    /**

     * Gas spent here starts off proportional to the maximum mint batch size.

     * It gradually moves to O(1) as tokens get transferred around in the collection over time.

     */

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {

        uint256 curr = tokenId;



        unchecked {

            if (_startTokenId() <= curr && curr < _currentIndex) {

                TokenOwnership memory ownership = _ownerships[curr];

                if (!ownership.burned) {

                    if (ownership.addr != address(0)) {

                        return ownership;

                    }

                    // Invariant:

                    // There will always be an ownership that has an address and is not burned

                    // before an ownership that does not have an address and is not burned.

                    // Hence, curr will not underflow.

                    while (true) {

                        curr--;

                        ownership = _ownerships[curr];

                        if (ownership.addr != address(0)) {

                            return ownership;

                        }

                    }

                }

            }

        }

        revert OwnerQueryForNonexistentToken();

    }



    /**

     * @dev See {IERC721-ownerOf}.

     */

    function ownerOf(uint256 tokenId) public view override returns (address) {

        return ownershipOf(tokenId).addr;

    }



    /**

     * @dev See {IERC721Metadata-name}.

     */

    function name() public view virtual override returns (string memory) {

        return _name;

    }



    /**

     * @dev See {IERC721Metadata-symbol}.

     */

    function symbol() public view virtual override returns (string memory) {

        return _symbol;

    }



    /**

     * @dev See {IERC721Metadata-tokenURI}.

     */

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {

        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();



        string memory baseURI = _baseURI();

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

    }



    /**

     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each

     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty

     * by default, can be overriden in child contracts.

     */

    function _baseURI() internal view virtual returns (string memory) {

        return '';

    }



    /**

     * @dev See {IERC721-approve}.

     */

    function approve(address to, uint256 tokenId) public override {

        address owner = ERC721A.ownerOf(tokenId);

        if (to == owner) revert ApprovalToCurrentOwner();



        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {

            revert ApprovalCallerNotOwnerNorApproved();

        }



        _approve(to, tokenId, owner);

    }



    /**

     * @dev See {IERC721-getApproved}.

     */

    function getApproved(uint256 tokenId) public view override returns (address) {

        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();



        return _tokenApprovals[tokenId];

    }



    /**

     * @dev See {IERC721-setApprovalForAll}.

     */

    function setApprovalForAll(address operator, bool approved) public override {

        if (operator == _msgSender()) revert ApproveToCaller();



        _operatorApprovals[_msgSender()][operator] = approved;

        emit ApprovalForAll(_msgSender(), operator, approved);

    }



    /**

     * @dev See {IERC721-isApprovedForAll}.

     */

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {

        return _operatorApprovals[owner][operator];

    }



    /**

     * @dev See {IERC721-transferFrom}.

     */

    function transferFrom(

        address from,

        address to,

        uint256 tokenId

    ) public virtual override {

        _transfer(from, to, tokenId);

    }



    /**

     * @dev See {IERC721-safeTransferFrom}.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId

    ) public virtual override {

        safeTransferFrom(from, to, tokenId, '');

    }



    /**

     * @dev See {IERC721-safeTransferFrom}.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) public virtual override {

        _transfer(from, to, tokenId);

        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {

            revert TransferToNonERC721ReceiverImplementer();

        }

    }



    /**

     * @dev Returns whether `tokenId` exists.

     *

     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.

     *

     * Tokens start existing when they are minted (`_mint`),

     */

    function _exists(uint256 tokenId) internal view returns (bool) {

        return _startTokenId() <= tokenId && tokenId < _currentIndex &&

            !_ownerships[tokenId].burned;

    }



    function _safeMint(address to, uint256 quantity) internal {

        _safeMint(to, quantity, '');

    }



    /**

     * @dev Safely mints `quantity` tokens and transfers them to `to`.

     *

     * Requirements:

     *

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.

     * - `quantity` must be greater than 0.

     *

     * Emits a {Transfer} event.

     */

    function _safeMint(

        address to,

        uint256 quantity,

        bytes memory _data

    ) internal {

        _mint(to, quantity, _data, true);

    }



    /**

     * @dev Mints `quantity` tokens and transfers them to `to`.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `quantity` must be greater than 0.

     *

     * Emits a {Transfer} event.

     */

    function _mint(

        address to,

        uint256 quantity,

        bytes memory _data,

        bool safe

    ) internal {

        uint256 startTokenId = _currentIndex;

        if (to == address(0)) revert MintToZeroAddress();

        if (quantity == 0) revert MintZeroQuantity();



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



        // Overflows are incredibly unrealistic.

        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1

        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1

        unchecked {

            _addressData[to].balance += uint64(quantity);

            _addressData[to].numberMinted += uint64(quantity);



            _ownerships[startTokenId].addr = to;

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



            uint256 updatedIndex = startTokenId;

            uint256 end = updatedIndex + quantity;



            if (safe && to.isContract()) {

                do {

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

                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {

                        revert TransferToNonERC721ReceiverImplementer();

                    }

                } while (updatedIndex != end);

                // Reentrancy protection

                if (_currentIndex != startTokenId) revert();

            } else {

                do {

                    emit Transfer(address(0), to, updatedIndex++);

                } while (updatedIndex != end);

            }

            _currentIndex = updatedIndex;

        }

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

    }



    /**

     * @dev Transfers `tokenId` from `from` to `to`.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `tokenId` token must be owned by `from`.

     *

     * Emits a {Transfer} event.

     */

    function _transfer(

        address from,

        address to,

        uint256 tokenId

    ) private {

        TokenOwnership memory prevOwnership = ownershipOf(tokenId);



        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||

            isApprovedForAll(prevOwnership.addr, _msgSender()) ||

            getApproved(tokenId) == _msgSender());



        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

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

        if (to == address(0)) revert TransferToZeroAddress();



        _beforeTokenTransfers(from, to, tokenId, 1);



        // Clear approvals from the previous owner

        _approve(address(0), tokenId, prevOwnership.addr);



        // Underflow of the sender's balance is impossible because we check for

        // ownership above and the recipient's balance can't realistically overflow.

        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.

        unchecked {

            _addressData[from].balance -= 1;

            _addressData[to].balance += 1;



            _ownerships[tokenId].addr = to;

            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);



            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.

            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.

            uint256 nextTokenId = tokenId + 1;

            if (_ownerships[nextTokenId].addr == address(0)) {

                // This will suffice for checking _exists(nextTokenId),

                // as a burned slot cannot contain the zero address.

                if (nextTokenId < _currentIndex) {

                    _ownerships[nextTokenId].addr = prevOwnership.addr;

                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;

                }

            }

        }



        emit Transfer(from, to, tokenId);

        _afterTokenTransfers(from, to, tokenId, 1);

    }



    /**

     * @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 {

        TokenOwnership memory prevOwnership = ownershipOf(tokenId);



        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);



        // Clear approvals from the previous owner

        _approve(address(0), tokenId, prevOwnership.addr);



        // Underflow of the sender's balance is impossible because we check for

        // ownership above and the recipient's balance can't realistically overflow.

        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.

        unchecked {

            _addressData[prevOwnership.addr].balance -= 1;

            _addressData[prevOwnership.addr].numberBurned += 1;



            // Keep track of who burned the token, and the timestamp of burning.

            _ownerships[tokenId].addr = prevOwnership.addr;

            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            _ownerships[tokenId].burned = true;



            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.

            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.

            uint256 nextTokenId = tokenId + 1;

            if (_ownerships[nextTokenId].addr == address(0)) {

                // This will suffice for checking _exists(nextTokenId),

                // as a burned slot cannot contain the zero address.

                if (nextTokenId < _currentIndex) {

                    _ownerships[nextTokenId].addr = prevOwnership.addr;

                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;

                }

            }

        }



        emit Transfer(prevOwnership.addr, address(0), tokenId);

        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);



        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.

        unchecked {

            _burnCounter++;

        }

    }



    /**

     * @dev Approve `to` to operate on `tokenId`

     *

     * Emits a {Approval} event.

     */

    function _approve(

        address to,

        uint256 tokenId,

        address owner

    ) private {

        _tokenApprovals[tokenId] = to;

        emit Approval(owner, to, tokenId);

    }



    /**

     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.

     *

     * @param from address representing the previous owner of the given token ID

     * @param to target address that will receive the tokens

     * @param tokenId uint256 ID of the token to be transferred

     * @param _data bytes optional data to send along with the call

     * @return bool whether the call correctly returned the expected magic value

     */

    function _checkContractOnERC721Received(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) private returns (bool) {

        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {

            return retval == IERC721Receiver(to).onERC721Received.selector;

        } catch (bytes memory reason) {

            if (reason.length == 0) {

                revert TransferToNonERC721ReceiverImplementer();

            } else {

                assembly {

                    revert(add(32, reason), mload(reason))

                }

            }

        }

    }



    /**

     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.

     * And also called before burning one token.

     *

     * startTokenId - the first token id to be transferred

     * quantity - the amount to be transferred

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be

     * transferred to `to`.

     * - When `from` is zero, `tokenId` will be minted for `to`.

     * - When `to` is zero, `tokenId` will be burned by `from`.

     * - `from` and `to` are never both zero.

     */

    function _beforeTokenTransfers(

        address from,

        address to,

        uint256 startTokenId,

        uint256 quantity

    ) internal virtual {}



    /**

     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes

     * minting.

     * And also called after one token has been burned.

     *

     * startTokenId - the first token id to be transferred

     * quantity - the amount to be transferred

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been

     * transferred to `to`.

     * - When `from` is zero, `tokenId` has been minted for `to`.

     * - When `to` is zero, `tokenId` has been burned by `from`.

     * - `from` and `to` are never both zero.

     */

    function _afterTokenTransfers(

        address from,

        address to,

        uint256 startTokenId,

        uint256 quantity

    ) internal virtual {}

}
// File: contracts/EtherRoyale.sol

/*

ERC-721A Smart contract

@DonFlamingo - https://linktr.ee/donflamingo

*/




pragma solidity ^0.8.7;









contract EtherRoyale is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;



    string private baseURI;

    string private hideBaseURI;



    bool public paused = false;

    uint256 public maxSupply = 8888;

    uint256 public price = 0.069 ether;

    

    mapping (address => uint256) public saleMintCount;

    uint256 public saleWalletLimit = 10;

    bool public saleStarted = false;



    mapping (address => uint256) public presaleMintCount;

    uint256 public presaleWalletLimit = 3;

    bool public presaleStarted = false;

    bytes32 public presaleMerkleRoot = 0x23d67d503c7c3b7c6d70abc12fc1ef10b7eb7dff0eeddb16c65e441cb3d5e214;



    bool public revealed = false;



    event saleModeChanged();



    constructor(

        string memory _hideBaseURI,

        string memory _tokenUrl) ERC721A ("Ether Royale", "ER"){

        baseURI = _tokenUrl;

        hideBaseURI = _hideBaseURI;

    }



    modifier notPaused() {

        require(!paused, "Contract is paused");

        _;

    }

    

    modifier correctPayment(uint8 quantity) {

        require(quantity * price == msg.value);

        _;

    }



    modifier supplyLimit(uint8 quantity) {

        require(totalSupply() + quantity <= maxSupply, "No more tokens");

        _;

    }



    modifier presale(uint8 quantity) {

        require(presaleStarted, "Presale must be started");

        require(presaleMintCount[msg.sender] + quantity <= presaleWalletLimit, "Wallet limit reached");

        _;

    }



    modifier sale(uint8 quantity) {

        require(saleStarted, "Sale must be started");

        require(saleMintCount[msg.sender] + quantity <= saleWalletLimit, "wallet limit reached");

        _;

    }



    modifier isValidMerkleProof(bytes32[] calldata merkleProof) {

        require(

            MerkleProof.verify(

                merkleProof,

                presaleMerkleRoot,

                keccak256(abi.encodePacked(msg.sender))

            ),

            "Address does not exist in list"

        );

        _;

    }



    function saleMint(uint8 quantity) external payable notPaused nonReentrant supplyLimit(quantity) sale(quantity) {

        saleMintCount[msg.sender] += quantity;

        _safeMint(msg.sender, quantity);

    }



    function presaleMint(uint8 quantity, bytes32[] calldata merkleProof) external payable notPaused nonReentrant supplyLimit(quantity) isValidMerkleProof(merkleProof) presale(quantity)  {

        presaleMintCount[msg.sender] += quantity;

        _safeMint(msg.sender, quantity);

    }



    function ownerMint(uint8 quantity, address toAddress) external supplyLimit(quantity) onlyOwner {

        _safeMint(toAddress, quantity);

    } 



    function startPresale() external onlyOwner {

        presaleStarted = true;

        saleStarted = false;



        emit saleModeChanged();

    }



    function startSale() external onlyOwner {

        presaleStarted = false;

        saleStarted = true;



        emit saleModeChanged();

    }



    function resetSale() external onlyOwner {

        presaleStarted = false;

        saleStarted = false;



        emit saleModeChanged();

    }



    function setPause(bool pause) external onlyOwner {

        paused = pause;

    }



    function updatePrice(uint256 _price) external onlyOwner {

        price = _price;

    }



    function setPresaleLimit(uint8 _presaleLimit) external onlyOwner {

        presaleWalletLimit = _presaleLimit;

    }



    function setSaleLimit(uint8 _saleLimit) external onlyOwner {

        saleWalletLimit = _saleLimit;

    }



    function setPresaleListMerkleRoot(bytes32 merkleRoot) external onlyOwner {

        presaleMerkleRoot = merkleRoot;

    }



    function setBaseURI(string memory _baseURI) external onlyOwner {

        baseURI = _baseURI;

    }



    function setHideBaseURI(string memory _hideBaseURI) external onlyOwner {

        hideBaseURI = _hideBaseURI;

    }



    function getOwnerBaseURI() external onlyOwner view returns (string memory) {

        return baseURI;

    }



    function withdraw() public onlyOwner {

        uint256 donflamingov = address(this).balance * 15 / 100;

        uint256 catnipv = address(this).balance * 15 / 100;

        uint256 tragv = address(this).balance * 31 / 100;



        (bool donflamingohs, ) = payable(0xdCd6B7449167220724084bfD61f9B205c7dfa5a1).call{value: donflamingov}("");

        require(donflamingohs);



        (bool catniphs, ) = payable(0x026bf664D2C84E4Da15B18d66e41Ab8180f2bda3).call{value: catnipv}("");

        require(catniphs);



        (bool trags, ) = payable(0xE1840cc1BC1C80c576fAeD0DE39fC2c92E6440Ca).call{value: tragv}("");

        require(trags);



        uint256 balance = address(this).balance;

        payable(0xbF95B5444C3F8d671183ec87984d04b32C842d89).transfer(balance);

    }



    function reveal(bool _revealed) public onlyOwner  {

        revealed = _revealed;

    }



    function _startTokenId() internal view override virtual returns (uint256) {

        return 1;

    }



    function getBaseURI() external view returns (string memory) {

        if (!revealed) {

            return hideBaseURI;

        }



        return baseURI;

    }



    function leftLimit() external view returns (uint256) {

        require(presaleStarted || saleStarted, "Sales wasn't started yet");



        if (presaleStarted) {

            return presaleWalletLimit - presaleMintCount[msg.sender];

        }

        if (saleStarted) {

            return saleWalletLimit - saleMintCount[msg.sender];

        }



        return 0;

    }



    function walletOfOwner(address _owner)

        public

        view

        returns (uint256[] memory)

    {

        uint256 ownerTokenCount = balanceOf(_owner);

        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);

        uint256 currentTokenId = 1;

        uint256 ownedTokenIndex = 0;



        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {

            address currentTokenOwner = ownerOf(currentTokenId);



            if (currentTokenOwner == _owner) {

                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;

            }



            currentTokenId++;

        }



        return ownedTokenIds;

    }



    function tokenURI(uint256 tokenId)

        public

        view

        virtual

        override

        returns (string memory)

    {

        require(_exists(tokenId), "Nonexistent token");



        if (!revealed) {

            return hideBaseURI;

        }



        return

            string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json"));

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_hideBaseURI","type":"string"},{"internalType":"string","name":"_tokenUrl","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"saleModeChanged","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnerBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"leftLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"quantity","type":"uint8"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"quantity","type":"uint8"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"quantity","type":"uint8"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"saleMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hideBaseURI","type":"string"}],"name":"setHideBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_presaleLimit","type":"uint8"}],"name":"setPresaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setPresaleListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_saleLimit","type":"uint8"}],"name":"setSaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506122b8600d5566f5232269808000600e55600a6010556000601160006101000a81548160ff02191690831515021790555060036013556000601460006101000a81548160ff0219169083151502179055507f23d67d503c7c3b7c6d70abc12fc1ef10b7eb7dff0eeddb16c65e441cb3d5e21460001b6015556000601660006101000a81548160ff021916908315150217905550348015620000bf57600080fd5b50604051620056fc380380620056fc8339818101604052810190620000e5919062000402565b6040518060400160405280600c81526020017f457468657220526f79616c6500000000000000000000000000000000000000008152506040518060400160405280600281526020017f4552000000000000000000000000000000000000000000000000000000000000815250816002908051906020019062000169929190620002d4565b50806003908051906020019062000182929190620002d4565b5062000193620001fd60201b60201c565b6000819055505050620001bb620001af6200020660201b60201c565b6200020e60201b60201c565b600160098190555080600a9080519060200190620001db929190620002d4565b5081600b9080519060200190620001f4929190620002d4565b5050506200060b565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e2906200051c565b90600052602060002090601f01602090048101928262000306576000855562000352565b82601f106200032157805160ff191683800117855562000352565b8280016001018555821562000352579182015b828111156200035157825182559160200191906001019062000334565b5b50905062000361919062000365565b5090565b5b808211156200038057600081600090555060010162000366565b5090565b60006200039b6200039584620004b0565b62000487565b905082815260208101848484011115620003ba57620003b9620005eb565b5b620003c7848285620004e6565b509392505050565b600082601f830112620003e757620003e6620005e6565b5b8151620003f984826020860162000384565b91505092915050565b600080604083850312156200041c576200041b620005f5565b5b600083015167ffffffffffffffff8111156200043d576200043c620005f0565b5b6200044b85828601620003cf565b925050602083015167ffffffffffffffff8111156200046f576200046e620005f0565b5b6200047d85828601620003cf565b9150509250929050565b600062000493620004a6565b9050620004a1828262000552565b919050565b6000604051905090565b600067ffffffffffffffff821115620004ce57620004cd620005b7565b5b620004d982620005fa565b9050602081019050919050565b60005b8381101562000506578082015181840152602081019050620004e9565b8381111562000516576000848401525b50505050565b600060028204905060018216806200053557607f821691505b602082108114156200054c576200054b62000588565b5b50919050565b6200055d82620005fa565b810181811067ffffffffffffffff821117156200057f576200057e620005b7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6150e1806200061b6000396000f3fe6080604052600436106102885760003560e01c8063790b3b2b1161015a578063b66a0e5d116100c1578063c87b56dd1161007a578063c87b56dd1461095f578063d288823f1461099c578063d5abeb01146109c7578063e985e9c5146109f2578063f218c01c14610a2f578063f2fde38b14610a4b57610288565b8063b66a0e5d14610886578063b88d4fde1461089d578063bedb86fb146108c6578063bf793346146108ef578063c0f6baa41461090b578063c1e1d9541461094857610288565b8063940cd05b11610113578063940cd05b1461078c57806395d89b41146107b5578063a035b1fe146107e0578063a22cb4651461080b578063a643ed3014610834578063a74ea6ce1461085d57610288565b8063790b3b2b146106905780637b99fab5146106bb5780637e02d105146106e45780638a16766d1461070d5780638d6cc56d146107385780638da5cb5b1461076157610288565b80633ccfd60b116101fe5780635c975abb116101b75780635c975abb146105805780636352211e146105ab5780636ea451e4146105e857806370a0823114610611578063714c53981461064e578063715018a61461067957610288565b80633ccfd60b1461048457806342842e0e1461049b578063438b6300146104c4578063518302271461050157806355f804b31461052c5780635c474f9e1461055557610288565b8063094e407211610250578063094e407214610374578063095ea7b3146103b157806318160ddd146103da57806322212e2b1461040557806323b872dd14610430578063364e1efd1461045957610288565b806301ffc9a71461028d57806304549d6f146102ca57806304c98b2b146102f557806306fdde031461030c578063081812fc14610337575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190614003565b610a74565b6040516102c1919061469a565b60405180910390f35b3480156102d657600080fd5b506102df610b56565b6040516102ec919061469a565b60405180910390f35b34801561030157600080fd5b5061030a610b69565b005b34801561031857600080fd5b50610321610c49565b60405161032e91906146d0565b60405180910390f35b34801561034357600080fd5b5061035e600480360381019061035991906140a6565b610cdb565b60405161036b9190614611565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190613de6565b610d57565b6040516103a89190614872565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190613f69565b610d6f565b005b3480156103e657600080fd5b506103ef610e7a565b6040516103fc9190614872565b60405180910390f35b34801561041157600080fd5b5061041a610e91565b60405161042791906146b5565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613e53565b610e97565b005b34801561046557600080fd5b5061046e610ea7565b60405161047b9190614872565b60405180910390f35b34801561049057600080fd5b50610499610fe9565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613e53565b6112c3565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613de6565b6112e3565b6040516104f89190614678565b60405180910390f35b34801561050d57600080fd5b506105166113ee565b604051610523919061469a565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e919061405d565b611401565b005b34801561056157600080fd5b5061056a611497565b604051610577919061469a565b60405180910390f35b34801561058c57600080fd5b506105956114aa565b6040516105a2919061469a565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906140a6565b6114bd565b6040516105df9190614611565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a91906140d3565b6114d3565b005b34801561061d57600080fd5b5061063860048036038101906106339190613de6565b61155c565b6040516106459190614872565b60405180910390f35b34801561065a57600080fd5b5061066361162c565b60405161067091906146d0565b60405180910390f35b34801561068557600080fd5b5061068e611765565b005b34801561069c57600080fd5b506106a56117ed565b6040516106b29190614872565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190614100565b6117f3565b005b3480156106f057600080fd5b5061070b6004803603810190610706919061405d565b6118dc565b005b34801561071957600080fd5b50610722611972565b60405161072f9190614872565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a91906140a6565b611978565b005b34801561076d57600080fd5b506107766119fe565b6040516107839190614611565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190613fa9565b611a28565b005b3480156107c157600080fd5b506107ca611ac1565b6040516107d791906146d0565b60405180910390f35b3480156107ec57600080fd5b506107f5611b53565b6040516108029190614872565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190613f29565b611b59565b005b34801561084057600080fd5b5061085b60048036038101906108569190613fd6565b611cd1565b005b34801561086957600080fd5b50610884600480360381019061087f91906140d3565b611d57565b005b34801561089257600080fd5b5061089b611de0565b005b3480156108a957600080fd5b506108c460048036038101906108bf9190613ea6565b611ec0565b005b3480156108d257600080fd5b506108ed60048036038101906108e89190613fa9565b611f3c565b005b610909600480360381019061090491906140d3565b611fd5565b005b34801561091757600080fd5b50610932600480360381019061092d9190613de6565b612223565b60405161093f9190614872565b60405180910390f35b34801561095457600080fd5b5061095d61223b565b005b34801561096b57600080fd5b50610986600480360381019061098191906140a6565b61231b565b60405161099391906146d0565b60405180910390f35b3480156109a857600080fd5b506109b161243e565b6040516109be91906146d0565b60405180910390f35b3480156109d357600080fd5b506109dc61254c565b6040516109e99190614872565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a149190613e13565b612552565b604051610a26919061469a565b60405180910390f35b610a496004803603810190610a449190614140565b6125e6565b005b348015610a5757600080fd5b50610a726004803603810190610a6d9190613de6565b6128ed565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4f5750610b4e826129e5565b5b9050919050565b601460009054906101000a900460ff1681565b610b71612a4f565b73ffffffffffffffffffffffffffffffffffffffff16610b8f6119fe565b73ffffffffffffffffffffffffffffffffffffffff1614610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc906147d2565b60405180910390fd5b6001601460006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b606060028054610c5890614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8490614b92565b8015610cd15780601f10610ca657610100808354040283529160200191610cd1565b820191906000526020600020905b815481529060010190602001808311610cb457829003601f168201915b5050505050905090565b6000610ce682612a57565b610d1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60126020528060005260406000206000915090505481565b6000610d7a826114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610de2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e01612a4f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e335750610e3181610e2c612a4f565b612552565b155b15610e6a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e75838383612aa5565b505050565b6000610e84612b57565b6001546000540303905090565b60155481565b610ea2838383612b60565b505050565b6000601460009054906101000a900460ff1680610ed05750601160009054906101000a900460ff165b610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690614772565b60405180910390fd5b601460009054906101000a900460ff1615610f7857601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601354610f719190614a91565b9050610fe6565b601160009054906101000a900460ff1615610fe157600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601054610fda9190614a91565b9050610fe6565b600090505b90565b610ff1612a4f565b73ffffffffffffffffffffffffffffffffffffffff1661100f6119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c906147d2565b60405180910390fd5b60006064600f476110769190614a37565b6110809190614a06565b905060006064600f476110939190614a37565b61109d9190614a06565b905060006064601f476110b09190614a37565b6110ba9190614a06565b9050600073dcd6b7449167220724084bfd61f9b205c7dfa5a173ffffffffffffffffffffffffffffffffffffffff16846040516110f6906145fc565b60006040518083038185875af1925050503d8060008114611133576040519150601f19603f3d011682016040523d82523d6000602084013e611138565b606091505b505090508061114657600080fd5b600073026bf664d2c84e4da15b18d66e41ab8180f2bda373ffffffffffffffffffffffffffffffffffffffff1684604051611180906145fc565b60006040518083038185875af1925050503d80600081146111bd576040519150601f19603f3d011682016040523d82523d6000602084013e6111c2565b606091505b50509050806111d057600080fd5b600073e1840cc1bc1c80c576faed0de39fc2c92e6440ca73ffffffffffffffffffffffffffffffffffffffff168460405161120a906145fc565b60006040518083038185875af1925050503d8060008114611247576040519150601f19603f3d011682016040523d82523d6000602084013e61124c565b606091505b505090508061125a57600080fd5b600047905073bf95b5444c3f8d671183ec87984d04b32c842d8973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112b9573d6000803e3d6000fd5b5050505050505050565b6112de83838360405180602001604052806000815250611ec0565b505050565b606060006112f08361155c565b905060008167ffffffffffffffff81111561130e5761130d614d4f565b5b60405190808252806020026020018201604052801561133c5781602001602082028036833780820191505090505b50905060006001905060005b83811080156113595750600d548211155b156113e2576000611369836114bd565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ce57828483815181106113b3576113b2614d20565b5b60200260200101818152505081806113ca90614bf5565b9250505b82806113d990614bf5565b93505050611348565b82945050505050919050565b601660009054906101000a900460ff1681565b611409612a4f565b73ffffffffffffffffffffffffffffffffffffffff166114276119fe565b73ffffffffffffffffffffffffffffffffffffffff161461147d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611474906147d2565b60405180910390fd5b80600a9080519060200190611493929190613b37565b5050565b601160009054906101000a900460ff1681565b600c60009054906101000a900460ff1681565b60006114c882613051565b600001519050919050565b6114db612a4f565b73ffffffffffffffffffffffffffffffffffffffff166114f96119fe565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611546906147d2565b60405180910390fd5b8060ff1660108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060601660009054906101000a900460ff166116d457600b805461164f90614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461167b90614b92565b80156116c85780601f1061169d576101008083540402835291602001916116c8565b820191906000526020600020905b8154815290600101906020018083116116ab57829003601f168201915b50505050509050611762565b600a80546116e190614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461170d90614b92565b801561175a5780601f1061172f5761010080835404028352916020019161175a565b820191906000526020600020905b81548152906001019060200180831161173d57829003601f168201915b505050505090505b90565b61176d612a4f565b73ffffffffffffffffffffffffffffffffffffffff1661178b6119fe565b73ffffffffffffffffffffffffffffffffffffffff16146117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d8906147d2565b60405180910390fd5b6117eb60006132e0565b565b60105481565b81600d548160ff16611803610e7a565b61180d91906149b0565b111561184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590614752565b60405180910390fd5b611856612a4f565b73ffffffffffffffffffffffffffffffffffffffff166118746119fe565b73ffffffffffffffffffffffffffffffffffffffff16146118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c1906147d2565b60405180910390fd5b6118d7828460ff166133a6565b505050565b6118e4612a4f565b73ffffffffffffffffffffffffffffffffffffffff166119026119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f906147d2565b60405180910390fd5b80600b908051906020019061196e929190613b37565b5050565b60135481565b611980612a4f565b73ffffffffffffffffffffffffffffffffffffffff1661199e6119fe565b73ffffffffffffffffffffffffffffffffffffffff16146119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb906147d2565b60405180910390fd5b80600e8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a30612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611a4e6119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9b906147d2565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b606060038054611ad090614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054611afc90614b92565b8015611b495780601f10611b1e57610100808354040283529160200191611b49565b820191906000526020600020905b815481529060010190602001808311611b2c57829003601f168201915b5050505050905090565b600e5481565b611b61612a4f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611bd3612a4f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c80612a4f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cc5919061469a565b60405180910390a35050565b611cd9612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611cf76119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d44906147d2565b60405180910390fd5b8060158190555050565b611d5f612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611d7d6119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca906147d2565b60405180910390fd5b8060ff1660138190555050565b611de8612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611e066119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e53906147d2565b60405180910390fd5b6000601460006101000a81548160ff0219169083151502179055506001601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b611ecb848484612b60565b611eea8373ffffffffffffffffffffffffffffffffffffffff166133c4565b8015611eff5750611efd848484846133e7565b155b15611f36576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611f44612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611f626119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf906147d2565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff1615612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90614832565b60405180910390fd5b6002600954141561206b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206290614852565b60405180910390fd5b600260098190555080600d548160ff16612083610e7a565b61208d91906149b0565b11156120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c590614752565b60405180910390fd5b81601160009054906101000a900460ff1661211e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211590614812565b60405180910390fd5b6010548160ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461216f91906149b0565b11156121b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a7906146f2565b60405180910390fd5b8260ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220291906149b0565b92505081905550612216338460ff166133a6565b5050600160098190555050565b600f6020528060005260406000206000915090505481565b612243612a4f565b73ffffffffffffffffffffffffffffffffffffffff166122616119fe565b73ffffffffffffffffffffffffffffffffffffffff16146122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae906147d2565b60405180910390fd5b6000601460006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b606061232682612a57565b612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c906147b2565b60405180910390fd5b601660009054906101000a900460ff1661240b57600b805461238690614b92565b80601f01602080910402602001604051908101604052809291908181526020018280546123b290614b92565b80156123ff5780601f106123d4576101008083540402835291602001916123ff565b820191906000526020600020905b8154815290600101906020018083116123e257829003601f168201915b50505050509050612439565b600a61241683613547565b6040516020016124279291906145c2565b60405160208183030381529060405290505b919050565b6060612448612a4f565b73ffffffffffffffffffffffffffffffffffffffff166124666119fe565b73ffffffffffffffffffffffffffffffffffffffff16146124bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b3906147d2565b60405180910390fd5b600a80546124c990614b92565b80601f01602080910402602001604051908101604052809291908181526020018280546124f590614b92565b80156125425780601f1061251757610100808354040283529160200191612542565b820191906000526020600020905b81548152906001019060200180831161252557829003601f168201915b5050505050905090565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1615612636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262d90614832565b60405180910390fd5b6002600954141561267c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267390614852565b60405180910390fd5b600260098190555082600d548160ff16612694610e7a565b61269e91906149b0565b11156126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d690614752565b60405180910390fd5b8282612755828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506015543360405160200161273a91906145a7565b604051602081830303815290604052805190602001206136a8565b612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b90614792565b60405180910390fd5b85601460009054906101000a900460ff166127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db906147f2565b60405180910390fd5b6013548160ff16601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461283591906149b0565b1115612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d90614732565b60405180910390fd5b8660ff16601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128c891906149b0565b925050819055506128dc338860ff166133a6565b505050506001600981905550505050565b6128f5612a4f565b73ffffffffffffffffffffffffffffffffffffffff166129136119fe565b73ffffffffffffffffffffffffffffffffffffffff1614612969576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612960906147d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d090614712565b60405180910390fd5b6129e2816132e0565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612a62612b57565b11158015612a71575060005482105b8015612a9e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612b6b82613051565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612b92612a4f565b73ffffffffffffffffffffffffffffffffffffffff161480612bc55750612bc48260000151612bbf612a4f565b612552565b5b80612c0a5750612bd3612a4f565b73ffffffffffffffffffffffffffffffffffffffff16612bf284610cdb565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612c43576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612cac576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d13576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2085858560016136bf565b612d306000848460000151612aa5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612fe157600054811015612fe05782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461304a85858560016136c5565b5050505050565b613059613bbd565b600082905080613067612b57565b11158015613076575060005481105b156132a9576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516132a757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461318b5780925050506132db565b5b6001156132a657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146132a15780925050506132db565b61318c565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6133c08282604051806020016040528060008152506136cb565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261340d612a4f565b8786866040518563ffffffff1660e01b815260040161342f949392919061462c565b602060405180830381600087803b15801561344957600080fd5b505af192505050801561347a57506040513d601f19601f820116820180604052508101906134779190614030565b60015b6134f4573d80600081146134aa576040519150601f19603f3d011682016040523d82523d6000602084013e6134af565b606091505b506000815114156134ec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561358f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136a3565b600082905060005b600082146135c15780806135aa90614bf5565b915050600a826135ba9190614a06565b9150613597565b60008167ffffffffffffffff8111156135dd576135dc614d4f565b5b6040519080825280601f01601f19166020018201604052801561360f5781602001600182028036833780820191505090505b5090505b6000851461369c576001826136289190614a91565b9150600a856136379190614c62565b603061364391906149b0565b60f81b81838151811061365957613658614d20565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136959190614a06565b9450613613565b8093505050505b919050565b6000826136b585846136dd565b1490509392505050565b50505050565b50505050565b6136d88383836001613752565b505050565b60008082905060005b845181101561374757600085828151811061370457613703614d20565b5b602002602001015190508083116137265761371f8382613b20565b9250613733565b6137308184613b20565b92505b50808061373f90614bf5565b9150506136e6565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156137bf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156137fa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61380760008683876136bf565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156139d157506139d08773ffffffffffffffffffffffffffffffffffffffff166133c4565b5b15613a97575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a4660008884806001019550886133e7565b613a7c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156139d7578260005414613a9257600080fd5b613b03565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613a98575b816000819055505050613b1960008683876136c5565b5050505050565b600082600052816020526040600020905092915050565b828054613b4390614b92565b90600052602060002090601f016020900481019282613b655760008555613bac565b82601f10613b7e57805160ff1916838001178555613bac565b82800160010185558215613bac579182015b82811115613bab578251825591602001919060010190613b90565b5b509050613bb99190613c00565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613c19576000816000905550600101613c01565b5090565b6000613c30613c2b846148b2565b61488d565b905082815260208101848484011115613c4c57613c4b614d8d565b5b613c57848285614b50565b509392505050565b6000613c72613c6d846148e3565b61488d565b905082815260208101848484011115613c8e57613c8d614d8d565b5b613c99848285614b50565b509392505050565b600081359050613cb081615021565b92915050565b60008083601f840112613ccc57613ccb614d83565b5b8235905067ffffffffffffffff811115613ce957613ce8614d7e565b5b602083019150836020820283011115613d0557613d04614d88565b5b9250929050565b600081359050613d1b81615038565b92915050565b600081359050613d308161504f565b92915050565b600081359050613d4581615066565b92915050565b600081519050613d5a81615066565b92915050565b600082601f830112613d7557613d74614d83565b5b8135613d85848260208601613c1d565b91505092915050565b600082601f830112613da357613da2614d83565b5b8135613db3848260208601613c5f565b91505092915050565b600081359050613dcb8161507d565b92915050565b600081359050613de081615094565b92915050565b600060208284031215613dfc57613dfb614d97565b5b6000613e0a84828501613ca1565b91505092915050565b60008060408385031215613e2a57613e29614d97565b5b6000613e3885828601613ca1565b9250506020613e4985828601613ca1565b9150509250929050565b600080600060608486031215613e6c57613e6b614d97565b5b6000613e7a86828701613ca1565b9350506020613e8b86828701613ca1565b9250506040613e9c86828701613dbc565b9150509250925092565b60008060008060808587031215613ec057613ebf614d97565b5b6000613ece87828801613ca1565b9450506020613edf87828801613ca1565b9350506040613ef087828801613dbc565b925050606085013567ffffffffffffffff811115613f1157613f10614d92565b5b613f1d87828801613d60565b91505092959194509250565b60008060408385031215613f4057613f3f614d97565b5b6000613f4e85828601613ca1565b9250506020613f5f85828601613d0c565b9150509250929050565b60008060408385031215613f8057613f7f614d97565b5b6000613f8e85828601613ca1565b9250506020613f9f85828601613dbc565b9150509250929050565b600060208284031215613fbf57613fbe614d97565b5b6000613fcd84828501613d0c565b91505092915050565b600060208284031215613fec57613feb614d97565b5b6000613ffa84828501613d21565b91505092915050565b60006020828403121561401957614018614d97565b5b600061402784828501613d36565b91505092915050565b60006020828403121561404657614045614d97565b5b600061405484828501613d4b565b91505092915050565b60006020828403121561407357614072614d97565b5b600082013567ffffffffffffffff81111561409157614090614d92565b5b61409d84828501613d8e565b91505092915050565b6000602082840312156140bc576140bb614d97565b5b60006140ca84828501613dbc565b91505092915050565b6000602082840312156140e9576140e8614d97565b5b60006140f784828501613dd1565b91505092915050565b6000806040838503121561411757614116614d97565b5b600061412585828601613dd1565b925050602061413685828601613ca1565b9150509250929050565b60008060006040848603121561415957614158614d97565b5b600061416786828701613dd1565b935050602084013567ffffffffffffffff81111561418857614187614d92565b5b61419486828701613cb6565b92509250509250925092565b60006141ac8383614589565b60208301905092915050565b6141c181614ac5565b82525050565b6141d86141d382614ac5565b614c3e565b82525050565b60006141e982614939565b6141f38185614967565b93506141fe83614914565b8060005b8381101561422f57815161421688826141a0565b97506142218361495a565b925050600181019050614202565b5085935050505092915050565b61424581614ad7565b82525050565b61425481614ae3565b82525050565b600061426582614944565b61426f8185614978565b935061427f818560208601614b5f565b61428881614d9c565b840191505092915050565b600061429e8261494f565b6142a88185614994565b93506142b8818560208601614b5f565b6142c181614d9c565b840191505092915050565b60006142d78261494f565b6142e181856149a5565b93506142f1818560208601614b5f565b80840191505092915050565b6000815461430a81614b92565b61431481866149a5565b9450600182166000811461432f576001811461434057614373565b60ff19831686528186019350614373565b61434985614924565b60005b8381101561436b5781548189015260018201915060208101905061434c565b838801955050505b50505092915050565b6000614389601483614994565b915061439482614dba565b602082019050919050565b60006143ac602683614994565b91506143b782614de3565b604082019050919050565b60006143cf601483614994565b91506143da82614e32565b602082019050919050565b60006143f2600e83614994565b91506143fd82614e5b565b602082019050919050565b6000614415601883614994565b915061442082614e84565b602082019050919050565b6000614438601e83614994565b915061444382614ead565b602082019050919050565b600061445b601183614994565b915061446682614ed6565b602082019050919050565b600061447e6005836149a5565b915061448982614eff565b600582019050919050565b60006144a1602083614994565b91506144ac82614f28565b602082019050919050565b60006144c4601783614994565b91506144cf82614f51565b602082019050919050565b60006144e7600083614989565b91506144f282614f7a565b600082019050919050565b600061450a601483614994565b915061451582614f7d565b602082019050919050565b600061452d601283614994565b915061453882614fa6565b602082019050919050565b6000614550601f83614994565b915061455b82614fcf565b602082019050919050565b60006145736001836149a5565b915061457e82614ff8565b600182019050919050565b61459281614b39565b82525050565b6145a181614b39565b82525050565b60006145b382846141c7565b60148201915081905092915050565b60006145ce82856142fd565b91506145d982614566565b91506145e582846142cc565b91506145f082614471565b91508190509392505050565b6000614607826144da565b9150819050919050565b600060208201905061462660008301846141b8565b92915050565b600060808201905061464160008301876141b8565b61464e60208301866141b8565b61465b6040830185614598565b818103606083015261466d818461425a565b905095945050505050565b6000602082019050818103600083015261469281846141de565b905092915050565b60006020820190506146af600083018461423c565b92915050565b60006020820190506146ca600083018461424b565b92915050565b600060208201905081810360008301526146ea8184614293565b905092915050565b6000602082019050818103600083015261470b8161437c565b9050919050565b6000602082019050818103600083015261472b8161439f565b9050919050565b6000602082019050818103600083015261474b816143c2565b9050919050565b6000602082019050818103600083015261476b816143e5565b9050919050565b6000602082019050818103600083015261478b81614408565b9050919050565b600060208201905081810360008301526147ab8161442b565b9050919050565b600060208201905081810360008301526147cb8161444e565b9050919050565b600060208201905081810360008301526147eb81614494565b9050919050565b6000602082019050818103600083015261480b816144b7565b9050919050565b6000602082019050818103600083015261482b816144fd565b9050919050565b6000602082019050818103600083015261484b81614520565b9050919050565b6000602082019050818103600083015261486b81614543565b9050919050565b60006020820190506148876000830184614598565b92915050565b60006148976148a8565b90506148a38282614bc4565b919050565b6000604051905090565b600067ffffffffffffffff8211156148cd576148cc614d4f565b5b6148d682614d9c565b9050602081019050919050565b600067ffffffffffffffff8211156148fe576148fd614d4f565b5b61490782614d9c565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149bb82614b39565b91506149c683614b39565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149fb576149fa614c93565b5b828201905092915050565b6000614a1182614b39565b9150614a1c83614b39565b925082614a2c57614a2b614cc2565b5b828204905092915050565b6000614a4282614b39565b9150614a4d83614b39565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a8657614a85614c93565b5b828202905092915050565b6000614a9c82614b39565b9150614aa783614b39565b925082821015614aba57614ab9614c93565b5b828203905092915050565b6000614ad082614b19565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614b7d578082015181840152602081019050614b62565b83811115614b8c576000848401525b50505050565b60006002820490506001821680614baa57607f821691505b60208210811415614bbe57614bbd614cf1565b5b50919050565b614bcd82614d9c565b810181811067ffffffffffffffff82111715614bec57614beb614d4f565b5b80604052505050565b6000614c0082614b39565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c3357614c32614c93565b5b600182019050919050565b6000614c4982614c50565b9050919050565b6000614c5b82614dad565b9050919050565b6000614c6d82614b39565b9150614c7883614b39565b925082614c8857614c87614cc2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f77616c6c6574206c696d69742072656163686564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206c696d69742072656163686564000000000000000000000000600082015250565b7f4e6f206d6f726520746f6b656e73000000000000000000000000000000000000600082015250565b7f53616c6573207761736e27742073746172746564207965740000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f50726573616c65206d7573742062652073746172746564000000000000000000600082015250565b50565b7f53616c65206d7573742062652073746172746564000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61502a81614ac5565b811461503557600080fd5b50565b61504181614ad7565b811461504c57600080fd5b50565b61505881614ae3565b811461506357600080fd5b50565b61506f81614aed565b811461507a57600080fd5b50565b61508681614b39565b811461509157600080fd5b50565b61509d81614b43565b81146150a857600080fd5b5056fea2646970667358221220815d9051f44b30a15c21d68ff876a05bbb2a831feb414984f1eb750107bf1b3564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d53393663535941393344655358565931583676376661595a3144695056616d6b6d564c4845445a61774a436500000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d614c31416e6b7a64786b4a62696f6d724875704265595a365569576f445a3143584a504d33757856466954730000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063790b3b2b1161015a578063b66a0e5d116100c1578063c87b56dd1161007a578063c87b56dd1461095f578063d288823f1461099c578063d5abeb01146109c7578063e985e9c5146109f2578063f218c01c14610a2f578063f2fde38b14610a4b57610288565b8063b66a0e5d14610886578063b88d4fde1461089d578063bedb86fb146108c6578063bf793346146108ef578063c0f6baa41461090b578063c1e1d9541461094857610288565b8063940cd05b11610113578063940cd05b1461078c57806395d89b41146107b5578063a035b1fe146107e0578063a22cb4651461080b578063a643ed3014610834578063a74ea6ce1461085d57610288565b8063790b3b2b146106905780637b99fab5146106bb5780637e02d105146106e45780638a16766d1461070d5780638d6cc56d146107385780638da5cb5b1461076157610288565b80633ccfd60b116101fe5780635c975abb116101b75780635c975abb146105805780636352211e146105ab5780636ea451e4146105e857806370a0823114610611578063714c53981461064e578063715018a61461067957610288565b80633ccfd60b1461048457806342842e0e1461049b578063438b6300146104c4578063518302271461050157806355f804b31461052c5780635c474f9e1461055557610288565b8063094e407211610250578063094e407214610374578063095ea7b3146103b157806318160ddd146103da57806322212e2b1461040557806323b872dd14610430578063364e1efd1461045957610288565b806301ffc9a71461028d57806304549d6f146102ca57806304c98b2b146102f557806306fdde031461030c578063081812fc14610337575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190614003565b610a74565b6040516102c1919061469a565b60405180910390f35b3480156102d657600080fd5b506102df610b56565b6040516102ec919061469a565b60405180910390f35b34801561030157600080fd5b5061030a610b69565b005b34801561031857600080fd5b50610321610c49565b60405161032e91906146d0565b60405180910390f35b34801561034357600080fd5b5061035e600480360381019061035991906140a6565b610cdb565b60405161036b9190614611565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190613de6565b610d57565b6040516103a89190614872565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190613f69565b610d6f565b005b3480156103e657600080fd5b506103ef610e7a565b6040516103fc9190614872565b60405180910390f35b34801561041157600080fd5b5061041a610e91565b60405161042791906146b5565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613e53565b610e97565b005b34801561046557600080fd5b5061046e610ea7565b60405161047b9190614872565b60405180910390f35b34801561049057600080fd5b50610499610fe9565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613e53565b6112c3565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613de6565b6112e3565b6040516104f89190614678565b60405180910390f35b34801561050d57600080fd5b506105166113ee565b604051610523919061469a565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e919061405d565b611401565b005b34801561056157600080fd5b5061056a611497565b604051610577919061469a565b60405180910390f35b34801561058c57600080fd5b506105956114aa565b6040516105a2919061469a565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906140a6565b6114bd565b6040516105df9190614611565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a91906140d3565b6114d3565b005b34801561061d57600080fd5b5061063860048036038101906106339190613de6565b61155c565b6040516106459190614872565b60405180910390f35b34801561065a57600080fd5b5061066361162c565b60405161067091906146d0565b60405180910390f35b34801561068557600080fd5b5061068e611765565b005b34801561069c57600080fd5b506106a56117ed565b6040516106b29190614872565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190614100565b6117f3565b005b3480156106f057600080fd5b5061070b6004803603810190610706919061405d565b6118dc565b005b34801561071957600080fd5b50610722611972565b60405161072f9190614872565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a91906140a6565b611978565b005b34801561076d57600080fd5b506107766119fe565b6040516107839190614611565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190613fa9565b611a28565b005b3480156107c157600080fd5b506107ca611ac1565b6040516107d791906146d0565b60405180910390f35b3480156107ec57600080fd5b506107f5611b53565b6040516108029190614872565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190613f29565b611b59565b005b34801561084057600080fd5b5061085b60048036038101906108569190613fd6565b611cd1565b005b34801561086957600080fd5b50610884600480360381019061087f91906140d3565b611d57565b005b34801561089257600080fd5b5061089b611de0565b005b3480156108a957600080fd5b506108c460048036038101906108bf9190613ea6565b611ec0565b005b3480156108d257600080fd5b506108ed60048036038101906108e89190613fa9565b611f3c565b005b610909600480360381019061090491906140d3565b611fd5565b005b34801561091757600080fd5b50610932600480360381019061092d9190613de6565b612223565b60405161093f9190614872565b60405180910390f35b34801561095457600080fd5b5061095d61223b565b005b34801561096b57600080fd5b50610986600480360381019061098191906140a6565b61231b565b60405161099391906146d0565b60405180910390f35b3480156109a857600080fd5b506109b161243e565b6040516109be91906146d0565b60405180910390f35b3480156109d357600080fd5b506109dc61254c565b6040516109e99190614872565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a149190613e13565b612552565b604051610a26919061469a565b60405180910390f35b610a496004803603810190610a449190614140565b6125e6565b005b348015610a5757600080fd5b50610a726004803603810190610a6d9190613de6565b6128ed565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4f5750610b4e826129e5565b5b9050919050565b601460009054906101000a900460ff1681565b610b71612a4f565b73ffffffffffffffffffffffffffffffffffffffff16610b8f6119fe565b73ffffffffffffffffffffffffffffffffffffffff1614610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc906147d2565b60405180910390fd5b6001601460006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b606060028054610c5890614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8490614b92565b8015610cd15780601f10610ca657610100808354040283529160200191610cd1565b820191906000526020600020905b815481529060010190602001808311610cb457829003601f168201915b5050505050905090565b6000610ce682612a57565b610d1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60126020528060005260406000206000915090505481565b6000610d7a826114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610de2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e01612a4f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e335750610e3181610e2c612a4f565b612552565b155b15610e6a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e75838383612aa5565b505050565b6000610e84612b57565b6001546000540303905090565b60155481565b610ea2838383612b60565b505050565b6000601460009054906101000a900460ff1680610ed05750601160009054906101000a900460ff165b610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690614772565b60405180910390fd5b601460009054906101000a900460ff1615610f7857601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601354610f719190614a91565b9050610fe6565b601160009054906101000a900460ff1615610fe157600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601054610fda9190614a91565b9050610fe6565b600090505b90565b610ff1612a4f565b73ffffffffffffffffffffffffffffffffffffffff1661100f6119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c906147d2565b60405180910390fd5b60006064600f476110769190614a37565b6110809190614a06565b905060006064600f476110939190614a37565b61109d9190614a06565b905060006064601f476110b09190614a37565b6110ba9190614a06565b9050600073dcd6b7449167220724084bfd61f9b205c7dfa5a173ffffffffffffffffffffffffffffffffffffffff16846040516110f6906145fc565b60006040518083038185875af1925050503d8060008114611133576040519150601f19603f3d011682016040523d82523d6000602084013e611138565b606091505b505090508061114657600080fd5b600073026bf664d2c84e4da15b18d66e41ab8180f2bda373ffffffffffffffffffffffffffffffffffffffff1684604051611180906145fc565b60006040518083038185875af1925050503d80600081146111bd576040519150601f19603f3d011682016040523d82523d6000602084013e6111c2565b606091505b50509050806111d057600080fd5b600073e1840cc1bc1c80c576faed0de39fc2c92e6440ca73ffffffffffffffffffffffffffffffffffffffff168460405161120a906145fc565b60006040518083038185875af1925050503d8060008114611247576040519150601f19603f3d011682016040523d82523d6000602084013e61124c565b606091505b505090508061125a57600080fd5b600047905073bf95b5444c3f8d671183ec87984d04b32c842d8973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112b9573d6000803e3d6000fd5b5050505050505050565b6112de83838360405180602001604052806000815250611ec0565b505050565b606060006112f08361155c565b905060008167ffffffffffffffff81111561130e5761130d614d4f565b5b60405190808252806020026020018201604052801561133c5781602001602082028036833780820191505090505b50905060006001905060005b83811080156113595750600d548211155b156113e2576000611369836114bd565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ce57828483815181106113b3576113b2614d20565b5b60200260200101818152505081806113ca90614bf5565b9250505b82806113d990614bf5565b93505050611348565b82945050505050919050565b601660009054906101000a900460ff1681565b611409612a4f565b73ffffffffffffffffffffffffffffffffffffffff166114276119fe565b73ffffffffffffffffffffffffffffffffffffffff161461147d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611474906147d2565b60405180910390fd5b80600a9080519060200190611493929190613b37565b5050565b601160009054906101000a900460ff1681565b600c60009054906101000a900460ff1681565b60006114c882613051565b600001519050919050565b6114db612a4f565b73ffffffffffffffffffffffffffffffffffffffff166114f96119fe565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611546906147d2565b60405180910390fd5b8060ff1660108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060601660009054906101000a900460ff166116d457600b805461164f90614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461167b90614b92565b80156116c85780601f1061169d576101008083540402835291602001916116c8565b820191906000526020600020905b8154815290600101906020018083116116ab57829003601f168201915b50505050509050611762565b600a80546116e190614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461170d90614b92565b801561175a5780601f1061172f5761010080835404028352916020019161175a565b820191906000526020600020905b81548152906001019060200180831161173d57829003601f168201915b505050505090505b90565b61176d612a4f565b73ffffffffffffffffffffffffffffffffffffffff1661178b6119fe565b73ffffffffffffffffffffffffffffffffffffffff16146117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d8906147d2565b60405180910390fd5b6117eb60006132e0565b565b60105481565b81600d548160ff16611803610e7a565b61180d91906149b0565b111561184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590614752565b60405180910390fd5b611856612a4f565b73ffffffffffffffffffffffffffffffffffffffff166118746119fe565b73ffffffffffffffffffffffffffffffffffffffff16146118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c1906147d2565b60405180910390fd5b6118d7828460ff166133a6565b505050565b6118e4612a4f565b73ffffffffffffffffffffffffffffffffffffffff166119026119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f906147d2565b60405180910390fd5b80600b908051906020019061196e929190613b37565b5050565b60135481565b611980612a4f565b73ffffffffffffffffffffffffffffffffffffffff1661199e6119fe565b73ffffffffffffffffffffffffffffffffffffffff16146119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb906147d2565b60405180910390fd5b80600e8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a30612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611a4e6119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9b906147d2565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b606060038054611ad090614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054611afc90614b92565b8015611b495780601f10611b1e57610100808354040283529160200191611b49565b820191906000526020600020905b815481529060010190602001808311611b2c57829003601f168201915b5050505050905090565b600e5481565b611b61612a4f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611bd3612a4f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c80612a4f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cc5919061469a565b60405180910390a35050565b611cd9612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611cf76119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d44906147d2565b60405180910390fd5b8060158190555050565b611d5f612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611d7d6119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca906147d2565b60405180910390fd5b8060ff1660138190555050565b611de8612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611e066119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e53906147d2565b60405180910390fd5b6000601460006101000a81548160ff0219169083151502179055506001601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b611ecb848484612b60565b611eea8373ffffffffffffffffffffffffffffffffffffffff166133c4565b8015611eff5750611efd848484846133e7565b155b15611f36576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611f44612a4f565b73ffffffffffffffffffffffffffffffffffffffff16611f626119fe565b73ffffffffffffffffffffffffffffffffffffffff1614611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf906147d2565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff1615612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90614832565b60405180910390fd5b6002600954141561206b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206290614852565b60405180910390fd5b600260098190555080600d548160ff16612083610e7a565b61208d91906149b0565b11156120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c590614752565b60405180910390fd5b81601160009054906101000a900460ff1661211e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211590614812565b60405180910390fd5b6010548160ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461216f91906149b0565b11156121b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a7906146f2565b60405180910390fd5b8260ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220291906149b0565b92505081905550612216338460ff166133a6565b5050600160098190555050565b600f6020528060005260406000206000915090505481565b612243612a4f565b73ffffffffffffffffffffffffffffffffffffffff166122616119fe565b73ffffffffffffffffffffffffffffffffffffffff16146122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae906147d2565b60405180910390fd5b6000601460006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b606061232682612a57565b612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c906147b2565b60405180910390fd5b601660009054906101000a900460ff1661240b57600b805461238690614b92565b80601f01602080910402602001604051908101604052809291908181526020018280546123b290614b92565b80156123ff5780601f106123d4576101008083540402835291602001916123ff565b820191906000526020600020905b8154815290600101906020018083116123e257829003601f168201915b50505050509050612439565b600a61241683613547565b6040516020016124279291906145c2565b60405160208183030381529060405290505b919050565b6060612448612a4f565b73ffffffffffffffffffffffffffffffffffffffff166124666119fe565b73ffffffffffffffffffffffffffffffffffffffff16146124bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b3906147d2565b60405180910390fd5b600a80546124c990614b92565b80601f01602080910402602001604051908101604052809291908181526020018280546124f590614b92565b80156125425780601f1061251757610100808354040283529160200191612542565b820191906000526020600020905b81548152906001019060200180831161252557829003601f168201915b5050505050905090565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1615612636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262d90614832565b60405180910390fd5b6002600954141561267c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267390614852565b60405180910390fd5b600260098190555082600d548160ff16612694610e7a565b61269e91906149b0565b11156126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d690614752565b60405180910390fd5b8282612755828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506015543360405160200161273a91906145a7565b604051602081830303815290604052805190602001206136a8565b612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b90614792565b60405180910390fd5b85601460009054906101000a900460ff166127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db906147f2565b60405180910390fd5b6013548160ff16601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461283591906149b0565b1115612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d90614732565b60405180910390fd5b8660ff16601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128c891906149b0565b925050819055506128dc338860ff166133a6565b505050506001600981905550505050565b6128f5612a4f565b73ffffffffffffffffffffffffffffffffffffffff166129136119fe565b73ffffffffffffffffffffffffffffffffffffffff1614612969576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612960906147d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d090614712565b60405180910390fd5b6129e2816132e0565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612a62612b57565b11158015612a71575060005482105b8015612a9e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612b6b82613051565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612b92612a4f565b73ffffffffffffffffffffffffffffffffffffffff161480612bc55750612bc48260000151612bbf612a4f565b612552565b5b80612c0a5750612bd3612a4f565b73ffffffffffffffffffffffffffffffffffffffff16612bf284610cdb565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612c43576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612cac576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d13576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2085858560016136bf565b612d306000848460000151612aa5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612fe157600054811015612fe05782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461304a85858560016136c5565b5050505050565b613059613bbd565b600082905080613067612b57565b11158015613076575060005481105b156132a9576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516132a757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461318b5780925050506132db565b5b6001156132a657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146132a15780925050506132db565b61318c565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6133c08282604051806020016040528060008152506136cb565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261340d612a4f565b8786866040518563ffffffff1660e01b815260040161342f949392919061462c565b602060405180830381600087803b15801561344957600080fd5b505af192505050801561347a57506040513d601f19601f820116820180604052508101906134779190614030565b60015b6134f4573d80600081146134aa576040519150601f19603f3d011682016040523d82523d6000602084013e6134af565b606091505b506000815114156134ec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561358f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136a3565b600082905060005b600082146135c15780806135aa90614bf5565b915050600a826135ba9190614a06565b9150613597565b60008167ffffffffffffffff8111156135dd576135dc614d4f565b5b6040519080825280601f01601f19166020018201604052801561360f5781602001600182028036833780820191505090505b5090505b6000851461369c576001826136289190614a91565b9150600a856136379190614c62565b603061364391906149b0565b60f81b81838151811061365957613658614d20565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136959190614a06565b9450613613565b8093505050505b919050565b6000826136b585846136dd565b1490509392505050565b50505050565b50505050565b6136d88383836001613752565b505050565b60008082905060005b845181101561374757600085828151811061370457613703614d20565b5b602002602001015190508083116137265761371f8382613b20565b9250613733565b6137308184613b20565b92505b50808061373f90614bf5565b9150506136e6565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156137bf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156137fa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61380760008683876136bf565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156139d157506139d08773ffffffffffffffffffffffffffffffffffffffff166133c4565b5b15613a97575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a4660008884806001019550886133e7565b613a7c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156139d7578260005414613a9257600080fd5b613b03565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613a98575b816000819055505050613b1960008683876136c5565b5050505050565b600082600052816020526040600020905092915050565b828054613b4390614b92565b90600052602060002090601f016020900481019282613b655760008555613bac565b82601f10613b7e57805160ff1916838001178555613bac565b82800160010185558215613bac579182015b82811115613bab578251825591602001919060010190613b90565b5b509050613bb99190613c00565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613c19576000816000905550600101613c01565b5090565b6000613c30613c2b846148b2565b61488d565b905082815260208101848484011115613c4c57613c4b614d8d565b5b613c57848285614b50565b509392505050565b6000613c72613c6d846148e3565b61488d565b905082815260208101848484011115613c8e57613c8d614d8d565b5b613c99848285614b50565b509392505050565b600081359050613cb081615021565b92915050565b60008083601f840112613ccc57613ccb614d83565b5b8235905067ffffffffffffffff811115613ce957613ce8614d7e565b5b602083019150836020820283011115613d0557613d04614d88565b5b9250929050565b600081359050613d1b81615038565b92915050565b600081359050613d308161504f565b92915050565b600081359050613d4581615066565b92915050565b600081519050613d5a81615066565b92915050565b600082601f830112613d7557613d74614d83565b5b8135613d85848260208601613c1d565b91505092915050565b600082601f830112613da357613da2614d83565b5b8135613db3848260208601613c5f565b91505092915050565b600081359050613dcb8161507d565b92915050565b600081359050613de081615094565b92915050565b600060208284031215613dfc57613dfb614d97565b5b6000613e0a84828501613ca1565b91505092915050565b60008060408385031215613e2a57613e29614d97565b5b6000613e3885828601613ca1565b9250506020613e4985828601613ca1565b9150509250929050565b600080600060608486031215613e6c57613e6b614d97565b5b6000613e7a86828701613ca1565b9350506020613e8b86828701613ca1565b9250506040613e9c86828701613dbc565b9150509250925092565b60008060008060808587031215613ec057613ebf614d97565b5b6000613ece87828801613ca1565b9450506020613edf87828801613ca1565b9350506040613ef087828801613dbc565b925050606085013567ffffffffffffffff811115613f1157613f10614d92565b5b613f1d87828801613d60565b91505092959194509250565b60008060408385031215613f4057613f3f614d97565b5b6000613f4e85828601613ca1565b9250506020613f5f85828601613d0c565b9150509250929050565b60008060408385031215613f8057613f7f614d97565b5b6000613f8e85828601613ca1565b9250506020613f9f85828601613dbc565b9150509250929050565b600060208284031215613fbf57613fbe614d97565b5b6000613fcd84828501613d0c565b91505092915050565b600060208284031215613fec57613feb614d97565b5b6000613ffa84828501613d21565b91505092915050565b60006020828403121561401957614018614d97565b5b600061402784828501613d36565b91505092915050565b60006020828403121561404657614045614d97565b5b600061405484828501613d4b565b91505092915050565b60006020828403121561407357614072614d97565b5b600082013567ffffffffffffffff81111561409157614090614d92565b5b61409d84828501613d8e565b91505092915050565b6000602082840312156140bc576140bb614d97565b5b60006140ca84828501613dbc565b91505092915050565b6000602082840312156140e9576140e8614d97565b5b60006140f784828501613dd1565b91505092915050565b6000806040838503121561411757614116614d97565b5b600061412585828601613dd1565b925050602061413685828601613ca1565b9150509250929050565b60008060006040848603121561415957614158614d97565b5b600061416786828701613dd1565b935050602084013567ffffffffffffffff81111561418857614187614d92565b5b61419486828701613cb6565b92509250509250925092565b60006141ac8383614589565b60208301905092915050565b6141c181614ac5565b82525050565b6141d86141d382614ac5565b614c3e565b82525050565b60006141e982614939565b6141f38185614967565b93506141fe83614914565b8060005b8381101561422f57815161421688826141a0565b97506142218361495a565b925050600181019050614202565b5085935050505092915050565b61424581614ad7565b82525050565b61425481614ae3565b82525050565b600061426582614944565b61426f8185614978565b935061427f818560208601614b5f565b61428881614d9c565b840191505092915050565b600061429e8261494f565b6142a88185614994565b93506142b8818560208601614b5f565b6142c181614d9c565b840191505092915050565b60006142d78261494f565b6142e181856149a5565b93506142f1818560208601614b5f565b80840191505092915050565b6000815461430a81614b92565b61431481866149a5565b9450600182166000811461432f576001811461434057614373565b60ff19831686528186019350614373565b61434985614924565b60005b8381101561436b5781548189015260018201915060208101905061434c565b838801955050505b50505092915050565b6000614389601483614994565b915061439482614dba565b602082019050919050565b60006143ac602683614994565b91506143b782614de3565b604082019050919050565b60006143cf601483614994565b91506143da82614e32565b602082019050919050565b60006143f2600e83614994565b91506143fd82614e5b565b602082019050919050565b6000614415601883614994565b915061442082614e84565b602082019050919050565b6000614438601e83614994565b915061444382614ead565b602082019050919050565b600061445b601183614994565b915061446682614ed6565b602082019050919050565b600061447e6005836149a5565b915061448982614eff565b600582019050919050565b60006144a1602083614994565b91506144ac82614f28565b602082019050919050565b60006144c4601783614994565b91506144cf82614f51565b602082019050919050565b60006144e7600083614989565b91506144f282614f7a565b600082019050919050565b600061450a601483614994565b915061451582614f7d565b602082019050919050565b600061452d601283614994565b915061453882614fa6565b602082019050919050565b6000614550601f83614994565b915061455b82614fcf565b602082019050919050565b60006145736001836149a5565b915061457e82614ff8565b600182019050919050565b61459281614b39565b82525050565b6145a181614b39565b82525050565b60006145b382846141c7565b60148201915081905092915050565b60006145ce82856142fd565b91506145d982614566565b91506145e582846142cc565b91506145f082614471565b91508190509392505050565b6000614607826144da565b9150819050919050565b600060208201905061462660008301846141b8565b92915050565b600060808201905061464160008301876141b8565b61464e60208301866141b8565b61465b6040830185614598565b818103606083015261466d818461425a565b905095945050505050565b6000602082019050818103600083015261469281846141de565b905092915050565b60006020820190506146af600083018461423c565b92915050565b60006020820190506146ca600083018461424b565b92915050565b600060208201905081810360008301526146ea8184614293565b905092915050565b6000602082019050818103600083015261470b8161437c565b9050919050565b6000602082019050818103600083015261472b8161439f565b9050919050565b6000602082019050818103600083015261474b816143c2565b9050919050565b6000602082019050818103600083015261476b816143e5565b9050919050565b6000602082019050818103600083015261478b81614408565b9050919050565b600060208201905081810360008301526147ab8161442b565b9050919050565b600060208201905081810360008301526147cb8161444e565b9050919050565b600060208201905081810360008301526147eb81614494565b9050919050565b6000602082019050818103600083015261480b816144b7565b9050919050565b6000602082019050818103600083015261482b816144fd565b9050919050565b6000602082019050818103600083015261484b81614520565b9050919050565b6000602082019050818103600083015261486b81614543565b9050919050565b60006020820190506148876000830184614598565b92915050565b60006148976148a8565b90506148a38282614bc4565b919050565b6000604051905090565b600067ffffffffffffffff8211156148cd576148cc614d4f565b5b6148d682614d9c565b9050602081019050919050565b600067ffffffffffffffff8211156148fe576148fd614d4f565b5b61490782614d9c565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149bb82614b39565b91506149c683614b39565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149fb576149fa614c93565b5b828201905092915050565b6000614a1182614b39565b9150614a1c83614b39565b925082614a2c57614a2b614cc2565b5b828204905092915050565b6000614a4282614b39565b9150614a4d83614b39565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a8657614a85614c93565b5b828202905092915050565b6000614a9c82614b39565b9150614aa783614b39565b925082821015614aba57614ab9614c93565b5b828203905092915050565b6000614ad082614b19565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614b7d578082015181840152602081019050614b62565b83811115614b8c576000848401525b50505050565b60006002820490506001821680614baa57607f821691505b60208210811415614bbe57614bbd614cf1565b5b50919050565b614bcd82614d9c565b810181811067ffffffffffffffff82111715614bec57614beb614d4f565b5b80604052505050565b6000614c0082614b39565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c3357614c32614c93565b5b600182019050919050565b6000614c4982614c50565b9050919050565b6000614c5b82614dad565b9050919050565b6000614c6d82614b39565b9150614c7883614b39565b925082614c8857614c87614cc2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f77616c6c6574206c696d69742072656163686564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206c696d69742072656163686564000000000000000000000000600082015250565b7f4e6f206d6f726520746f6b656e73000000000000000000000000000000000000600082015250565b7f53616c6573207761736e27742073746172746564207965740000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f50726573616c65206d7573742062652073746172746564000000000000000000600082015250565b50565b7f53616c65206d7573742062652073746172746564000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61502a81614ac5565b811461503557600080fd5b50565b61504181614ad7565b811461504c57600080fd5b50565b61505881614ae3565b811461506357600080fd5b50565b61506f81614aed565b811461507a57600080fd5b50565b61508681614b39565b811461509157600080fd5b50565b61509d81614b43565b81146150a857600080fd5b5056fea2646970667358221220815d9051f44b30a15c21d68ff876a05bbb2a831feb414984f1eb750107bf1b3564736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d53393663535941393344655358565931583676376661595a3144695056616d6b6d564c4845445a61774a436500000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d614c31416e6b7a64786b4a62696f6d724875704265595a365569576f445a3143584a504d33757856466954730000000000000000000000

-----Decoded View---------------
Arg [0] : _hideBaseURI (string): ipfs://QmS96cSYA93DeSXVY1X6v7faYZ1DiPVamkmVLHEDZawJCe
Arg [1] : _tokenUrl (string): ipfs://QmaL1AnkzdxkJbiomrHupBeYZ6UiWoDZ1CXJPM3uxVFiTs

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 697066733a2f2f516d5339366353594139334465535856593158367637666159
Arg [4] : 5a3144695056616d6b6d564c4845445a61774a43650000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [6] : 697066733a2f2f516d614c31416e6b7a64786b4a62696f6d724875704265595a
Arg [7] : 365569576f445a3143584a504d33757856466954730000000000000000000000


Deployed Bytecode Sourcemap

55285:7205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36692:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55839:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58185:158;;;;;;;;;;;;;:::i;:::-;;40255:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41852:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55732:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41387:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35897:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55882:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42761:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60895:400;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59659:813;;;;;;;;;;;;;:::i;:::-;;43024:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61307:761;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55996:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59287:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55688:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55460:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40050:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59027:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37081:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60706:177;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12906:103;;;;;;;;;;;;;:::i;:::-;;55644:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58024:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59403:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55793:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58788:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12255:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60484:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40438:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55535:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42146:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59149:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58893:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58355:155;;;;;;;;;;;;;:::i;:::-;;43302:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58690:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57496:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55586:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58522:156;;;;;;;;;;;;;:::i;:::-;;62080:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59535:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55495:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42516:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57723:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13164:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36692:315;36794:4;36850:25;36835:40;;;:11;:40;;;;:107;;;;36909:33;36894:48;;;:11;:48;;;;36835:107;:162;;;;36961:36;36985:11;36961:23;:36::i;:::-;36835:162;36813:184;;36692:315;;;:::o;55839:34::-;;;;;;;;;;;;;:::o;58185:158::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58258:4:::1;58241:14;;:21;;;;;;;;;;;;;;;;;;58289:5;58275:11;;:19;;;;;;;;;;;;;;;;;;58316:17;;;;;;;;;;58185:158::o:0;40255:104::-;40309:13;40344:5;40337:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40255:104;:::o;41852:212::-;41920:7;41947:16;41955:7;41947;:16::i;:::-;41942:64;;41972:34;;;;;;;;;;;;;;41942:64;42030:15;:24;42046:7;42030:24;;;;;;;;;;;;;;;;;;;;;42023:31;;41852:212;;;:::o;55732:52::-;;;;;;;;;;;;;;;;;:::o;41387:389::-;41462:13;41478:24;41494:7;41478:15;:24::i;:::-;41462:40;;41525:5;41519:11;;:2;:11;;;41515:48;;;41539:24;;;;;;;;;;;;;;41515:48;41600:5;41584:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;41610:37;41627:5;41634:12;:10;:12::i;:::-;41610:16;:37::i;:::-;41609:38;41584:63;41580:142;;;41673:35;;;;;;;;;;;;;;41580:142;41738:28;41747:2;41751:7;41760:5;41738:8;:28::i;:::-;41449:327;41387:389;;:::o;35897:315::-;35941:7;36174:15;:13;:15::i;:::-;36159:12;;36143:13;;:28;:46;36136:53;;35897:315;:::o;55882:101::-;;;;:::o;42761:182::-;42905:28;42915:4;42921:2;42925:7;42905:9;:28::i;:::-;42761:182;;;:::o;60895:400::-;60939:7;60969:14;;;;;;;;;;;:29;;;;60987:11;;;;;;;;;;;60969:29;60961:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61048:14;;;;;;;;;;;61044:107;;;61109:16;:28;61126:10;61109:28;;;;;;;;;;;;;;;;61088:18;;:49;;;;:::i;:::-;61081:56;;;;61044:107;61167:11;;;;;;;;;;;61163:98;;;61222:13;:25;61236:10;61222:25;;;;;;;;;;;;;;;;61204:15;;:43;;;;:::i;:::-;61197:50;;;;61163:98;61284:1;61277:8;;60895:400;;:::o;59659:813::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59709:20:::1;59761:3;59756:2;59732:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;59709:55;;59777:15;59824:3;59819:2;59795:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;59777:50;;59840:13;59885:3;59880:2;59856:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;59840:48;;59906:18;59938:42;59930:56;;59994:12;59930:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59905:106;;;60032:13;60024:22;;;::::0;::::1;;60064:13;60091:42;60083:56;;60147:7;60083:76;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60063:96;;;60180:8;60172:17;;;::::0;::::1;;60207:10;60231:42;60223:56;;60287:5;60223:74;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60206:91;;;60318:5;60310:14;;;::::0;::::1;;60341:15;60359:21;60341:39;;60401:42;60393:60;;:69;60454:7;60393:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59696:776;;;;;;;59659:813::o:0;43024:197::-;43172:39;43189:4;43195:2;43199:7;43172:39;;;;;;;;;;;;:16;:39::i;:::-;43024:197;;;:::o;61307:761::-;61400:16;61438:23;61464:17;61474:6;61464:9;:17::i;:::-;61438:43;;61494:30;61541:15;61527:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61494:63;;61570:22;61595:1;61570:26;;61609:23;61653:369;61678:15;61660;:33;:64;;;;;61715:9;;61697:14;:27;;61660:64;61653:369;;;61743:25;61771:23;61779:14;61771:7;:23::i;:::-;61743:51;;61840:6;61819:27;;:17;:27;;;61815:157;;;61902:14;61869:13;61883:15;61869:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;61937:17;;;;;:::i;:::-;;;;61815:157;61992:16;;;;;:::i;:::-;;;;61726:296;61653:369;;;62045:13;62038:20;;;;;;61307:761;;;:::o;55996:28::-;;;;;;;;;;;;;:::o;59287:104::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59373:8:::1;59363:7;:18;;;;;;;;;;;;:::i;:::-;;59287:104:::0;:::o;55688:31::-;;;;;;;;;;;;;:::o;55460:26::-;;;;;;;;;;;;;:::o;40050:128::-;40114:7;40143:20;40155:7;40143:11;:20::i;:::-;:25;;;40136:32;;40050:128;;;:::o;59027:110::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59117:10:::1;59099:28;;:15;:28;;;;59027:110:::0;:::o;37081:212::-;37145:7;37188:1;37171:19;;:5;:19;;;37167:60;;;37199:28;;;;;;;;;;;;;;37167:60;37255:12;:19;37268:5;37255:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37247:36;;37240:43;;37081:212;;;:::o;60706:177::-;60751:13;60784:8;;;;;;;;;;;60779:64;;60818:11;60811:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60779:64;60866:7;60859:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60706:177;;:::o;12906:103::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12971:30:::1;12998:1;12971:18;:30::i;:::-;12906:103::o:0;55644:35::-;;;;:::o;58024:148::-;58099:8;56609:9;;56597:8;56581:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;56573:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12486:12:::1;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58132:30:::2;58142:9;58153:8;58132:30;;:9;:30::i;:::-;58024:148:::0;;;:::o;59403:120::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59501:12:::1;59487:11;:26;;;;;;;;;;;;:::i;:::-;;59403:120:::0;:::o;55793:37::-;;;;:::o;58788:93::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58865:6:::1;58857:5;:14;;;;58788:93:::0;:::o;12255:87::-;12301:7;12328:6;;;;;;;;;;;12321:13;;12255:87;:::o;60484:93::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60558:9:::1;60547:8;;:20;;;;;;;;;;;;;;;;;;60484:93:::0;:::o;40438:108::-;40494:13;40529:7;40522:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40438:108;:::o;55535:34::-;;;;:::o;42146:289::-;42251:12;:10;:12::i;:::-;42239:24;;:8;:24;;;42235:54;;;42272:17;;;;;;;;;;;;;;42235:54;42351:8;42306:18;:32;42325:12;:10;:12::i;:::-;42306:32;;;;;;;;;;;;;;;:42;42339:8;42306:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;42406:8;42377:48;;42392:12;:10;:12::i;:::-;42377:48;;;42416:8;42377:48;;;;;;:::i;:::-;;;;;;;;42146:289;;:::o;59149:126::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59255:10:::1;59235:17;:30;;;;59149:126:::0;:::o;58893:122::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58992:13:::1;58971:34;;:18;:34;;;;58893:122:::0;:::o;58355:155::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58425:5:::1;58408:14;;:22;;;;;;;;;;;;;;;;;;58457:4;58443:11;;:18;;;;;;;;;;;;;;;;;;58483:17;;;;;;;;;;58355:155::o:0;43302:389::-;43481:28;43491:4;43497:2;43501:7;43481:9;:28::i;:::-;43526:15;:2;:13;;;:15::i;:::-;:76;;;;;43546:56;43577:4;43583:2;43587:7;43596:5;43546:30;:56::i;:::-;43545:57;43526:76;43522:160;;;43628:40;;;;;;;;;;;;;;43522:160;43302:389;;;;:::o;58690:86::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58761:5:::1;58752:6;;:14;;;;;;;;;;;;;;;;;;58690:86:::0;:::o;57496:215::-;56327:6;;;;;;;;;;;56326:7;56318:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1:::1;4799:7;;:19;;4791:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1;4932:7;:18;;;;57582:8:::2;56609:9;;56597:8;56581:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;56573:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57597:8:::3;56963:11;;;;;;;;;;;56955:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;57060:15;;57048:8;57020:36;;:13;:25;57034:10;57020:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:55;;57012:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;57649:8:::4;57620:37;;:13;:25;57634:10;57620:25;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;57670:31;57680:10;57692:8;57670:31;;:9;:31::i;:::-;56650:1:::3;4963::::2;4157::::1;5111:7;:22;;;;57496:215:::0;:::o;55586:49::-;;;;;;;;;;;;;;;;;:::o;58522:156::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58592:5:::1;58575:14;;:22;;;;;;;;;;;;;;;;;;58624:5;58610:11;;:19;;;;;;;;;;;;;;;;;;58651:17;;;;;;;;;;58522:156::o:0;62080:405::-;62208:13;62251:16;62259:7;62251;:16::i;:::-;62243:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;62311:8;;;;;;;;;;;62306:64;;62345:11;62338:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62306:64;62432:7;62446:18;:7;:16;:18::i;:::-;62415:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62386:89;;62080:405;;;;:::o;59535:112::-;59595:13;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59630:7:::1;59623:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59535:112:::0;:::o;55495:31::-;;;;:::o;42516:168::-;42613:4;42639:18;:25;42658:5;42639:25;;;;;;;;;;;;;;;:35;42665:8;42639:35;;;;;;;;;;;;;;;;;;;;;;;;;42632:42;;42516:168;;;;:::o;57723:289::-;56327:6;;;;;;;;;;;56326:7;56318:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1:::1;4799:7;;:19;;4791:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1;4932:7;:18;;;;57844:8:::2;56609:9;;56597:8;56581:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;56573:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57873:11:::3;;57233:165;57272:11;;57233:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57304:17;;57369:10;57352:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57342:39;;;;;;57233:18;:165::i;:::-;57209:251;;;;;;;;;;;;:::i;:::-;;;;;;;;;57894:8:::4;56727:14;;;;;;;;;;;56719:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56833:18;;56821:8;56790:39;;:16;:28;56807:10;56790:28;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:61;;56782:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;57950:8:::5;57918:40;;:16;:28;57935:10;57918:28;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;57971:31;57981:10;57993:8;57971:31;;:9;:31::i;:::-;57473:1:::4;56650::::3;;4963::::2;4157::::1;5111:7;:22;;;;57723:289:::0;;;:::o;13164:201::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13273:1:::1;13253:22;;:8;:22;;;;13245:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13329:28;13348:8;13329:18;:28::i;:::-;13164:201:::0;:::o;25039:157::-;25124:4;25163:25;25148:40;;;:11;:40;;;;25141:47;;25039:157;;;:::o;10979:98::-;11032:7;11059:10;11052:17;;10979:98;:::o;43964:193::-;44021:4;44066:7;44047:15;:13;:15::i;:::-;:26;;:53;;;;;44087:13;;44077:7;:23;44047:53;:100;;;;;44120:11;:20;44132:7;44120:20;;;;;;;;;;;:27;;;;;;;;;;;;44119:28;44047:100;44040:107;;43964:193;;;:::o;51965:210::-;52117:2;52090:15;:24;52106:7;52090:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52157:7;52153:2;52137:28;;52146:5;52137:28;;;;;;;;;;;;51965:210;;;:::o;60589:105::-;60654:7;60683:1;60676:8;;60589:105;:::o;47259:2202::-;47384:35;47422:20;47434:7;47422:11;:20::i;:::-;47384:58;;47459:22;47501:13;:18;;;47485:34;;:12;:10;:12::i;:::-;:34;;;:103;;;;47538:50;47555:13;:18;;;47575:12;:10;:12::i;:::-;47538:16;:50::i;:::-;47485:103;:158;;;;47631:12;:10;:12::i;:::-;47607:36;;:20;47619:7;47607:11;:20::i;:::-;:36;;;47485:158;47459:185;;47666:17;47661:66;;47692:35;;;;;;;;;;;;;;47661:66;47766:4;47744:26;;:13;:18;;;:26;;;47740:67;;47779:28;;;;;;;;;;;;;;47740:67;47838:1;47824:16;;:2;:16;;;47820:52;;;47849:23;;;;;;;;;;;;;;47820:52;47889:43;47911:4;47917:2;47921:7;47930:1;47889:21;:43::i;:::-;48003:49;48020:1;48024:7;48033:13;:18;;;48003:8;:49::i;:::-;48390:1;48360:12;:18;48373:4;48360:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48436:1;48408:12;:16;48421:2;48408:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48486:2;48458:11;:20;48470:7;48458:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;48550:15;48505:11;:20;48517:7;48505:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;48826:19;48858:1;48848:7;:11;48826:33;;48921:1;48880:43;;:11;:24;48892:11;48880:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;48876:459;;;49111:13;;49097:11;:27;49093:225;;;49183:13;:18;;;49151:11;:24;49163:11;49151:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;49268:13;:28;;;49226:11;:24;49238:11;49226:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;49093:225;48876:459;48333:1015;49388:7;49384:2;49369:27;;49378:4;49369:27;;;;;;;;;;;;49409:42;49430:4;49436:2;49440:7;49449:1;49409:20;:42::i;:::-;47371:2090;;47259:2202;;;:::o;38820:1158::-;38881:21;;:::i;:::-;38917:12;38932:7;38917:22;;39006:4;38987:15;:13;:15::i;:::-;:23;;:47;;;;;39021:13;;39014:4;:20;38987:47;38983:922;;;39057:31;39091:11;:17;39103:4;39091:17;;;;;;;;;;;39057:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39134:9;:16;;;39129:759;;39207:1;39181:28;;:9;:14;;;:28;;;39177:105;;39247:9;39240:16;;;;;;39177:105;39594:273;39601:4;39594:273;;;39636:6;;;;;;;;39683:11;:17;39695:4;39683:17;;;;;;;;;;;39671:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39759:1;39733:28;;:9;:14;;;:28;;;39729:113;;39803:9;39796:16;;;;;;39729:113;39594:273;;;39129:759;39036:869;38983:922;39937:31;;;;;;;;;;;;;;38820:1158;;;;:::o;13525:191::-;13599:16;13618:6;;;;;;;;;;;13599:25;;13644:8;13635:6;;:17;;;;;;;;;;;;;;;;;;13699:8;13668:40;;13689:8;13668:40;;;;;;;;;;;;13588:128;13525:191;:::o;44169:108::-;44240:27;44250:2;44254:8;44240:27;;;;;;;;;;;;:9;:27::i;:::-;44169:108;;:::o;14956:326::-;15016:4;15273:1;15251:7;:19;;;:23;15244:30;;14956:326;;;:::o;52689:701::-;52862:4;52901:2;52885:36;;;52922:12;:10;:12::i;:::-;52936:4;52942:7;52951:5;52885:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52881:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53142:1;53125:6;:13;:18;53121:247;;;53173:40;;;;;;;;;;;;;;53121:247;53322:6;53316:13;53307:6;53303:2;53299:15;53292:38;52881:500;53016:45;;;53006:55;;;:6;:55;;;;52999:62;;;52689:701;;;;;;:::o;8541:723::-;8597:13;8827:1;8818:5;:10;8814:53;;;8845:10;;;;;;;;;;;;;;;;;;;;;8814:53;8877:12;8892:5;8877:20;;8908:14;8933:78;8948:1;8940:4;:9;8933:78;;8966:8;;;;;:::i;:::-;;;;8997:2;8989:10;;;;;:::i;:::-;;;8933:78;;;9021:19;9053:6;9043:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9021:39;;9071:154;9087:1;9078:5;:10;9071:154;;9115:1;9105:11;;;;;:::i;:::-;;;9182:2;9174:5;:10;;;;:::i;:::-;9161:2;:24;;;;:::i;:::-;9148:39;;9131:6;9138;9131:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9211:2;9202:11;;;;;:::i;:::-;;;9071:154;;;9249:6;9235:21;;;;;8541:723;;;;:::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;1065:40;;923:190;;;;;:::o;54072:169::-;;;;;:::o;54936:168::-;;;;;:::o;44664:175::-;44797:32;44803:2;44807:8;44817:5;44824:4;44797:5;:32::i;:::-;44664:175;;;:::o;1475:675::-;1558:7;1578:20;1601:4;1578:27;;1621:9;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;1867:42;1882:12;1896;1867:14;:42::i;:::-;1852:57;;1720:382;;;2044:42;2059:12;2073;2044:14;:42::i;:::-;2029:57;;1720:382;1659:454;1654:3;;;;;:::i;:::-;;;;1616:497;;;;2130:12;2123:19;;;1475:675;;;;:::o;45122:1859::-;45273:20;45296:13;;45273:36;;45340:1;45326:16;;:2;:16;;;45322:48;;;45351:19;;;;;;;;;;;;;;45322:48;45399:1;45387:8;:13;45383:44;;;45409:18;;;;;;;;;;;;;;45383:44;45444:61;45474:1;45478:2;45482:12;45496:8;45444:21;:61::i;:::-;45829:8;45794:12;:16;45807:2;45794:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45895:8;45855:12;:16;45868:2;45855:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45958:2;45925:11;:25;45937:12;45925:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;46027:15;45977:11;:25;45989:12;45977:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;46064:20;46087:12;46064:35;;46116:11;46145:8;46130:12;:23;46116:37;;46178:4;:23;;;;;46186:15;:2;:13;;;:15::i;:::-;46178:23;46174:667;;;46224:324;46282:12;46278:2;46257:38;;46274:1;46257:38;;;;;;;;;;;;46325:69;46364:1;46368:2;46372:14;;;;;;46388:5;46325:30;:69::i;:::-;46320:178;;46432:40;;;;;;;;;;;;;;46320:178;46543:3;46527:12;:19;;46224:324;;46633:12;46616:13;;:29;46612:43;;46647:8;;;46612:43;46174:667;;;46700:124;46758:14;;;;;;46754:2;46733:40;;46750:1;46733:40;;;;;;;;;;;;46819:3;46803:12;:19;;46700:124;;46174:667;46873:12;46857:13;:28;;;;45767:1132;;46911:60;46940:1;46944:2;46948:12;46962:8;46911:20;:60::i;:::-;45260:1721;45122:1859;;;;:::o;2158:224::-;2226:13;2289:1;2283:4;2276:15;2318:1;2312:4;2305:15;2359:4;2353;2343:21;2334:30;;2158:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:135::-;3057:5;3095:6;3082:20;3073:29;;3111:31;3136:5;3111:31;:::i;:::-;3013:135;;;;:::o;3154:329::-;3213:6;3262:2;3250:9;3241:7;3237:23;3233:32;3230:119;;;3268:79;;:::i;:::-;3230:119;3388:1;3413:53;3458:7;3449:6;3438:9;3434:22;3413:53;:::i;:::-;3403:63;;3359:117;3154:329;;;;:::o;3489:474::-;3557:6;3565;3614:2;3602:9;3593:7;3589:23;3585:32;3582:119;;;3620:79;;:::i;:::-;3582:119;3740:1;3765:53;3810:7;3801:6;3790:9;3786:22;3765:53;:::i;:::-;3755:63;;3711:117;3867:2;3893:53;3938:7;3929:6;3918:9;3914:22;3893:53;:::i;:::-;3883:63;;3838:118;3489:474;;;;;:::o;3969:619::-;4046:6;4054;4062;4111:2;4099:9;4090:7;4086:23;4082:32;4079:119;;;4117:79;;:::i;:::-;4079:119;4237:1;4262:53;4307:7;4298:6;4287:9;4283:22;4262:53;:::i;:::-;4252:63;;4208:117;4364:2;4390:53;4435:7;4426:6;4415:9;4411:22;4390:53;:::i;:::-;4380:63;;4335:118;4492:2;4518:53;4563:7;4554:6;4543:9;4539:22;4518:53;:::i;:::-;4508:63;;4463:118;3969:619;;;;;:::o;4594:943::-;4689:6;4697;4705;4713;4762:3;4750:9;4741:7;4737:23;4733:33;4730:120;;;4769:79;;:::i;:::-;4730:120;4889:1;4914:53;4959:7;4950:6;4939:9;4935:22;4914:53;:::i;:::-;4904:63;;4860:117;5016:2;5042:53;5087:7;5078:6;5067:9;5063:22;5042:53;:::i;:::-;5032:63;;4987:118;5144:2;5170:53;5215:7;5206:6;5195:9;5191:22;5170:53;:::i;:::-;5160:63;;5115:118;5300:2;5289:9;5285:18;5272:32;5331:18;5323:6;5320:30;5317:117;;;5353:79;;:::i;:::-;5317:117;5458:62;5512:7;5503:6;5492:9;5488:22;5458:62;:::i;:::-;5448:72;;5243:287;4594:943;;;;;;;:::o;5543:468::-;5608:6;5616;5665:2;5653:9;5644:7;5640:23;5636:32;5633:119;;;5671:79;;:::i;:::-;5633:119;5791:1;5816:53;5861:7;5852:6;5841:9;5837:22;5816:53;:::i;:::-;5806:63;;5762:117;5918:2;5944:50;5986:7;5977:6;5966:9;5962:22;5944:50;:::i;:::-;5934:60;;5889:115;5543:468;;;;;:::o;6017:474::-;6085:6;6093;6142:2;6130:9;6121:7;6117:23;6113:32;6110:119;;;6148:79;;:::i;:::-;6110:119;6268:1;6293:53;6338:7;6329:6;6318:9;6314:22;6293:53;:::i;:::-;6283:63;;6239:117;6395:2;6421:53;6466:7;6457:6;6446:9;6442:22;6421:53;:::i;:::-;6411:63;;6366:118;6017:474;;;;;:::o;6497:323::-;6553:6;6602:2;6590:9;6581:7;6577:23;6573:32;6570:119;;;6608:79;;:::i;:::-;6570:119;6728:1;6753:50;6795:7;6786:6;6775:9;6771:22;6753:50;:::i;:::-;6743:60;;6699:114;6497:323;;;;:::o;6826:329::-;6885:6;6934:2;6922:9;6913:7;6909:23;6905:32;6902:119;;;6940:79;;:::i;:::-;6902:119;7060:1;7085:53;7130:7;7121:6;7110:9;7106:22;7085:53;:::i;:::-;7075:63;;7031:117;6826:329;;;;:::o;7161:327::-;7219:6;7268:2;7256:9;7247:7;7243:23;7239:32;7236:119;;;7274:79;;:::i;:::-;7236:119;7394:1;7419:52;7463:7;7454:6;7443:9;7439:22;7419:52;:::i;:::-;7409:62;;7365:116;7161:327;;;;:::o;7494:349::-;7563:6;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:63;7818:7;7809:6;7798:9;7794:22;7763:63;:::i;:::-;7753:73;;7709:127;7494:349;;;;:::o;7849:509::-;7918:6;7967:2;7955:9;7946:7;7942:23;7938:32;7935:119;;;7973:79;;:::i;:::-;7935:119;8121:1;8110:9;8106:17;8093:31;8151:18;8143:6;8140:30;8137:117;;;8173:79;;:::i;:::-;8137:117;8278:63;8333:7;8324:6;8313:9;8309:22;8278:63;:::i;:::-;8268:73;;8064:287;7849:509;;;;:::o;8364:329::-;8423:6;8472:2;8460:9;8451:7;8447:23;8443:32;8440:119;;;8478:79;;:::i;:::-;8440:119;8598:1;8623:53;8668:7;8659:6;8648:9;8644:22;8623:53;:::i;:::-;8613:63;;8569:117;8364:329;;;;:::o;8699:325::-;8756:6;8805:2;8793:9;8784:7;8780:23;8776:32;8773:119;;;8811:79;;:::i;:::-;8773:119;8931:1;8956:51;8999:7;8990:6;8979:9;8975:22;8956:51;:::i;:::-;8946:61;;8902:115;8699:325;;;;:::o;9030:470::-;9096:6;9104;9153:2;9141:9;9132:7;9128:23;9124:32;9121:119;;;9159:79;;:::i;:::-;9121:119;9279:1;9304:51;9347:7;9338:6;9327:9;9323:22;9304:51;:::i;:::-;9294:61;;9250:115;9404:2;9430:53;9475:7;9466:6;9455:9;9451:22;9430:53;:::i;:::-;9420:63;;9375:118;9030:470;;;;;:::o;9506:700::-;9599:6;9607;9615;9664:2;9652:9;9643:7;9639:23;9635:32;9632:119;;;9670:79;;:::i;:::-;9632:119;9790:1;9815:51;9858:7;9849:6;9838:9;9834:22;9815:51;:::i;:::-;9805:61;;9761:115;9943:2;9932:9;9928:18;9915:32;9974:18;9966:6;9963:30;9960:117;;;9996:79;;:::i;:::-;9960:117;10109:80;10181:7;10172:6;10161:9;10157:22;10109:80;:::i;:::-;10091:98;;;;9886:313;9506:700;;;;;:::o;10212:179::-;10281:10;10302:46;10344:3;10336:6;10302:46;:::i;:::-;10380:4;10375:3;10371:14;10357:28;;10212:179;;;;:::o;10397:118::-;10484:24;10502:5;10484:24;:::i;:::-;10479:3;10472:37;10397:118;;:::o;10521:157::-;10626:45;10646:24;10664:5;10646:24;:::i;:::-;10626:45;:::i;:::-;10621:3;10614:58;10521:157;;:::o;10714:732::-;10833:3;10862:54;10910:5;10862:54;:::i;:::-;10932:86;11011:6;11006:3;10932:86;:::i;:::-;10925:93;;11042:56;11092:5;11042:56;:::i;:::-;11121:7;11152:1;11137:284;11162:6;11159:1;11156:13;11137:284;;;11238:6;11232:13;11265:63;11324:3;11309:13;11265:63;:::i;:::-;11258:70;;11351:60;11404:6;11351:60;:::i;:::-;11341:70;;11197:224;11184:1;11181;11177:9;11172:14;;11137:284;;;11141:14;11437:3;11430:10;;10838:608;;;10714:732;;;;:::o;11452:109::-;11533:21;11548:5;11533:21;:::i;:::-;11528:3;11521:34;11452:109;;:::o;11567:118::-;11654:24;11672:5;11654:24;:::i;:::-;11649:3;11642:37;11567:118;;:::o;11691:360::-;11777:3;11805:38;11837:5;11805:38;:::i;:::-;11859:70;11922:6;11917:3;11859:70;:::i;:::-;11852:77;;11938:52;11983:6;11978:3;11971:4;11964:5;11960:16;11938:52;:::i;:::-;12015:29;12037:6;12015:29;:::i;:::-;12010:3;12006:39;11999:46;;11781:270;11691:360;;;;:::o;12057:364::-;12145:3;12173:39;12206:5;12173:39;:::i;:::-;12228:71;12292:6;12287:3;12228:71;:::i;:::-;12221:78;;12308:52;12353:6;12348:3;12341:4;12334:5;12330:16;12308:52;:::i;:::-;12385:29;12407:6;12385:29;:::i;:::-;12380:3;12376:39;12369:46;;12149:272;12057:364;;;;:::o;12427:377::-;12533:3;12561:39;12594:5;12561:39;:::i;:::-;12616:89;12698:6;12693:3;12616:89;:::i;:::-;12609:96;;12714:52;12759:6;12754:3;12747:4;12740:5;12736:16;12714:52;:::i;:::-;12791:6;12786:3;12782:16;12775:23;;12537:267;12427:377;;;;:::o;12834:845::-;12937:3;12974:5;12968:12;13003:36;13029:9;13003:36;:::i;:::-;13055:89;13137:6;13132:3;13055:89;:::i;:::-;13048:96;;13175:1;13164:9;13160:17;13191:1;13186:137;;;;13337:1;13332:341;;;;13153:520;;13186:137;13270:4;13266:9;13255;13251:25;13246:3;13239:38;13306:6;13301:3;13297:16;13290:23;;13186:137;;13332:341;13399:38;13431:5;13399:38;:::i;:::-;13459:1;13473:154;13487:6;13484:1;13481:13;13473:154;;;13561:7;13555:14;13551:1;13546:3;13542:11;13535:35;13611:1;13602:7;13598:15;13587:26;;13509:4;13506:1;13502:12;13497:17;;13473:154;;;13656:6;13651:3;13647:16;13640:23;;13339:334;;13153:520;;12941:738;;12834:845;;;;:::o;13685:366::-;13827:3;13848:67;13912:2;13907:3;13848:67;:::i;:::-;13841:74;;13924:93;14013:3;13924:93;:::i;:::-;14042:2;14037:3;14033:12;14026:19;;13685:366;;;:::o;14057:::-;14199:3;14220:67;14284:2;14279:3;14220:67;:::i;:::-;14213:74;;14296:93;14385:3;14296:93;:::i;:::-;14414:2;14409:3;14405:12;14398:19;;14057:366;;;:::o;14429:::-;14571:3;14592:67;14656:2;14651:3;14592:67;:::i;:::-;14585:74;;14668:93;14757:3;14668:93;:::i;:::-;14786:2;14781:3;14777:12;14770:19;;14429:366;;;:::o;14801:::-;14943:3;14964:67;15028:2;15023:3;14964:67;:::i;:::-;14957:74;;15040:93;15129:3;15040:93;:::i;:::-;15158:2;15153:3;15149:12;15142:19;;14801:366;;;:::o;15173:::-;15315:3;15336:67;15400:2;15395:3;15336:67;:::i;:::-;15329:74;;15412:93;15501:3;15412:93;:::i;:::-;15530:2;15525:3;15521:12;15514:19;;15173:366;;;:::o;15545:::-;15687:3;15708:67;15772:2;15767:3;15708:67;:::i;:::-;15701:74;;15784:93;15873:3;15784:93;:::i;:::-;15902:2;15897:3;15893:12;15886:19;;15545:366;;;:::o;15917:::-;16059:3;16080:67;16144:2;16139:3;16080:67;:::i;:::-;16073:74;;16156:93;16245:3;16156:93;:::i;:::-;16274:2;16269:3;16265:12;16258:19;;15917:366;;;:::o;16289:400::-;16449:3;16470:84;16552:1;16547:3;16470:84;:::i;:::-;16463:91;;16563:93;16652:3;16563:93;:::i;:::-;16681:1;16676:3;16672:11;16665:18;;16289:400;;;:::o;16695:366::-;16837:3;16858:67;16922:2;16917:3;16858:67;:::i;:::-;16851:74;;16934:93;17023:3;16934:93;:::i;:::-;17052:2;17047:3;17043:12;17036:19;;16695:366;;;:::o;17067:::-;17209:3;17230:67;17294:2;17289:3;17230:67;:::i;:::-;17223:74;;17306:93;17395:3;17306:93;:::i;:::-;17424:2;17419:3;17415:12;17408:19;;17067:366;;;:::o;17439:398::-;17598:3;17619:83;17700:1;17695:3;17619:83;:::i;:::-;17612:90;;17711:93;17800:3;17711:93;:::i;:::-;17829:1;17824:3;17820:11;17813:18;;17439:398;;;:::o;17843:366::-;17985:3;18006:67;18070:2;18065:3;18006:67;:::i;:::-;17999:74;;18082:93;18171:3;18082:93;:::i;:::-;18200:2;18195:3;18191:12;18184:19;;17843:366;;;:::o;18215:::-;18357:3;18378:67;18442:2;18437:3;18378:67;:::i;:::-;18371:74;;18454:93;18543:3;18454:93;:::i;:::-;18572:2;18567:3;18563:12;18556:19;;18215:366;;;:::o;18587:::-;18729:3;18750:67;18814:2;18809:3;18750:67;:::i;:::-;18743:74;;18826:93;18915:3;18826:93;:::i;:::-;18944:2;18939:3;18935:12;18928:19;;18587:366;;;:::o;18959:400::-;19119:3;19140:84;19222:1;19217:3;19140:84;:::i;:::-;19133:91;;19233:93;19322:3;19233:93;:::i;:::-;19351:1;19346:3;19342:11;19335:18;;18959:400;;;:::o;19365:108::-;19442:24;19460:5;19442:24;:::i;:::-;19437:3;19430:37;19365:108;;:::o;19479:118::-;19566:24;19584:5;19566:24;:::i;:::-;19561:3;19554:37;19479:118;;:::o;19603:256::-;19715:3;19730:75;19801:3;19792:6;19730:75;:::i;:::-;19830:2;19825:3;19821:12;19814:19;;19850:3;19843:10;;19603:256;;;;:::o;19865:961::-;20244:3;20266:92;20354:3;20345:6;20266:92;:::i;:::-;20259:99;;20375:148;20519:3;20375:148;:::i;:::-;20368:155;;20540:95;20631:3;20622:6;20540:95;:::i;:::-;20533:102;;20652:148;20796:3;20652:148;:::i;:::-;20645:155;;20817:3;20810:10;;19865:961;;;;;:::o;20832:379::-;21016:3;21038:147;21181:3;21038:147;:::i;:::-;21031:154;;21202:3;21195:10;;20832:379;;;:::o;21217:222::-;21310:4;21348:2;21337:9;21333:18;21325:26;;21361:71;21429:1;21418:9;21414:17;21405:6;21361:71;:::i;:::-;21217:222;;;;:::o;21445:640::-;21640:4;21678:3;21667:9;21663:19;21655:27;;21692:71;21760:1;21749:9;21745:17;21736:6;21692:71;:::i;:::-;21773:72;21841:2;21830:9;21826:18;21817:6;21773:72;:::i;:::-;21855;21923:2;21912:9;21908:18;21899:6;21855:72;:::i;:::-;21974:9;21968:4;21964:20;21959:2;21948:9;21944:18;21937:48;22002:76;22073:4;22064:6;22002:76;:::i;:::-;21994:84;;21445:640;;;;;;;:::o;22091:373::-;22234:4;22272:2;22261:9;22257:18;22249:26;;22321:9;22315:4;22311:20;22307:1;22296:9;22292:17;22285:47;22349:108;22452:4;22443:6;22349:108;:::i;:::-;22341:116;;22091:373;;;;:::o;22470:210::-;22557:4;22595:2;22584:9;22580:18;22572:26;;22608:65;22670:1;22659:9;22655:17;22646:6;22608:65;:::i;:::-;22470:210;;;;:::o;22686:222::-;22779:4;22817:2;22806:9;22802:18;22794:26;;22830:71;22898:1;22887:9;22883:17;22874:6;22830:71;:::i;:::-;22686:222;;;;:::o;22914:313::-;23027:4;23065:2;23054:9;23050:18;23042:26;;23114:9;23108:4;23104:20;23100:1;23089:9;23085:17;23078:47;23142:78;23215:4;23206:6;23142:78;:::i;:::-;23134:86;;22914:313;;;;:::o;23233:419::-;23399:4;23437:2;23426:9;23422:18;23414:26;;23486:9;23480:4;23476:20;23472:1;23461:9;23457:17;23450:47;23514:131;23640:4;23514:131;:::i;:::-;23506:139;;23233:419;;;:::o;23658:::-;23824:4;23862:2;23851:9;23847:18;23839:26;;23911:9;23905:4;23901:20;23897:1;23886:9;23882:17;23875:47;23939:131;24065:4;23939:131;:::i;:::-;23931:139;;23658:419;;;:::o;24083:::-;24249:4;24287:2;24276:9;24272:18;24264:26;;24336:9;24330:4;24326:20;24322:1;24311:9;24307:17;24300:47;24364:131;24490:4;24364:131;:::i;:::-;24356:139;;24083:419;;;:::o;24508:::-;24674:4;24712:2;24701:9;24697:18;24689:26;;24761:9;24755:4;24751:20;24747:1;24736:9;24732:17;24725:47;24789:131;24915:4;24789:131;:::i;:::-;24781:139;;24508:419;;;:::o;24933:::-;25099:4;25137:2;25126:9;25122:18;25114:26;;25186:9;25180:4;25176:20;25172:1;25161:9;25157:17;25150:47;25214:131;25340:4;25214:131;:::i;:::-;25206:139;;24933:419;;;:::o;25358:::-;25524:4;25562:2;25551:9;25547:18;25539:26;;25611:9;25605:4;25601:20;25597:1;25586:9;25582:17;25575:47;25639:131;25765:4;25639:131;:::i;:::-;25631:139;;25358:419;;;:::o;25783:::-;25949:4;25987:2;25976:9;25972:18;25964:26;;26036:9;26030:4;26026:20;26022:1;26011:9;26007:17;26000:47;26064:131;26190:4;26064:131;:::i;:::-;26056:139;;25783:419;;;:::o;26208:::-;26374:4;26412:2;26401:9;26397:18;26389:26;;26461:9;26455:4;26451:20;26447:1;26436:9;26432:17;26425:47;26489:131;26615:4;26489:131;:::i;:::-;26481:139;;26208:419;;;:::o;26633:::-;26799:4;26837:2;26826:9;26822:18;26814:26;;26886:9;26880:4;26876:20;26872:1;26861:9;26857:17;26850:47;26914:131;27040:4;26914:131;:::i;:::-;26906:139;;26633:419;;;:::o;27058:::-;27224:4;27262:2;27251:9;27247:18;27239:26;;27311:9;27305:4;27301:20;27297:1;27286:9;27282:17;27275:47;27339:131;27465:4;27339:131;:::i;:::-;27331:139;;27058:419;;;:::o;27483:::-;27649:4;27687:2;27676:9;27672:18;27664:26;;27736:9;27730:4;27726:20;27722:1;27711:9;27707:17;27700:47;27764:131;27890:4;27764:131;:::i;:::-;27756:139;;27483:419;;;:::o;27908:::-;28074:4;28112:2;28101:9;28097:18;28089:26;;28161:9;28155:4;28151:20;28147:1;28136:9;28132:17;28125:47;28189:131;28315:4;28189:131;:::i;:::-;28181:139;;27908:419;;;:::o;28333:222::-;28426:4;28464:2;28453:9;28449:18;28441:26;;28477:71;28545:1;28534:9;28530:17;28521:6;28477:71;:::i;:::-;28333:222;;;;:::o;28561:129::-;28595:6;28622:20;;:::i;:::-;28612:30;;28651:33;28679:4;28671:6;28651:33;:::i;:::-;28561:129;;;:::o;28696:75::-;28729:6;28762:2;28756:9;28746:19;;28696:75;:::o;28777:307::-;28838:4;28928:18;28920:6;28917:30;28914:56;;;28950:18;;:::i;:::-;28914:56;28988:29;29010:6;28988:29;:::i;:::-;28980:37;;29072:4;29066;29062:15;29054:23;;28777:307;;;:::o;29090:308::-;29152:4;29242:18;29234:6;29231:30;29228:56;;;29264:18;;:::i;:::-;29228:56;29302:29;29324:6;29302:29;:::i;:::-;29294:37;;29386:4;29380;29376:15;29368:23;;29090:308;;;:::o;29404:132::-;29471:4;29494:3;29486:11;;29524:4;29519:3;29515:14;29507:22;;29404:132;;;:::o;29542:141::-;29591:4;29614:3;29606:11;;29637:3;29634:1;29627:14;29671:4;29668:1;29658:18;29650:26;;29542:141;;;:::o;29689:114::-;29756:6;29790:5;29784:12;29774:22;;29689:114;;;:::o;29809:98::-;29860:6;29894:5;29888:12;29878:22;;29809:98;;;:::o;29913:99::-;29965:6;29999:5;29993:12;29983:22;;29913:99;;;:::o;30018:113::-;30088:4;30120;30115:3;30111:14;30103:22;;30018:113;;;:::o;30137:184::-;30236:11;30270:6;30265:3;30258:19;30310:4;30305:3;30301:14;30286:29;;30137:184;;;;:::o;30327:168::-;30410:11;30444:6;30439:3;30432:19;30484:4;30479:3;30475:14;30460:29;;30327:168;;;;:::o;30501:147::-;30602:11;30639:3;30624:18;;30501:147;;;;:::o;30654:169::-;30738:11;30772:6;30767:3;30760:19;30812:4;30807:3;30803:14;30788:29;;30654:169;;;;:::o;30829:148::-;30931:11;30968:3;30953:18;;30829:148;;;;:::o;30983:305::-;31023:3;31042:20;31060:1;31042:20;:::i;:::-;31037:25;;31076:20;31094:1;31076:20;:::i;:::-;31071:25;;31230:1;31162:66;31158:74;31155:1;31152:81;31149:107;;;31236:18;;:::i;:::-;31149:107;31280:1;31277;31273:9;31266:16;;30983:305;;;;:::o;31294:185::-;31334:1;31351:20;31369:1;31351:20;:::i;:::-;31346:25;;31385:20;31403:1;31385:20;:::i;:::-;31380:25;;31424:1;31414:35;;31429:18;;:::i;:::-;31414:35;31471:1;31468;31464:9;31459:14;;31294:185;;;;:::o;31485:348::-;31525:7;31548:20;31566:1;31548:20;:::i;:::-;31543:25;;31582:20;31600:1;31582:20;:::i;:::-;31577:25;;31770:1;31702:66;31698:74;31695:1;31692:81;31687:1;31680:9;31673:17;31669:105;31666:131;;;31777:18;;:::i;:::-;31666:131;31825:1;31822;31818:9;31807:20;;31485:348;;;;:::o;31839:191::-;31879:4;31899:20;31917:1;31899:20;:::i;:::-;31894:25;;31933:20;31951:1;31933:20;:::i;:::-;31928:25;;31972:1;31969;31966:8;31963:34;;;31977:18;;:::i;:::-;31963:34;32022:1;32019;32015:9;32007:17;;31839:191;;;;:::o;32036:96::-;32073:7;32102:24;32120:5;32102:24;:::i;:::-;32091:35;;32036:96;;;:::o;32138:90::-;32172:7;32215:5;32208:13;32201:21;32190:32;;32138:90;;;:::o;32234:77::-;32271:7;32300:5;32289:16;;32234:77;;;:::o;32317:149::-;32353:7;32393:66;32386:5;32382:78;32371:89;;32317:149;;;:::o;32472:126::-;32509:7;32549:42;32542:5;32538:54;32527:65;;32472:126;;;:::o;32604:77::-;32641:7;32670:5;32659:16;;32604:77;;;:::o;32687:86::-;32722:7;32762:4;32755:5;32751:16;32740:27;;32687:86;;;:::o;32779:154::-;32863:6;32858:3;32853;32840:30;32925:1;32916:6;32911:3;32907:16;32900:27;32779:154;;;:::o;32939:307::-;33007:1;33017:113;33031:6;33028:1;33025:13;33017:113;;;33116:1;33111:3;33107:11;33101:18;33097:1;33092:3;33088:11;33081:39;33053:2;33050:1;33046:10;33041:15;;33017:113;;;33148:6;33145:1;33142:13;33139:101;;;33228:1;33219:6;33214:3;33210:16;33203:27;33139:101;32988:258;32939:307;;;:::o;33252:320::-;33296:6;33333:1;33327:4;33323:12;33313:22;;33380:1;33374:4;33370:12;33401:18;33391:81;;33457:4;33449:6;33445:17;33435:27;;33391:81;33519:2;33511:6;33508:14;33488:18;33485:38;33482:84;;;33538:18;;:::i;:::-;33482:84;33303:269;33252:320;;;:::o;33578:281::-;33661:27;33683:4;33661:27;:::i;:::-;33653:6;33649:40;33791:6;33779:10;33776:22;33755:18;33743:10;33740:34;33737:62;33734:88;;;33802:18;;:::i;:::-;33734:88;33842:10;33838:2;33831:22;33621:238;33578:281;;:::o;33865:233::-;33904:3;33927:24;33945:5;33927:24;:::i;:::-;33918:33;;33973:66;33966:5;33963:77;33960:103;;;34043:18;;:::i;:::-;33960:103;34090:1;34083:5;34079:13;34072:20;;33865:233;;;:::o;34104:100::-;34143:7;34172:26;34192:5;34172:26;:::i;:::-;34161:37;;34104:100;;;:::o;34210:94::-;34249:7;34278:20;34292:5;34278:20;:::i;:::-;34267:31;;34210:94;;;:::o;34310:176::-;34342:1;34359:20;34377:1;34359:20;:::i;:::-;34354:25;;34393:20;34411:1;34393:20;:::i;:::-;34388:25;;34432:1;34422:35;;34437:18;;:::i;:::-;34422:35;34478:1;34475;34471:9;34466:14;;34310:176;;;;:::o;34492:180::-;34540:77;34537:1;34530:88;34637:4;34634:1;34627:15;34661:4;34658:1;34651:15;34678:180;34726:77;34723:1;34716:88;34823:4;34820:1;34813:15;34847:4;34844:1;34837:15;34864:180;34912:77;34909:1;34902:88;35009:4;35006:1;34999:15;35033:4;35030:1;35023:15;35050:180;35098:77;35095:1;35088:88;35195:4;35192:1;35185:15;35219:4;35216:1;35209:15;35236:180;35284:77;35281:1;35274:88;35381:4;35378:1;35371:15;35405:4;35402:1;35395:15;35422:117;35531:1;35528;35521:12;35545:117;35654:1;35651;35644:12;35668:117;35777:1;35774;35767:12;35791:117;35900:1;35897;35890:12;35914:117;36023:1;36020;36013:12;36037:117;36146:1;36143;36136:12;36160:102;36201:6;36252:2;36248:7;36243:2;36236:5;36232:14;36228:28;36218:38;;36160:102;;;:::o;36268:94::-;36301:8;36349:5;36345:2;36341:14;36320:35;;36268:94;;;:::o;36368:170::-;36508:22;36504:1;36496:6;36492:14;36485:46;36368:170;:::o;36544:225::-;36684:34;36680:1;36672:6;36668:14;36661:58;36753:8;36748:2;36740:6;36736:15;36729:33;36544:225;:::o;36775:170::-;36915:22;36911:1;36903:6;36899:14;36892:46;36775:170;:::o;36951:164::-;37091:16;37087:1;37079:6;37075:14;37068:40;36951:164;:::o;37121:174::-;37261:26;37257:1;37249:6;37245:14;37238:50;37121:174;:::o;37301:180::-;37441:32;37437:1;37429:6;37425:14;37418:56;37301:180;:::o;37487:167::-;37627:19;37623:1;37615:6;37611:14;37604:43;37487:167;:::o;37660:155::-;37800:7;37796:1;37788:6;37784:14;37777:31;37660:155;:::o;37821:182::-;37961:34;37957:1;37949:6;37945:14;37938:58;37821:182;:::o;38009:173::-;38149:25;38145:1;38137:6;38133:14;38126:49;38009:173;:::o;38188:114::-;;:::o;38308:170::-;38448:22;38444:1;38436:6;38432:14;38425:46;38308:170;:::o;38484:168::-;38624:20;38620:1;38612:6;38608:14;38601:44;38484:168;:::o;38658:181::-;38798:33;38794:1;38786:6;38782:14;38775:57;38658:181;:::o;38845:151::-;38985:3;38981:1;38973:6;38969:14;38962:27;38845:151;:::o;39002:122::-;39075:24;39093:5;39075:24;:::i;:::-;39068:5;39065:35;39055:63;;39114:1;39111;39104:12;39055:63;39002:122;:::o;39130:116::-;39200:21;39215:5;39200:21;:::i;:::-;39193:5;39190:32;39180:60;;39236:1;39233;39226:12;39180:60;39130:116;:::o;39252:122::-;39325:24;39343:5;39325:24;:::i;:::-;39318:5;39315:35;39305:63;;39364:1;39361;39354:12;39305:63;39252:122;:::o;39380:120::-;39452:23;39469:5;39452:23;:::i;:::-;39445:5;39442:34;39432:62;;39490:1;39487;39480:12;39432:62;39380:120;:::o;39506:122::-;39579:24;39597:5;39579:24;:::i;:::-;39572:5;39569:35;39559:63;;39618:1;39615;39608:12;39559:63;39506:122;:::o;39634:118::-;39705:22;39721:5;39705:22;:::i;:::-;39698:5;39695:33;39685:61;;39742:1;39739;39732:12;39685:61;39634:118;:::o

Swarm Source

ipfs://815d9051f44b30a15c21d68ff876a05bbb2a831feb414984f1eb750107bf1b35
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.