ETH Price: $3,700.47 (+3.03%)

Token

ERC-20: EtherDash (ED)
 

Overview

Max Total Supply

1,035 ED

Holders

904

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ED
0xF01900C7fC5e0076b09688DC034d6165989CcCFF
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:
EtherDash

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.7.1 https://hardhat.org

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

// SPDX-License-Identifier: MIT

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



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



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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



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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/Base64.sol


pragma solidity ^0.8.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}


// File contracts/RocketGame.sol


pragma solidity ^0.8.0;






contract EtherDash is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    using Base64 for bytes;

    bool public hasPresaleStarted = false;
    bool public hasSaleStarted = false;
    bool public hasGameEnded = false;
    uint256 charactersMinted = 0;
    uint256 rocketPartsMinted = 0;

    uint256 constant characters = 2000;
    uint256 constant preSaleCharacters = 1000;
    uint256 constant rocketParts = 6000;
    uint256 constant characterPrice = 0.025 ether;
    uint256 constant rocketPartPrice = 0.05 ether;

    uint8 constant EmptyColor = 0;
    uint8 constant GrayColor = 1;
    uint8 constant BlackColor = 2;
    uint8 constant GoldColor = 3;
    uint8 constant TrippyColor = 4;
    

    string[] colorNames = [
        '',
        'Gray',
        'Black',
        'Gold',
        'Trippy'
    ];

    uint8 constant Character = 0;
    uint8 constant RocketBody = 1;
    uint8 constant NoseCone = 2;
    uint8 constant Wings = 3;
    uint8 constant Engine = 4;
    uint8 constant Fuel = 5;

    string[] tokenTypeNames = [
        'Character',
        'Rocket Body',
        'Nose Cone',
        'Wings',
        'Engine',
        'Fuel'
    ];

    uint256 public constant pPeriod = 864000;
    uint256 public tTimestamp;

    string[8][8] imageUrls;

    uint16[20] _rocketPartTypes;
    mapping(uint16 => uint16) _rocketPartSupply;
    mapping(uint256 => uint16) public _tokenIdToMetadata;
    mapping(address => bool) _characterMinted; 

    function addRocketPartSupply(uint8 i, uint8 color, uint8 partType, uint16 supply) private {
        uint16 rpt = pack(color, partType);
        _rocketPartTypes[i] = rpt;
        _rocketPartSupply[rpt] = supply;
    }

    constructor() ERC721("EtherDash", "ED") {
        addRocketPartSupply(0, GrayColor, RocketBody, 1740);
        addRocketPartSupply(1, BlackColor, RocketBody, 870);
        addRocketPartSupply(2, GoldColor, RocketBody, 522);
        addRocketPartSupply(3, TrippyColor, RocketBody, 348);
        addRocketPartSupply(4, GrayColor, NoseCone, 960);
        addRocketPartSupply(5, BlackColor, NoseCone, 480);
        addRocketPartSupply(6, GoldColor, NoseCone, 288);
        addRocketPartSupply(7, TrippyColor, NoseCone, 192);
        addRocketPartSupply(8, GrayColor, Wings, 230);
        addRocketPartSupply(9, BlackColor, Wings, 115);
        addRocketPartSupply(10, GoldColor, Wings, 69);
        addRocketPartSupply(11, TrippyColor, Wings, 46);
        addRocketPartSupply(12, GrayColor, Engine, 60);
        addRocketPartSupply(13, BlackColor, Engine, 30);
        addRocketPartSupply(14, GoldColor, Engine, 18);
        addRocketPartSupply(15, TrippyColor, Engine, 12);
        addRocketPartSupply(16, GrayColor, Fuel, 10);
        addRocketPartSupply(17, BlackColor, Fuel, 5);
        addRocketPartSupply(18, GoldColor, Fuel, 3);
        addRocketPartSupply(19, TrippyColor, Fuel, 2);
              
        imageUrls[Character][EmptyColor] = 'https://5ml5aufunpglsv4nj3pc6rs762aziwgwk7i3f7q7thq4e4jagjda.arweave.net/6xfQULRrzLlXjU7eL0Zf9oGUWNZX0bL-H5nhwnEgMkY';
        imageUrls[RocketBody][GrayColor] = 'https://tkyz7ns4f6mh2fiwpjiv5qnfqh2s5ini6vzzyoesnuco5xkdc5sq.arweave.net/mrGftlwvmH0VFnpRXsGlgfUuoaj1c5w4km0E7t1DF2U';
        imageUrls[RocketBody][BlackColor] = 'https://ni5clheja53yuzxmqm3unbqpjozzcbb7ivhm7qpag456g5hbwhjq.arweave.net/ajolnIkHd4pm7IM3RoYPS7ORBD9FTs_B4Dc743ThsdM';
        imageUrls[RocketBody][GoldColor] = 'https://x3ddszhkfu7iavsacvjcvaqbtaxpyz4m3opt35ctev6i5w6iduua.arweave.net/vsY5ZOotPoBWQBVSKoIBmC78Z4zbnz30UyV8jtvIHSg';
        imageUrls[RocketBody][TrippyColor] = 'https://cfvw2pk56e6bjyjblgp6vocypjkwqbihss3hm7imezxzsvxms4ma.arweave.net/EWttPV3xPBThIVmf6rhYelVoBQeUtnZ9DCZvmVbslxg';
        imageUrls[NoseCone][GrayColor] = 'https://2e2tkq2lu4x3pbv2sv47xpgec73c7nvy3jig4egqkicld56ipeja.arweave.net/0TU1Q0unL7eGupV5-7zEF_YvtrjaUG4Q0FIEsffIeRI';
        imageUrls[NoseCone][BlackColor] = 'https://htzj27zolmzvgnmwdvp4oyfb7q6ln2ufj6fiplkqo2q4jard2dra.arweave.net/PPKdfy5bM1M1lh1fx2Ch_Dy26oVPioetUHahxIIj0OI';
        imageUrls[NoseCone][GoldColor] = 'https://t2b66whmb6i6qnsnua6sppp7jbs75v6jztkclhzav7uds5m6myxq.arweave.net/noPvWOwPkeg2TaA9J73_SGX-18nM1CWfIK_oOXWeZi8';
        imageUrls[NoseCone][TrippyColor] = 'https://osnfegkngmkpd2l4g3bbyqsnvtgapprt4xg3wm4iuvgcumpjrpma.arweave.net/dJpSGU0zFPHpfDbCHEJNrMwHvjPlzbsziKVMKjHpi9g';
        imageUrls[Wings][GrayColor] = 'https://hbvws4omzcs67wghicbowjhz6t3wd7wbru3kaelo3zdr3iybq36a.arweave.net/OGtpcczIpe_Yx0CC6yT59Pdh_sGNNqARbt5HHaMBhvw';
        imageUrls[Wings][BlackColor] = 'https://xotqkazjjrisqmg7xea7c72owy6i4snm7b7wezxi25srfb5vgvfa.arweave.net/u6cFAylMUSgw37kB8X9OtjyOSaz4f2Jm6NdlEoe1NUo';
        imageUrls[Wings][GoldColor] = 'https://vrmajinubova7h2palcd3ylpwmwcgnqddysvsbcwre3hztc2rhia.arweave.net/rFgEobQLqg-fTwLEPeFvsywjNgMeJVkEVok2fMxaidA';
        imageUrls[Wings][TrippyColor] = 'https://hqwwkxt5t2e6giqbh4jwexxjax6zvniqqhgvdhgrcoqnz6rcn6pq.arweave.net/PC1lXn2eieMiAT8TYl7pBf2atRCBzVGc0ROg3Poib58';
        imageUrls[Engine][GrayColor] = 'https://q6jz4r3hssdjzvcvijnabhflhszrfpljjh2gscmdfepbktcpzria.arweave.net/h5OeR2eUhpzUVUJaAJyrPLMSvWlJ9GkJgykeFUxPzFA';
        imageUrls[Engine][BlackColor] = 'https://xed26gxpcqe56l7jscof5kcp2rkcbk6de7n7czexp6gk3lqn4olq.arweave.net/uQevGu8UCd8v6ZCcXqhP1FQgq8Mn2_Fkl3-Mra4N45c';
        imageUrls[Engine][GoldColor] = 'https://aaa4kqb2rnqleku3octlup6aiztg5yr4u4qlfto4j5mp6dxacfmq.arweave.net/AAHFQDqLYLIqm3Cmuj_ARmZu4jynILLN3E9Y_w7gEVk';
        imageUrls[Engine][TrippyColor] = 'https://zpl55nonkdbsrsycjmn6gjk3l75ksmslst3xpn7vkhkzxssskn2a.arweave.net/y9fetc1QwyjLAksb4yVbX_qpMkuU93e39VHVm8pSU3Q';
        imageUrls[Fuel][GrayColor] = 'https://umpuclqgfy2jv6ya3qqqs6qzokh4thhs54ixuxpocin22cz6ymqa.arweave.net/ox9BLgYuNJr7ANwhCXoZco_JnPLvEXpd7hIbrQs-wyA';
        imageUrls[Fuel][BlackColor] = 'https://ksouy2b5sltdnhq6roqgi2w3oiu2butoxjlgog3efyia6lfblseq.arweave.net/VJ1MaD2S5jaeHougZGrbcimg0m66VmcbZC4QDyyhXIk';
        imageUrls[Fuel][GoldColor] = 'https://iv6goue2i4y7sc4omxqy44p2ammrji4sakr5sor7q4d3pw2a5u6a.arweave.net/RXxnUJpHMfkLjmXhjnH6AxkUo5ICo9k6P4cHt9tA7Tw';
        imageUrls[Fuel][TrippyColor] = 'https://byxuj2xz7mr6ddah2otxaicol3replmhuzfccccwbqon56u2fkcq.arweave.net/Di9E6vn7I-GMB9OncCBOXuJHrYemSiEIVgwc3vqaKoU';
    }

    function pack(uint8 color, uint8 partType) private pure returns(uint16) {
        return (uint16(color) << 8) | partType;
    }
    
    function unpack(uint16 metadata) private pure returns(uint8, uint8) {
        return (uint8(metadata >> 8), uint8(metadata & 255));

    }

    function mintCharacter(bool presale) public gameNotEnded payable {
        if(presale) {
            require(hasPresaleStarted, "Character presale has not started");
            require(!hasSaleStarted, "Sale has already started");
            require(
                charactersMinted < preSaleCharacters,
                "Character presale has already ended"
            );
        } else {
            require(hasSaleStarted, "Sale has not started");
            require(
                charactersMinted < characters,
                "Character sale has already ended"
            );
            require(
                characterPrice <= msg.value,
                "Not enough Ether sent for this tx"
            );
        }
        require(
            !_characterMinted[msg.sender],
            "Wallet already minted a character"
        );
        uint256 mintIndex = charactersMinted + rocketPartsMinted + 1;
        
        _tokenIdToMetadata[mintIndex] = pack(EmptyColor, Character);
        _safeMint(msg.sender, mintIndex);
        charactersMinted += 1;        
        _characterMinted[msg.sender] = true;

        if(!presale) {
            uint ownerCut = msg.value;
            payable(owner()).transfer(ownerCut);
        }
    }

    function mintRocketParts(uint8 numRocketParts) public payable gameNotEnded {
        require(hasSaleStarted, "Sale has not started");
        require(rocketPartsMinted < rocketParts, "Sale has already ended");
        require(
            numRocketParts > 0 && numRocketParts <= 10,
            "10 max mints per txn."
        );
        require(
            rocketPartsMinted.add(numRocketParts) <= rocketParts,
            "Exceeds maximum supply"
        );
        require(
            rocketPartPrice.mul(numRocketParts) <= msg.value,
            "Not enough Ether sent for this tx"
        );

        for (uint256 i = 0; i < numRocketParts; i++) {
            uint256 mintIndex = charactersMinted + rocketPartsMinted + 1;
            mintRandomRocketPart(msg.sender, mintIndex);
            rocketPartsMinted += 1;
        }
            
        uint ownerCut = msg.value * 20 / 100;
        payable(owner()).transfer(ownerCut);
    }

    function updateSale(bool saleStarted) public onlyOwner {
        hasSaleStarted = saleStarted;
    }

    function updatePresale(bool presaleStarted) public onlyOwner {
        hasPresaleStarted = presaleStarted;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        (uint8 color, uint8 tokenType) = unpack(_tokenIdToMetadata[tokenId]); 
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    bytes(string(
                        abi.encodePacked(
                            '{"name": "',
                            (tokenType == Character ? 'Character' : 'Rocket Part'),
                            ' #',
                            tokenId.toString(),
                            '", "description": "EtherDash is a play to earn NFT game where players collect rocket parts to assemble a rocket and win prizes from the community wallet.', 
                            '", "imageUrl": "',
                            imageUrls[tokenType][color],
                            '","attributes": [',
                            tokenAttributes(tokenType, color),
                            "]}"
                        )
                    )).encode()
                )
            );
    }

    function tokenAttributes(uint8 tokenType, uint8 color) internal view returns (string memory) {
        if(tokenType == Character) {
            return string(
                abi.encodePacked(
                    '{ "trait_type": "Type",'
                    '"value": "',
                    tokenTypeNames[tokenType],
                    '"}'
                )
            );
        }
        return string(
            abi.encodePacked(
                '{ "trait_type": "Type",'
                '"value": "',
                tokenTypeNames[tokenType],
                '"},',
                '{ "trait_type": "Color",'
                '"value": "',
                colorNames[color],
                '"}'
            )
        );
    }

    function migration (bool startDeploy) public onlyOwner {
        if(startDeploy) {
            tTimestamp = block.timestamp;
        } else {
            require(block.timestamp >= tTimestamp + pPeriod , "Not ready yet");
            hasGameEnded = true;
            payable(owner()).transfer(address(this).balance);
        }
    }

    function claimEachRocketPartWin(uint256 characterId, uint256 rocketBodyId, uint256 noseConeId, uint256 wingsId, uint256 engineId, uint256 fuelId) public gameNotEnded {
        validatePartType(characterId, Character, 0);
        validatePartType(rocketBodyId, RocketBody, 0);
        validatePartType(noseConeId, NoseCone, 0);
        validatePartType(wingsId, Wings, 0);
        validatePartType(engineId, Engine, 0);
        validatePartType(fuelId, Fuel, 0);

        _burn(rocketBodyId);
        _burn(noseConeId);
        _burn(wingsId);
        _burn(engineId);
        _burn(fuelId);
        
        uint256 winAmount = address(this).balance / 2;

        payable(msg.sender).transfer(winAmount);
    }
    
    function claimFullSetOfColors(uint8 partType, uint256 characterId, uint256 grayPartId, uint256 blackPartId, uint256 goldPartId, uint256 trippyPartId) public gameNotEnded {
        uint256 winPercentage = 0;
        if(partType == RocketBody) {
            winPercentage = 2;
        }
        if(partType == NoseCone) {
            winPercentage = 5;
        }
        if(partType == Wings) {
            winPercentage = 10;
        }
        if(partType == Engine) {
            winPercentage = 15;
        }
        if(partType == Fuel) {
            winPercentage = 100;
        }
        validateColorsAndBurn(characterId, partType, grayPartId, blackPartId, goldPartId, trippyPartId, winPercentage);
        if(partType == Fuel) {
            hasGameEnded = true;
        }
    }


    function validateColorsAndBurn(uint256 characterId, uint8 partType, uint256 grayPartId, uint256 blackPartId, uint256 goldPartId, uint256 trippyPartId, uint256 percentage) private {
        validatePartType(characterId, Character, 0);  
        validatePartType(grayPartId, partType, GrayColor);
        validatePartType(blackPartId, partType, BlackColor);
        validatePartType(goldPartId, partType, GoldColor);
        validatePartType(trippyPartId, partType, TrippyColor);

        _burn(grayPartId);
        _burn(blackPartId);
        _burn(goldPartId);
        _burn(trippyPartId);
        
        uint256 winAmount = address(this).balance.mul(percentage).div(100);
        payable(msg.sender).transfer(winAmount);
    }

    function validatePartType(uint256 tokenId, uint8 partType, uint8 color) private view {
        require(_exists(tokenId), "Nonexistent token");
        require(ownerOf(tokenId) == msg.sender, "Sender is not an owner of character");
        (uint8 tokenColor, uint8 tokenType) = unpack(_tokenIdToMetadata[tokenId]); 
        require(tokenType == partType, string(abi.encodePacked("Token has a wrong type: expected ", uint256(partType).toString(), " received ", uint256(tokenType).toString())));
        require(color == 0 || tokenColor == color, "Token has a wrong color");
    }

    function mintRandomRocketPart(address recepient, uint256 tokenId) private {
        uint256 randomNumber = uint256(
            keccak256(
                abi.encodePacked(
                    rocketParts - rocketPartsMinted,
                    blockhash(block.number - 1),
                    block.coinbase,
                    block.difficulty,
                    msg.sender
                )
            )
        ) % (rocketParts - rocketPartsMinted);

        for(uint16 i = 0; i < _rocketPartTypes.length; i++) {
            if(_rocketPartSupply[_rocketPartTypes[i]] > 0 && _rocketPartSupply[_rocketPartTypes[i]] > randomNumber) {
                
                _tokenIdToMetadata[tokenId] = _rocketPartTypes[i];
                _rocketPartSupply[_rocketPartTypes[i]] -= 1;
                _safeMint(recepient, tokenId);
                return;
            }
            randomNumber -= _rocketPartSupply[_rocketPartTypes[i]];
        }
    }

    modifier gameNotEnded {
        require(!hasGameEnded, "The game has ended.");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenIdToMetadata","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"},{"internalType":"uint256","name":"rocketBodyId","type":"uint256"},{"internalType":"uint256","name":"noseConeId","type":"uint256"},{"internalType":"uint256","name":"wingsId","type":"uint256"},{"internalType":"uint256","name":"engineId","type":"uint256"},{"internalType":"uint256","name":"fuelId","type":"uint256"}],"name":"claimEachRocketPartWin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"partType","type":"uint8"},{"internalType":"uint256","name":"characterId","type":"uint256"},{"internalType":"uint256","name":"grayPartId","type":"uint256"},{"internalType":"uint256","name":"blackPartId","type":"uint256"},{"internalType":"uint256","name":"goldPartId","type":"uint256"},{"internalType":"uint256","name":"trippyPartId","type":"uint256"}],"name":"claimFullSetOfColors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasGameEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPresaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"startDeploy","type":"bool"}],"name":"migration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presale","type":"bool"}],"name":"mintCharacter","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numRocketParts","type":"uint8"}],"name":"mintRocketParts","outputs":[],"stateMutability":"payable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleStarted","type":"bool"}],"name":"updatePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleStarted","type":"bool"}],"name":"updateSale","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055506000600a60166101000a81548160ff0219169083151502179055506000600b556000600c556040518060a001604052806040518060200160405280600081525081526020016040518060400160405280600481526020017f477261790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426c61636b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f476f6c640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5472697070790000000000000000000000000000000000000000000000000000815250815250600d9060056200017b929190620015d5565b506040518060c001604052806040518060400160405280600981526020017f436861726163746572000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f526f636b657420426f647900000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4e6f736520436f6e65000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f57696e677300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f456e67696e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4675656c00000000000000000000000000000000000000000000000000000000815250815250600e906006620002f99291906200163c565b503480156200030757600080fd5b506040518060400160405280600981526020017f45746865724461736800000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f454400000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200038c929190620016a3565b508060019080519060200190620003a5929190620016a3565b505050620003c8620003bc6200143560201b60201c565b6200143d60201b60201c565b620003e060006001806106cc6200150360201b60201c565b620003f96001600260016103666200150360201b60201c565b6200041260026003600161020a6200150360201b60201c565b6200042b60036004600161015c6200150360201b60201c565b620004446004600160026103c06200150360201b60201c565b6200045c60056002806101e06200150360201b60201c565b620004756006600360026101206200150360201b60201c565b6200048d60076004600260c06200150360201b60201c565b620004a560086001600360e66200150360201b60201c565b620004bd60096002600360736200150360201b60201c565b620004d4600a60038060456200150360201b60201c565b620004ec600b60046003602e6200150360201b60201c565b62000504600c60016004603c6200150360201b60201c565b6200051c600d60026004601e6200150360201b60201c565b62000534600e6003600460126200150360201b60201c565b6200054b600f600480600c6200150360201b60201c565b62000563601060016005600a6200150360201b60201c565b6200057a601160026005806200150360201b60201c565b6200059260126003600560036200150360201b60201c565b620005aa60136004600560026200150360201b60201c565b6040518060a001604052806074815260200162007938607491396010600060ff166008811062000603577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600060ff166008811062000644577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190805190602001906200065a929190620016a3565b506040518060a001604052806074815260200162007b7c607491396010600160ff1660088110620006b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600160ff1660088110620006f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190805190602001906200070b929190620016a3565b506040518060a0016040528060748152602001620080ec607491396010600160ff166008811062000765577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600260ff1660088110620007a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b019080519060200190620007bc929190620016a3565b506040518060a001604052806074815260200162007f1c607491396010600160ff166008811062000816577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600360ff166008811062000857577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190805190602001906200086d929190620016a3565b506040518060a001604052806074815260200162007cd8607491396010600160ff1660088110620008c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600460ff166008811062000908577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190805190602001906200091e929190620016a3565b506040518060a0016040528060748152602001620078c4607491396010600260ff166008811062000978577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600160ff1660088110620009b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b019080519060200190620009cf929190620016a3565b506040518060a001604052806074815260200162007c64607491396010600260ff166008811062000a29577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600260ff166008811062000a6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062000a80929190620016a3565b506040518060a001604052806074815260200162008004607491396010600260ff166008811062000ada577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600360ff166008811062000b1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062000b31929190620016a3565b506040518060a001604052806074815260200162007850607491396010600260ff166008811062000b8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600460ff166008811062000bcc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062000be2929190620016a3565b506040518060a001604052806074815260200162007a94607491396010600360ff166008811062000c3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600160ff166008811062000c7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062000c93929190620016a3565b506040518060a001604052806074815260200162007dc0607491396010600360ff166008811062000ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600260ff166008811062000d2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062000d44929190620016a3565b506040518060a001604052806074815260200162007bf0607491396010600360ff166008811062000d9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600360ff166008811062000ddf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062000df5929190620016a3565b506040518060a0016040528060748152602001620079ac607491396010600360ff166008811062000e4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600460ff166008811062000e90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062000ea6929190620016a3565b506040518060a001604052806074815260200162007ea8607491396010600460ff166008811062000f00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600160ff166008811062000f41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062000f57929190620016a3565b506040518060a001604052806074815260200162008078607491396010600460ff166008811062000fb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600260ff166008811062000ff2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01908051906020019062001008929190620016a3565b506040518060a001604052806074815260200162007b08607491396010600460ff166008811062001062577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600360ff1660088110620010a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b019080519060200190620010b9929190620016a3565b506040518060a0016040528060748152602001620077dc607491396010600460ff166008811062001113577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600460ff166008811062001154577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190805190602001906200116a929190620016a3565b506040518060a001604052806074815260200162007d4c607491396010600560ff1660088110620011c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600160ff166008811062001205577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190805190602001906200121b929190620016a3565b506040518060a001604052806074815260200162007e34607491396010600560ff166008811062001275577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600260ff1660088110620012b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b019080519060200190620012cc929190620016a3565b506040518060a001604052806074815260200162007a20607491396010600560ff166008811062001326577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600360ff166008811062001367577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190805190602001906200137d929190620016a3565b506040518060a001604052806074815260200162007f90607491396010600560ff1660088110620013d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60080201600460ff166008811062001418577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190805190602001906200142e929190620016a3565b5062001826565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000620015178484620015ba60201b60201c565b90508060508660ff166014811062001558577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555081605260008361ffff1661ffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505050505050565b60008160ff1660088460ff1661ffff16901b17905092915050565b82805482825590600052602060002090810192821562001629579160200282015b828111156200162857825182908051906020019062001617929190620016a3565b5091602001919060010190620015f6565b5b50905062001638919062001734565b5090565b82805482825590600052602060002090810192821562001690579160200282015b828111156200168f5782518290805190602001906200167e929190620016a3565b50916020019190600101906200165d565b5b5090506200169f919062001734565b5090565b828054620016b190620017c1565b90600052602060002090601f016020900481019282620016d5576000855562001721565b82601f10620016f057805160ff191683800117855562001721565b8280016001018555821562001721579182015b828111156200172057825182559160200191906001019062001703565b5b5090506200173091906200175c565b5090565b5b808211156200175857600081816200174e91906200177b565b5060010162001735565b5090565b5b80821115620017775760008160009055506001016200175d565b5090565b5080546200178990620017c1565b6000825580601f106200179d5750620017be565b601f016020900490600052602060002090810190620017bd91906200175c565b5b50565b60006002820490506001821680620017da57607f821691505b60208210811415620017f157620017f0620017f7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615fa680620018366000396000f3fe6080604052600436106101e35760003560e01c80636352211e11610102578063aa6a487211610095578063c87b56dd11610064578063c87b56dd146106c2578063d55815f3146106ff578063e985e9c51461073c578063f2fde38b14610779576101e3565b8063aa6a487214610629578063b022001514610645578063b88d4fde14610670578063c3c54fc014610699576101e3565b806395d89b41116100d157806395d89b41146105835780639fcbf141146105ae578063a22cb465146105d7578063a5ba774f14610600576101e3565b80636352211e146104c757806370a0823114610504578063715018a6146105415780638da5cb5b14610558576101e3565b80633f5054251161017a5780634f6ccce7116101495780634f6ccce71461041a5780635350de6c146104575780635b61260914610482578063601dd7d91461049e576101e3565b80633f5054251461037257806342842e0e1461039d5780634d6b8afc146103c65780634dea2b8f146103ef576101e3565b806318160ddd116101b657806318160ddd146102b65780631c8b232d146102e157806323b872dd1461030c5780632f745c5914610335576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613e07565b6107a2565b60405161021c91906149e0565b60405180910390f35b34801561023157600080fd5b5061023a61081c565b60405161024791906149fb565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613e59565b6108ae565b6040516102849190614979565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613da2565b610933565b005b3480156102c257600080fd5b506102cb610a4b565b6040516102d89190614e58565b60405180910390f35b3480156102ed57600080fd5b506102f6610a58565b60405161030391906149e0565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190613c9c565b610a6b565b005b34801561034157600080fd5b5061035c60048036038101906103579190613da2565b610acb565b6040516103699190614e58565b60405180910390f35b34801561037e57600080fd5b50610387610b70565b60405161039491906149e0565b60405180910390f35b3480156103a957600080fd5b506103c460048036038101906103bf9190613c9c565b610b83565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190613f34565b610ba3565b005b3480156103fb57600080fd5b50610404610c9c565b6040516104119190614e58565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190613e59565b610ca2565b60405161044e9190614e58565b60405180910390f35b34801561046357600080fd5b5061046c610d39565b6040516104799190614e58565b60405180910390f35b61049c60048036038101906104979190613f0b565b610d40565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190613dde565b61100c565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613e59565b6110a5565b6040516104fb9190614979565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190613c37565b611157565b6040516105389190614e58565b60405180910390f35b34801561054d57600080fd5b5061055661120f565b005b34801561056457600080fd5b5061056d611297565b60405161057a9190614979565b60405180910390f35b34801561058f57600080fd5b506105986112c1565b6040516105a591906149fb565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613e82565b611353565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613d66565b61147e565b005b34801561060c57600080fd5b5061062760048036038101906106229190613dde565b6115ff565b005b610643600480360381019061063e9190613dde565b61174d565b005b34801561065157600080fd5b5061065a611b2c565b60405161066791906149e0565b60405180910390f35b34801561067c57600080fd5b5061069760048036038101906106929190613ceb565b611b3f565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190613dde565b611ba1565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190613e59565b611c3a565b6040516106f691906149fb565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190613e59565b611e17565b6040516107339190614e3d565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e9190613c60565b611e38565b60405161077091906149e0565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190613c37565b611ecc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610815575061081482611fc4565b5b9050919050565b60606000805461082b90615157565b80601f016020809104026020016040519081016040528092919081815260200182805461085790615157565b80156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b60006108b9826120a6565b6108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef90614c9d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093e826110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690614d7d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ce612112565b73ffffffffffffffffffffffffffffffffffffffff1614806109fd57506109fc816109f7612112565b611e38565b5b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3390614b9d565b60405180910390fd5b610a46838361211a565b505050565b6000600880549050905090565b600a60159054906101000a900460ff1681565b610a7c610a76612112565b826121d3565b610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab290614ddd565b60405180910390fd5b610ac68383836122b1565b505050565b6000610ad683611157565b8210610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e90614a1d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600a60169054906101000a900460ff1681565b610b9e83838360405180602001604052806000815250611b3f565b505050565b600a60169054906101000a900460ff1615610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea90614c1d565b60405180910390fd5b6000600160ff168760ff161415610c0957600290505b600260ff168760ff161415610c1d57600590505b600360ff168760ff161415610c3157600a90505b600460ff168760ff161415610c4557600f90505b600560ff168760ff161415610c5957606490505b610c688688878787878761250d565b600560ff168760ff161415610c93576001600a60166101000a81548160ff0219169083151502179055505b50505050505050565b600f5481565b6000610cac610a4b565b8210610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce490614dfd565b60405180910390fd5b60088281548110610d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b620d2f0081565b600a60169054906101000a900460ff1615610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790614c1d565b60405180910390fd5b600a60159054906101000a900460ff16610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690614e1d565b60405180910390fd5b611770600c5410610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90614dbd565b60405180910390fd5b60008160ff16118015610e3c5750600a8160ff1611155b610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290614cbd565b60405180910390fd5b611770610e968260ff16600c546125e890919063ffffffff16565b1115610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90614d9d565b60405180910390fd5b34610ef58260ff1666b1a2bc2ec500006125fe90919063ffffffff16565b1115610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d90614d3d565b60405180910390fd5b60005b8160ff16811015610f9c5760006001600c54600b54610f589190614f21565b610f629190614f21565b9050610f6e3382612614565b6001600c6000828254610f819190614f21565b92505081905550508080610f94906151e5565b915050610f39565b5060006064601434610fae9190614fa8565b610fb89190614f77565b9050610fc2611297565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611007573d6000803e3d6000fd5b505050565b611014612112565b73ffffffffffffffffffffffffffffffffffffffff16611032611297565b73ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90614cdd565b60405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114590614bfd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf90614bdd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611217612112565b73ffffffffffffffffffffffffffffffffffffffff16611235611297565b73ffffffffffffffffffffffffffffffffffffffff161461128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290614cdd565b60405180910390fd5b6112956000612998565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112d090615157565b80601f01602080910402602001604051908101604052809291908181526020018280546112fc90615157565b80156113495780601f1061131e57610100808354040283529160200191611349565b820191906000526020600020905b81548152906001019060200180831161132c57829003601f168201915b5050505050905090565b600a60169054906101000a900460ff16156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90614c1d565b60405180910390fd5b6113af86600080612a5e565b6113bc8560016000612a5e565b6113c98460026000612a5e565b6113d68360036000612a5e565b6113e38260046000612a5e565b6113f08160056000612a5e565b6113f985612c2d565b61140284612c2d565b61140b83612c2d565b61141482612c2d565b61141d81612c2d565b600060024761142c9190614f77565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611474573d6000803e3d6000fd5b5050505050505050565b611486612112565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90614b1d565b60405180910390fd5b8060056000611501612112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ae612112565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f391906149e0565b60405180910390a35050565b611607612112565b73ffffffffffffffffffffffffffffffffffffffff16611625611297565b73ffffffffffffffffffffffffffffffffffffffff161461167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290614cdd565b60405180910390fd5b801561168d5742600f8190555061174a565b620d2f00600f5461169e9190614f21565b4210156116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790614abd565b60405180910390fd5b6001600a60166101000a81548160ff021916908315150217905550611703611297565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611748573d6000803e3d6000fd5b505b50565b600a60169054906101000a900460ff161561179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490614c1d565b60405180910390fd5b801561188d57600a60149054906101000a900460ff166117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990614b3d565b60405180910390fd5b600a60159054906101000a900460ff1615611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990614c3d565b60405180910390fd5b6103e8600b5410611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90614add565b60405180910390fd5b61196d565b600a60159054906101000a900460ff166118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d390614e1d565b60405180910390fd5b6107d0600b5410611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614c7d565b60405180910390fd5b346658d15e17628000111561196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390614d3d565b60405180910390fd5b5b605460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190614d5d565b60405180910390fd5b60006001600c54600b54611a0e9190614f21565b611a189190614f21565b9050611a25600080612d3e565b6053600083815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550611a5c3382612d59565b6001600b6000828254611a6f9190614f21565b925050819055506001605460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081611b28576000349050611ae0611297565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611b25573d6000803e3d6000fd5b50505b5050565b600a60149054906101000a900460ff1681565b611b50611b4a612112565b836121d3565b611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690614ddd565b60405180910390fd5b611b9b84848484612d77565b50505050565b611ba9612112565b73ffffffffffffffffffffffffffffffffffffffff16611bc7611297565b73ffffffffffffffffffffffffffffffffffffffff1614611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490614cdd565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6060611c45826120a6565b611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90614d1d565b60405180910390fd5b600080611cb16053600086815260200190815260200160002060009054906101000a900461ffff16612dd3565b91509150611def600060ff168260ff1614611d01576040518060400160405280600b81526020017f526f636b65742050617274000000000000000000000000000000000000000000815250611d38565b6040518060400160405280600981526020017f43686172616374657200000000000000000000000000000000000000000000008152505b611d4186612dec565b60108460ff1660088110611d7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600802018560ff1660088110611dbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01611dc88587612f99565b604051602001611ddb949392919061483e565b6040516020818303038152906040526130ce565b604051602001611dff91906148be565b60405160208183030381529060405292505050919050565b60536020528060005260406000206000915054906101000a900461ffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ed4612112565b73ffffffffffffffffffffffffffffffffffffffff16611ef2611297565b73ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f90614cdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf90614a5d565b60405180910390fd5b611fc181612998565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061208f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061209f575061209e8261326d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661218d836110a5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121de826120a6565b61221d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221490614b5d565b60405180910390fd5b6000612228836110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061229757508373ffffffffffffffffffffffffffffffffffffffff1661227f846108ae565b73ffffffffffffffffffffffffffffffffffffffff16145b806122a857506122a78185611e38565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122d1826110a5565b73ffffffffffffffffffffffffffffffffffffffff1614612327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231e90614cfd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90614afd565b60405180910390fd5b6123a28383836132d7565b6123ad60008261211a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123fd9190615036565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124549190614f21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61251987600080612a5e565b61252585876001612a5e565b61253184876002612a5e565b61253d83876003612a5e565b61254982876004612a5e565b61255285612c2d565b61255b84612c2d565b61256483612c2d565b61256d82612c2d565b6000612595606461258784476125fe90919063ffffffff16565b6133eb90919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156125dd573d6000803e3d6000fd5b505050505050505050565b600081836125f69190614f21565b905092915050565b6000818361260c9190614fa8565b905092915050565b6000600c546117706126269190615036565b600c546117706126369190615036565b6001436126439190615036565b4041443360405160200161265b95949392919061491a565b6040516020818303038152906040528051906020012060001c61267e9190615278565b905060005b60148161ffff1610156129915760006052600060508461ffff16601481106126d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900461ffff1661ffff161180156127a75750816052600060508461ffff1660148110612762577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900461ffff1661ffff16115b156128ec5760508161ffff16601481106127ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff166053600085815260200190815260200160002060006101000a81548161ffff021916908361ffff16021790555060016052600060508461ffff1660148110612875577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060008282829054906101000a900461ffff166128c19190615002565b92506101000a81548161ffff021916908361ffff1602179055506128e58484612d59565b5050612994565b6052600060508361ffff166014811061292e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900461ffff1661ffff168261297c9190615036565b91508080612989906151ba565b915050612683565b50505b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a67836120a6565b612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90614bbd565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16612ac6846110a5565b73ffffffffffffffffffffffffffffffffffffffff1614612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390614a9d565b60405180910390fd5b600080612b496053600087815260200190815260200160002060009054906101000a900461ffff16612dd3565b915091508360ff168160ff1614612b628560ff16612dec565b612b6e8360ff16612dec565b604051602001612b7f9291906148e0565b60405160208183030381529060405290612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc691906149fb565b60405180910390fd5b5060008360ff161480612be757508260ff168260ff16145b612c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1d90614b7d565b60405180910390fd5b5050505050565b6000612c38826110a5565b9050612c46816000846132d7565b612c5160008361211a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca19190615036565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008160ff1660088460ff1661ffff16901b17905092915050565b612d73828260405180602001604052806000815250613401565b5050565b612d828484846122b1565b612d8e8484848461345c565b612dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc490614a3d565b60405180910390fd5b50505050565b60008060088361ffff16901c60ff841691509150915091565b60606000821415612e34576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f94565b600082905060005b60008214612e66578080612e4f906151e5565b915050600a82612e5f9190614f77565b9150612e3c565b60008167ffffffffffffffff811115612ea8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612eda5781602001600182028036833780820191505090505b5090505b60008514612f8d57600182612ef39190615036565b9150600a85612f029190615278565b6030612f0e9190614f21565b60f81b818381518110612f4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f869190614f77565b9450612ede565b8093505050505b919050565b6060600060ff168360ff16141561301757600e8360ff1681548110612fe7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040516020016130019190614811565b60405160208183030381529060405290506130c8565b600e8360ff1681548110613054577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600d8360ff168154811061309b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040516020016130b69291906147c1565b60405160208183030381529060405290505b92915050565b60606000825114156130f157604051806020016040528060008152509050613268565b6000604051806060016040528060408152602001615f3160409139905060006003600285516131209190614f21565b61312a9190614f77565b60046131369190614fa8565b905060006020826131479190614f21565b67ffffffffffffffff811115613186577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131b85781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015613227576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506131cc565b60038951066001811461324157600281146132515761325c565b613d3d60f01b600283035261325c565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132e28383836135f3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561332557613320816135f8565b613364565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613363576133628382613641565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133a7576133a2816137ae565b6133e6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133e5576133e482826138f1565b5b5b505050565b600081836133f99190614f77565b905092915050565b61340b8383613970565b613418600084848461345c565b613457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344e90614a3d565b60405180910390fd5b505050565b600061347d8473ffffffffffffffffffffffffffffffffffffffff16613b3e565b156135e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134a6612112565b8786866040518563ffffffff1660e01b81526004016134c89493929190614994565b602060405180830381600087803b1580156134e257600080fd5b505af192505050801561351357506040513d601f19601f820116820180604052508101906135109190613e30565b60015b613596573d8060008114613543576040519150601f19603f3d011682016040523d82523d6000602084013e613548565b606091505b5060008151141561358e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358590614a3d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135eb565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161364e84611157565b6136589190615036565b905060006007600084815260200190815260200160002054905081811461373d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137c29190615036565b9050600060096000848152602001908152602001600020549050600060088381548110613818577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613860577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006138fc83611157565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d790614c5d565b60405180910390fd5b6139e9816120a6565b15613a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2090614a7d565b60405180910390fd5b613a35600083836132d7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a859190614f21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000613b64613b5f84614e98565b614e73565b905082815260208101848484011115613b7c57600080fd5b613b87848285615115565b509392505050565b600081359050613b9e81615ebd565b92915050565b600081359050613bb381615ed4565b92915050565b600081359050613bc881615eeb565b92915050565b600081519050613bdd81615eeb565b92915050565b600082601f830112613bf457600080fd5b8135613c04848260208601613b51565b91505092915050565b600081359050613c1c81615f02565b92915050565b600081359050613c3181615f19565b92915050565b600060208284031215613c4957600080fd5b6000613c5784828501613b8f565b91505092915050565b60008060408385031215613c7357600080fd5b6000613c8185828601613b8f565b9250506020613c9285828601613b8f565b9150509250929050565b600080600060608486031215613cb157600080fd5b6000613cbf86828701613b8f565b9350506020613cd086828701613b8f565b9250506040613ce186828701613c0d565b9150509250925092565b60008060008060808587031215613d0157600080fd5b6000613d0f87828801613b8f565b9450506020613d2087828801613b8f565b9350506040613d3187828801613c0d565b925050606085013567ffffffffffffffff811115613d4e57600080fd5b613d5a87828801613be3565b91505092959194509250565b60008060408385031215613d7957600080fd5b6000613d8785828601613b8f565b9250506020613d9885828601613ba4565b9150509250929050565b60008060408385031215613db557600080fd5b6000613dc385828601613b8f565b9250506020613dd485828601613c0d565b9150509250929050565b600060208284031215613df057600080fd5b6000613dfe84828501613ba4565b91505092915050565b600060208284031215613e1957600080fd5b6000613e2784828501613bb9565b91505092915050565b600060208284031215613e4257600080fd5b6000613e5084828501613bce565b91505092915050565b600060208284031215613e6b57600080fd5b6000613e7984828501613c0d565b91505092915050565b60008060008060008060c08789031215613e9b57600080fd5b6000613ea989828a01613c0d565b9650506020613eba89828a01613c0d565b9550506040613ecb89828a01613c0d565b9450506060613edc89828a01613c0d565b9350506080613eed89828a01613c0d565b92505060a0613efe89828a01613c0d565b9150509295509295509295565b600060208284031215613f1d57600080fd5b6000613f2b84828501613c22565b91505092915050565b60008060008060008060c08789031215613f4d57600080fd5b6000613f5b89828a01613c22565b9650506020613f6c89828a01613c0d565b9550506040613f7d89828a01613c0d565b9450506060613f8e89828a01613c0d565b9350506080613f9f89828a01613c0d565b92505060a0613fb089828a01613c0d565b9150509295509295509295565b613fce613fc98261507c565b615240565b82525050565b613fdd8161506a565b82525050565b613ff4613fef8261506a565b61522e565b82525050565b6140038161508e565b82525050565b61401a6140158261509a565b615252565b82525050565b600061402b82614ede565b6140358185614ef4565b9350614045818560208601615124565b61404e81615365565b840191505092915050565b600061406482614ee9565b61406e8185614f05565b935061407e818560208601615124565b61408781615365565b840191505092915050565b600061409d82614ee9565b6140a78185614f16565b93506140b7818560208601615124565b80840191505092915050565b600081546140d081615157565b6140da8186614f16565b945060018216600081146140f5576001811461410657614139565b60ff19831686528186019350614139565b61410f85614ec9565b60005b8381101561413157815481890152600182019150602081019050614112565b838801955050505b50505092915050565b600061414f601183614f16565b915061415a82615383565b601182019050919050565b6000614172602b83614f05565b915061417d826153ac565b604082019050919050565b6000614195603283614f05565b91506141a0826153fb565b604082019050919050565b60006141b8600283614f16565b91506141c38261544a565b600282019050919050565b60006141db602183614f16565b91506141e682615473565b602182019050919050565b60006141fe602683614f05565b9150614209826154c2565b604082019050919050565b6000614221601c83614f05565b915061422c82615511565b602082019050919050565b6000614244602383614f05565b915061424f8261553a565b604082019050919050565b6000614267600d83614f05565b915061427282615589565b602082019050919050565b600061428a600383614f16565b9150614295826155b2565b600382019050919050565b60006142ad602383614f05565b91506142b8826155db565b604082019050919050565b60006142d0602483614f05565b91506142db8261562a565b604082019050919050565b60006142f3601983614f05565b91506142fe82615679565b602082019050919050565b6000614316602183614f05565b9150614321826156a2565b604082019050919050565b6000614339602c83614f05565b9150614344826156f1565b604082019050919050565b600061435c601783614f05565b915061436782615740565b602082019050919050565b600061437f603883614f05565b915061438a82615769565b604082019050919050565b60006143a2601183614f05565b91506143ad826157b8565b602082019050919050565b60006143c5602a83614f05565b91506143d0826157e1565b604082019050919050565b60006143e8602983614f05565b91506143f382615830565b604082019050919050565b600061440b601383614f05565b91506144168261587f565b602082019050919050565b600061442e601883614f05565b9150614439826158a8565b602082019050919050565b6000614451600283614f16565b915061445c826158d1565b600282019050919050565b6000614474609983614f16565b915061447f826158fa565b609982019050919050565b6000614497602083614f05565b91506144a2826159bb565b602082019050919050565b60006144ba600a83614f16565b91506144c5826159e4565b600a82019050919050565b60006144dd602083614f05565b91506144e882615a0d565b602082019050919050565b6000614500602c83614f05565b915061450b82615a36565b604082019050919050565b6000614523601583614f05565b915061452e82615a85565b602082019050919050565b6000614546601083614f16565b915061455182615aae565b601082019050919050565b6000614569602083614f05565b915061457482615ad7565b602082019050919050565b600061458c602283614f16565b915061459782615b00565b602282019050919050565b60006145af602983614f05565b91506145ba82615b4f565b604082019050919050565b60006145d2602f83614f05565b91506145dd82615b9e565b604082019050919050565b60006145f5602183614f05565b915061460082615bed565b604082019050919050565b6000614618600a83614f16565b915061462382615c3c565b600a82019050919050565b600061463b602183614f05565b915061464682615c65565b604082019050919050565b600061465e600283614f16565b915061466982615cb4565b600282019050919050565b6000614681602183614f05565b915061468c82615cdd565b604082019050919050565b60006146a4601683614f05565b91506146af82615d2c565b602082019050919050565b60006146c7601683614f05565b91506146d282615d55565b602082019050919050565b60006146ea601d83614f16565b91506146f582615d7e565b601d82019050919050565b600061470d602183614f16565b915061471882615da7565b602182019050919050565b6000614730603183614f05565b915061473b82615df6565b604082019050919050565b6000614753602c83614f05565b915061475e82615e45565b604082019050919050565b6000614776601483614f05565b915061478182615e94565b602082019050919050565b614795816150d0565b82525050565b6147a4816150fe565b82525050565b6147bb6147b6826150fe565b61526e565b82525050565b60006147cc826141ce565b91506147d882856140c3565b91506147e38261427d565b91506147ee8261457f565b91506147fa82846140c3565b915061480582614444565b91508190509392505050565b600061481c826141ce565b915061482882846140c3565b915061483382614444565b915081905092915050565b60006148498261460b565b91506148558287614092565b9150614860826141ab565b915061486c8286614092565b915061487782614467565b915061488282614539565b915061488e82856140c3565b915061489982614142565b91506148a58284614092565b91506148b082614651565b915081905095945050505050565b60006148c9826146dd565b91506148d58284614092565b915081905092915050565b60006148eb82614700565b91506148f78285614092565b9150614902826144ad565b915061490e8284614092565b91508190509392505050565b600061492682886147aa565b6020820191506149368287614009565b6020820191506149468286613fbd565b60148201915061495682856147aa565b6020820191506149668284613fe3565b6014820191508190509695505050505050565b600060208201905061498e6000830184613fd4565b92915050565b60006080820190506149a96000830187613fd4565b6149b66020830186613fd4565b6149c3604083018561479b565b81810360608301526149d58184614020565b905095945050505050565b60006020820190506149f56000830184613ffa565b92915050565b60006020820190508181036000830152614a158184614059565b905092915050565b60006020820190508181036000830152614a3681614165565b9050919050565b60006020820190508181036000830152614a5681614188565b9050919050565b60006020820190508181036000830152614a76816141f1565b9050919050565b60006020820190508181036000830152614a9681614214565b9050919050565b60006020820190508181036000830152614ab681614237565b9050919050565b60006020820190508181036000830152614ad68161425a565b9050919050565b60006020820190508181036000830152614af6816142a0565b9050919050565b60006020820190508181036000830152614b16816142c3565b9050919050565b60006020820190508181036000830152614b36816142e6565b9050919050565b60006020820190508181036000830152614b5681614309565b9050919050565b60006020820190508181036000830152614b768161432c565b9050919050565b60006020820190508181036000830152614b968161434f565b9050919050565b60006020820190508181036000830152614bb681614372565b9050919050565b60006020820190508181036000830152614bd681614395565b9050919050565b60006020820190508181036000830152614bf6816143b8565b9050919050565b60006020820190508181036000830152614c16816143db565b9050919050565b60006020820190508181036000830152614c36816143fe565b9050919050565b60006020820190508181036000830152614c5681614421565b9050919050565b60006020820190508181036000830152614c768161448a565b9050919050565b60006020820190508181036000830152614c96816144d0565b9050919050565b60006020820190508181036000830152614cb6816144f3565b9050919050565b60006020820190508181036000830152614cd681614516565b9050919050565b60006020820190508181036000830152614cf68161455c565b9050919050565b60006020820190508181036000830152614d16816145a2565b9050919050565b60006020820190508181036000830152614d36816145c5565b9050919050565b60006020820190508181036000830152614d56816145e8565b9050919050565b60006020820190508181036000830152614d768161462e565b9050919050565b60006020820190508181036000830152614d9681614674565b9050919050565b60006020820190508181036000830152614db681614697565b9050919050565b60006020820190508181036000830152614dd6816146ba565b9050919050565b60006020820190508181036000830152614df681614723565b9050919050565b60006020820190508181036000830152614e1681614746565b9050919050565b60006020820190508181036000830152614e3681614769565b9050919050565b6000602082019050614e52600083018461478c565b92915050565b6000602082019050614e6d600083018461479b565b92915050565b6000614e7d614e8e565b9050614e898282615189565b919050565b6000604051905090565b600067ffffffffffffffff821115614eb357614eb2615336565b5b614ebc82615365565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f2c826150fe565b9150614f37836150fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f6c57614f6b6152a9565b5b828201905092915050565b6000614f82826150fe565b9150614f8d836150fe565b925082614f9d57614f9c6152d8565b5b828204905092915050565b6000614fb3826150fe565b9150614fbe836150fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ff757614ff66152a9565b5b828202905092915050565b600061500d826150d0565b9150615018836150d0565b92508282101561502b5761502a6152a9565b5b828203905092915050565b6000615041826150fe565b915061504c836150fe565b92508282101561505f5761505e6152a9565b5b828203905092915050565b6000615075826150de565b9050919050565b6000615087826150de565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615142578082015181840152602081019050615127565b83811115615151576000848401525b50505050565b6000600282049050600182168061516f57607f821691505b6020821081141561518357615182615307565b5b50919050565b61519282615365565b810181811067ffffffffffffffff821117156151b1576151b0615336565b5b80604052505050565b60006151c5826150d0565b915061ffff8214156151da576151d96152a9565b5b600182019050919050565b60006151f0826150fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615223576152226152a9565b5b600182019050919050565b60006152398261525c565b9050919050565b600061524b8261525c565b9050919050565b6000819050919050565b600061526782615376565b9050919050565b6000819050919050565b6000615283826150fe565b915061528e836150fe565b92508261529e5761529d6152d8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f222c2261747472696275746573223a205b000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f2023000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b202274726169745f74797065223a202254797065222c2276616c7565223a2060008201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53656e646572206973206e6f7420616e206f776e6572206f662063686172616360008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f742072656164792079657400000000000000000000000000000000000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f4368617261637465722070726573616c652068617320616c726561647920656e60008201527f6465640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4368617261637465722070726573616c6520686173206e6f742073746172746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546f6b656e2068617320612077726f6e6720636f6c6f72000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5468652067616d652068617320656e6465642e00000000000000000000000000600082015250565b7f53616c652068617320616c726561647920737461727465640000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a20224574686572446173682069732060008201527f6120706c617920746f206561726e204e46542067616d6520776865726520706c60208201527f617965727320636f6c6c65637420726f636b657420706172747320746f20617360408201527f73656d626c65206120726f636b657420616e642077696e207072697a6573206660608201527f726f6d2074686520636f6d6d756e6974792077616c6c65742e00000000000000608082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f2072656365697665642000000000000000000000000000000000000000000000600082015250565b7f4368617261637465722073616c652068617320616c726561647920656e646564600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f3130206d6178206d696e7473207065722074786e2e0000000000000000000000600082015250565b7f222c2022696d61676555726c223a202200000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7b202274726169745f74797065223a2022436f6c6f72222c2276616c7565223a60008201527f2022000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045746865722073656e7420666f722074686973207460008201527f7800000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f57616c6c657420616c7265616479206d696e746564206120636861726163746560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f546f6b656e2068617320612077726f6e6720747970653a20657870656374656460008201527f2000000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b615ec68161506a565b8114615ed157600080fd5b50565b615edd8161508e565b8114615ee857600080fd5b50565b615ef4816150a4565b8114615eff57600080fd5b50565b615f0b816150fe565b8114615f1657600080fd5b50565b615f2281615108565b8114615f2d57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e0bd84a6c8b5fff7752354e7c744252fefd88e1b3f30cbc9c6d51bf806d44cf964736f6c6343000804003368747470733a2f2f7a706c35356e6f6e6b646273727379636a6d6e36676a6b336c37356b736d736c73743378706e37766b686b7a787373736b6e32612e617277656176652e6e65742f793966657463315177796a4c416b736234795662585f71704d6b755539336533395648566d38705355335168747470733a2f2f6f736e6665676b6e676d6b7064326c34673362627971736e767467617070727434786733776d346975766763756d706a72706d612e617277656176652e6e65742f644a70534755307a465048706644624348454a4e724d7748766a506c7a62737a694b564d4b6a487069396768747470733a2f2f326532746b71326c7534783370627632737634377870676563373363376e7679336a6967346567716b69636c6435366970656a612e617277656176652e6e65742f305455315130756e4c376547757056352d377a45465f597674726a6155473451304649457366664965524968747470733a2f2f356d6c35617566756e70676c7376346e6a337063367273373632617a697767776b376933663771377468713465346a61676a64612e617277656176652e6e65742f36786651554c52727a4c6c586a5537654c305a66396f4755574e5a5830624c2d48356e68776e45674d6b5968747470733a2f2f687177776b787435743265366769716268346a776578786a6178367a766e69717168677664686772636f716e7a3672636e3670712e617277656176652e6e65742f5043316c586e326569654d6941543854596c377042663261745243427a56476330524f6733506f6962353868747470733a2f2f697636676f756532693479377363346f6d78717934347032616d6d726a693473616b7235736f72377134643370773261357536612e617277656176652e6e65742f5258786e554a70484d666b4c6a6d58686a6e483641786b556f3549436f396b36503463487439744137547768747470733a2f2f6862767773346f6d7a637336377767686963626f776a687a36743377643777627275336b61656c6f337a647233697962713336612e617277656176652e6e65742f4f47747063637a4970655f597830434336795435395064685f73474e4e7141526274354848614d4268767768747470733a2f2f616161346b716232726e716c656b75336f63746c75703661697a7467357972347534716c66746f346a356d703664786163666d712e617277656176652e6e65742f414148465144714c594c49716d33436d756a5f41526d5a75346a796e494c4c4e334539595f77376745566b68747470733a2f2f746b797a376e733466366d6832666977706a697635716e667168327335696e6936767a7a796f65736e75636f35786b64633573712e617277656176652e6e65742f6d724766746c77766d483056466e70525873476c676655756f616a31633577346b6d30453774314446325568747470733a2f2f76726d616a696e75626f766137683270616c636433796c70776d7763676e71646479737673626377726533687a746332726869612e617277656176652e6e65742f724667456f62514c71672d6654774c45506546767379776a4e674d654a566b45566f6b32664d786169644168747470733a2f2f68747a6a32377a6f6c6d7a76676e6d77647670346f7966623771366c6e3275666a366669706c6b716f3271346a617264326472612e617277656176652e6e65742f50504b64667935624d314d316c683166783243685f447932366f5650696f6574554861687849496a304f4968747470733a2f2f6366767732706b35366536626a796a626c677036766f6379706a6b7771626968737333686d37696d657a787a7376786d73346d612e617277656176652e6e65742f45577474505633785042546849566d6636726859656c566f42516555746e5a3944435a766d5662736c786768747470733a2f2f756d7075636c71676679326a76367961337171717336717a6f6b683474686873353469787578706f63696e3232637a36796d71612e617277656176652e6e65742f6f7839424c6759754e4a7237414e776843586f5a636f5f4a6e504c7645587064376849627251732d77794168747470733a2f2f786f74716b617a6a6a726973716d6737786561376337326f7779366934736e6d37623777657a78693235737266623576677666612e617277656176652e6e65742f7536634641796c4d5553677733376b423858394f746a794f53617a3466324a6d364e646c456f65314e556f68747470733a2f2f6b736f7579326235736c74646e687136726f7167693277336f6975326275746f786a6c676f67336566796961366c66626c7365712e617277656176652e6e65742f564a314d61443253356a6165486f75675a47726263696d67306d3636566d63625a4334514479796858496b68747470733a2f2f71366a7a347233687373646a7a766376696a6e616268666c68737a7266706c6a6a68326773636d64666570626b7463707a7269612e617277656176652e6e65742f68354f655232655568707a5556554a61414a7972504c4d5376576c4a39476b4a67796b65465578507a464168747470733a2f2f78336464737a686b667537696176736163766a637661716274617870797a346d336f7074333563746576366935773669647575612e617277656176652e6e65742f767359355a4f6f74506f4257514256534b6f49426d4337385a347a626e7a3330557956386a74764948536768747470733a2f2f627978756a32787a376d723664646168326f74786169636f6c337265706c6d68757a66636363637762716f6e35367532666b63712e617277656176652e6e65742f4469394536766e37492d474d42394f6e6343424f58754a487259656d5369454956677763337671614b6f5568747470733a2f2f743262363677686d62366936716e736e75613673707070376a6273373576366a7a746b636c687a617637756473356d366d7978712e617277656176652e6e65742f6e6f5076574f77506b656732546141394a37335f5347582d31386e4d31435766494b5f6f4f5857655a693868747470733a2f2f786564323667787063716535366c376a73636f66356b637032726b63626b366465376e37637a65787036676b336c716e346f6c712e617277656176652e6e65742f755165764775385543643876365a4363587168503146516771384d6e325f466b6c332d4d7261344e34356368747470733a2f2f6e6935636c68656a61353379757a786d716d33756e6271706a6f7a7a636262376976686d37717061673435366735686277686a712e617277656176652e6e65742f616a6f6c6e496b486434706d37494d33526f595053374f524244394654735f42344463373433546873644d

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80636352211e11610102578063aa6a487211610095578063c87b56dd11610064578063c87b56dd146106c2578063d55815f3146106ff578063e985e9c51461073c578063f2fde38b14610779576101e3565b8063aa6a487214610629578063b022001514610645578063b88d4fde14610670578063c3c54fc014610699576101e3565b806395d89b41116100d157806395d89b41146105835780639fcbf141146105ae578063a22cb465146105d7578063a5ba774f14610600576101e3565b80636352211e146104c757806370a0823114610504578063715018a6146105415780638da5cb5b14610558576101e3565b80633f5054251161017a5780634f6ccce7116101495780634f6ccce71461041a5780635350de6c146104575780635b61260914610482578063601dd7d91461049e576101e3565b80633f5054251461037257806342842e0e1461039d5780634d6b8afc146103c65780634dea2b8f146103ef576101e3565b806318160ddd116101b657806318160ddd146102b65780631c8b232d146102e157806323b872dd1461030c5780632f745c5914610335576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613e07565b6107a2565b60405161021c91906149e0565b60405180910390f35b34801561023157600080fd5b5061023a61081c565b60405161024791906149fb565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613e59565b6108ae565b6040516102849190614979565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613da2565b610933565b005b3480156102c257600080fd5b506102cb610a4b565b6040516102d89190614e58565b60405180910390f35b3480156102ed57600080fd5b506102f6610a58565b60405161030391906149e0565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190613c9c565b610a6b565b005b34801561034157600080fd5b5061035c60048036038101906103579190613da2565b610acb565b6040516103699190614e58565b60405180910390f35b34801561037e57600080fd5b50610387610b70565b60405161039491906149e0565b60405180910390f35b3480156103a957600080fd5b506103c460048036038101906103bf9190613c9c565b610b83565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190613f34565b610ba3565b005b3480156103fb57600080fd5b50610404610c9c565b6040516104119190614e58565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190613e59565b610ca2565b60405161044e9190614e58565b60405180910390f35b34801561046357600080fd5b5061046c610d39565b6040516104799190614e58565b60405180910390f35b61049c60048036038101906104979190613f0b565b610d40565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190613dde565b61100c565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613e59565b6110a5565b6040516104fb9190614979565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190613c37565b611157565b6040516105389190614e58565b60405180910390f35b34801561054d57600080fd5b5061055661120f565b005b34801561056457600080fd5b5061056d611297565b60405161057a9190614979565b60405180910390f35b34801561058f57600080fd5b506105986112c1565b6040516105a591906149fb565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613e82565b611353565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613d66565b61147e565b005b34801561060c57600080fd5b5061062760048036038101906106229190613dde565b6115ff565b005b610643600480360381019061063e9190613dde565b61174d565b005b34801561065157600080fd5b5061065a611b2c565b60405161066791906149e0565b60405180910390f35b34801561067c57600080fd5b5061069760048036038101906106929190613ceb565b611b3f565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190613dde565b611ba1565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190613e59565b611c3a565b6040516106f691906149fb565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190613e59565b611e17565b6040516107339190614e3d565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e9190613c60565b611e38565b60405161077091906149e0565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190613c37565b611ecc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610815575061081482611fc4565b5b9050919050565b60606000805461082b90615157565b80601f016020809104026020016040519081016040528092919081815260200182805461085790615157565b80156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b60006108b9826120a6565b6108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef90614c9d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093e826110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690614d7d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ce612112565b73ffffffffffffffffffffffffffffffffffffffff1614806109fd57506109fc816109f7612112565b611e38565b5b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3390614b9d565b60405180910390fd5b610a46838361211a565b505050565b6000600880549050905090565b600a60159054906101000a900460ff1681565b610a7c610a76612112565b826121d3565b610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab290614ddd565b60405180910390fd5b610ac68383836122b1565b505050565b6000610ad683611157565b8210610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e90614a1d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600a60169054906101000a900460ff1681565b610b9e83838360405180602001604052806000815250611b3f565b505050565b600a60169054906101000a900460ff1615610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea90614c1d565b60405180910390fd5b6000600160ff168760ff161415610c0957600290505b600260ff168760ff161415610c1d57600590505b600360ff168760ff161415610c3157600a90505b600460ff168760ff161415610c4557600f90505b600560ff168760ff161415610c5957606490505b610c688688878787878761250d565b600560ff168760ff161415610c93576001600a60166101000a81548160ff0219169083151502179055505b50505050505050565b600f5481565b6000610cac610a4b565b8210610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce490614dfd565b60405180910390fd5b60088281548110610d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b620d2f0081565b600a60169054906101000a900460ff1615610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790614c1d565b60405180910390fd5b600a60159054906101000a900460ff16610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690614e1d565b60405180910390fd5b611770600c5410610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90614dbd565b60405180910390fd5b60008160ff16118015610e3c5750600a8160ff1611155b610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290614cbd565b60405180910390fd5b611770610e968260ff16600c546125e890919063ffffffff16565b1115610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90614d9d565b60405180910390fd5b34610ef58260ff1666b1a2bc2ec500006125fe90919063ffffffff16565b1115610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d90614d3d565b60405180910390fd5b60005b8160ff16811015610f9c5760006001600c54600b54610f589190614f21565b610f629190614f21565b9050610f6e3382612614565b6001600c6000828254610f819190614f21565b92505081905550508080610f94906151e5565b915050610f39565b5060006064601434610fae9190614fa8565b610fb89190614f77565b9050610fc2611297565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611007573d6000803e3d6000fd5b505050565b611014612112565b73ffffffffffffffffffffffffffffffffffffffff16611032611297565b73ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90614cdd565b60405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114590614bfd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf90614bdd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611217612112565b73ffffffffffffffffffffffffffffffffffffffff16611235611297565b73ffffffffffffffffffffffffffffffffffffffff161461128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290614cdd565b60405180910390fd5b6112956000612998565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112d090615157565b80601f01602080910402602001604051908101604052809291908181526020018280546112fc90615157565b80156113495780601f1061131e57610100808354040283529160200191611349565b820191906000526020600020905b81548152906001019060200180831161132c57829003601f168201915b5050505050905090565b600a60169054906101000a900460ff16156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90614c1d565b60405180910390fd5b6113af86600080612a5e565b6113bc8560016000612a5e565b6113c98460026000612a5e565b6113d68360036000612a5e565b6113e38260046000612a5e565b6113f08160056000612a5e565b6113f985612c2d565b61140284612c2d565b61140b83612c2d565b61141482612c2d565b61141d81612c2d565b600060024761142c9190614f77565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611474573d6000803e3d6000fd5b5050505050505050565b611486612112565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90614b1d565b60405180910390fd5b8060056000611501612112565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ae612112565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f391906149e0565b60405180910390a35050565b611607612112565b73ffffffffffffffffffffffffffffffffffffffff16611625611297565b73ffffffffffffffffffffffffffffffffffffffff161461167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290614cdd565b60405180910390fd5b801561168d5742600f8190555061174a565b620d2f00600f5461169e9190614f21565b4210156116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790614abd565b60405180910390fd5b6001600a60166101000a81548160ff021916908315150217905550611703611297565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611748573d6000803e3d6000fd5b505b50565b600a60169054906101000a900460ff161561179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490614c1d565b60405180910390fd5b801561188d57600a60149054906101000a900460ff166117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990614b3d565b60405180910390fd5b600a60159054906101000a900460ff1615611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990614c3d565b60405180910390fd5b6103e8600b5410611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90614add565b60405180910390fd5b61196d565b600a60159054906101000a900460ff166118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d390614e1d565b60405180910390fd5b6107d0600b5410611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614c7d565b60405180910390fd5b346658d15e17628000111561196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390614d3d565b60405180910390fd5b5b605460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190614d5d565b60405180910390fd5b60006001600c54600b54611a0e9190614f21565b611a189190614f21565b9050611a25600080612d3e565b6053600083815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550611a5c3382612d59565b6001600b6000828254611a6f9190614f21565b925050819055506001605460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081611b28576000349050611ae0611297565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611b25573d6000803e3d6000fd5b50505b5050565b600a60149054906101000a900460ff1681565b611b50611b4a612112565b836121d3565b611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690614ddd565b60405180910390fd5b611b9b84848484612d77565b50505050565b611ba9612112565b73ffffffffffffffffffffffffffffffffffffffff16611bc7611297565b73ffffffffffffffffffffffffffffffffffffffff1614611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490614cdd565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6060611c45826120a6565b611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90614d1d565b60405180910390fd5b600080611cb16053600086815260200190815260200160002060009054906101000a900461ffff16612dd3565b91509150611def600060ff168260ff1614611d01576040518060400160405280600b81526020017f526f636b65742050617274000000000000000000000000000000000000000000815250611d38565b6040518060400160405280600981526020017f43686172616374657200000000000000000000000000000000000000000000008152505b611d4186612dec565b60108460ff1660088110611d7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600802018560ff1660088110611dbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01611dc88587612f99565b604051602001611ddb949392919061483e565b6040516020818303038152906040526130ce565b604051602001611dff91906148be565b60405160208183030381529060405292505050919050565b60536020528060005260406000206000915054906101000a900461ffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ed4612112565b73ffffffffffffffffffffffffffffffffffffffff16611ef2611297565b73ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f90614cdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf90614a5d565b60405180910390fd5b611fc181612998565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061208f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061209f575061209e8261326d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661218d836110a5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121de826120a6565b61221d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221490614b5d565b60405180910390fd5b6000612228836110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061229757508373ffffffffffffffffffffffffffffffffffffffff1661227f846108ae565b73ffffffffffffffffffffffffffffffffffffffff16145b806122a857506122a78185611e38565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122d1826110a5565b73ffffffffffffffffffffffffffffffffffffffff1614612327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231e90614cfd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90614afd565b60405180910390fd5b6123a28383836132d7565b6123ad60008261211a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123fd9190615036565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124549190614f21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61251987600080612a5e565b61252585876001612a5e565b61253184876002612a5e565b61253d83876003612a5e565b61254982876004612a5e565b61255285612c2d565b61255b84612c2d565b61256483612c2d565b61256d82612c2d565b6000612595606461258784476125fe90919063ffffffff16565b6133eb90919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156125dd573d6000803e3d6000fd5b505050505050505050565b600081836125f69190614f21565b905092915050565b6000818361260c9190614fa8565b905092915050565b6000600c546117706126269190615036565b600c546117706126369190615036565b6001436126439190615036565b4041443360405160200161265b95949392919061491a565b6040516020818303038152906040528051906020012060001c61267e9190615278565b905060005b60148161ffff1610156129915760006052600060508461ffff16601481106126d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900461ffff1661ffff161180156127a75750816052600060508461ffff1660148110612762577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900461ffff1661ffff16115b156128ec5760508161ffff16601481106127ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff166053600085815260200190815260200160002060006101000a81548161ffff021916908361ffff16021790555060016052600060508461ffff1660148110612875577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060008282829054906101000a900461ffff166128c19190615002565b92506101000a81548161ffff021916908361ffff1602179055506128e58484612d59565b5050612994565b6052600060508361ffff166014811061292e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900461ffff1661ffff168261297c9190615036565b91508080612989906151ba565b915050612683565b50505b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a67836120a6565b612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90614bbd565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16612ac6846110a5565b73ffffffffffffffffffffffffffffffffffffffff1614612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390614a9d565b60405180910390fd5b600080612b496053600087815260200190815260200160002060009054906101000a900461ffff16612dd3565b915091508360ff168160ff1614612b628560ff16612dec565b612b6e8360ff16612dec565b604051602001612b7f9291906148e0565b60405160208183030381529060405290612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc691906149fb565b60405180910390fd5b5060008360ff161480612be757508260ff168260ff16145b612c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1d90614b7d565b60405180910390fd5b5050505050565b6000612c38826110a5565b9050612c46816000846132d7565b612c5160008361211a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca19190615036565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008160ff1660088460ff1661ffff16901b17905092915050565b612d73828260405180602001604052806000815250613401565b5050565b612d828484846122b1565b612d8e8484848461345c565b612dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc490614a3d565b60405180910390fd5b50505050565b60008060088361ffff16901c60ff841691509150915091565b60606000821415612e34576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f94565b600082905060005b60008214612e66578080612e4f906151e5565b915050600a82612e5f9190614f77565b9150612e3c565b60008167ffffffffffffffff811115612ea8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612eda5781602001600182028036833780820191505090505b5090505b60008514612f8d57600182612ef39190615036565b9150600a85612f029190615278565b6030612f0e9190614f21565b60f81b818381518110612f4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f869190614f77565b9450612ede565b8093505050505b919050565b6060600060ff168360ff16141561301757600e8360ff1681548110612fe7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040516020016130019190614811565b60405160208183030381529060405290506130c8565b600e8360ff1681548110613054577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600d8360ff168154811061309b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040516020016130b69291906147c1565b60405160208183030381529060405290505b92915050565b60606000825114156130f157604051806020016040528060008152509050613268565b6000604051806060016040528060408152602001615f3160409139905060006003600285516131209190614f21565b61312a9190614f77565b60046131369190614fa8565b905060006020826131479190614f21565b67ffffffffffffffff811115613186577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131b85781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015613227576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506131cc565b60038951066001811461324157600281146132515761325c565b613d3d60f01b600283035261325c565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132e28383836135f3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561332557613320816135f8565b613364565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613363576133628382613641565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133a7576133a2816137ae565b6133e6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133e5576133e482826138f1565b5b5b505050565b600081836133f99190614f77565b905092915050565b61340b8383613970565b613418600084848461345c565b613457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344e90614a3d565b60405180910390fd5b505050565b600061347d8473ffffffffffffffffffffffffffffffffffffffff16613b3e565b156135e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134a6612112565b8786866040518563ffffffff1660e01b81526004016134c89493929190614994565b602060405180830381600087803b1580156134e257600080fd5b505af192505050801561351357506040513d601f19601f820116820180604052508101906135109190613e30565b60015b613596573d8060008114613543576040519150601f19603f3d011682016040523d82523d6000602084013e613548565b606091505b5060008151141561358e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358590614a3d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135eb565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161364e84611157565b6136589190615036565b905060006007600084815260200190815260200160002054905081811461373d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137c29190615036565b9050600060096000848152602001908152602001600020549050600060088381548110613818577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613860577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006138fc83611157565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d790614c5d565b60405180910390fd5b6139e9816120a6565b15613a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2090614a7d565b60405180910390fd5b613a35600083836132d7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a859190614f21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000613b64613b5f84614e98565b614e73565b905082815260208101848484011115613b7c57600080fd5b613b87848285615115565b509392505050565b600081359050613b9e81615ebd565b92915050565b600081359050613bb381615ed4565b92915050565b600081359050613bc881615eeb565b92915050565b600081519050613bdd81615eeb565b92915050565b600082601f830112613bf457600080fd5b8135613c04848260208601613b51565b91505092915050565b600081359050613c1c81615f02565b92915050565b600081359050613c3181615f19565b92915050565b600060208284031215613c4957600080fd5b6000613c5784828501613b8f565b91505092915050565b60008060408385031215613c7357600080fd5b6000613c8185828601613b8f565b9250506020613c9285828601613b8f565b9150509250929050565b600080600060608486031215613cb157600080fd5b6000613cbf86828701613b8f565b9350506020613cd086828701613b8f565b9250506040613ce186828701613c0d565b9150509250925092565b60008060008060808587031215613d0157600080fd5b6000613d0f87828801613b8f565b9450506020613d2087828801613b8f565b9350506040613d3187828801613c0d565b925050606085013567ffffffffffffffff811115613d4e57600080fd5b613d5a87828801613be3565b91505092959194509250565b60008060408385031215613d7957600080fd5b6000613d8785828601613b8f565b9250506020613d9885828601613ba4565b9150509250929050565b60008060408385031215613db557600080fd5b6000613dc385828601613b8f565b9250506020613dd485828601613c0d565b9150509250929050565b600060208284031215613df057600080fd5b6000613dfe84828501613ba4565b91505092915050565b600060208284031215613e1957600080fd5b6000613e2784828501613bb9565b91505092915050565b600060208284031215613e4257600080fd5b6000613e5084828501613bce565b91505092915050565b600060208284031215613e6b57600080fd5b6000613e7984828501613c0d565b91505092915050565b60008060008060008060c08789031215613e9b57600080fd5b6000613ea989828a01613c0d565b9650506020613eba89828a01613c0d565b9550506040613ecb89828a01613c0d565b9450506060613edc89828a01613c0d565b9350506080613eed89828a01613c0d565b92505060a0613efe89828a01613c0d565b9150509295509295509295565b600060208284031215613f1d57600080fd5b6000613f2b84828501613c22565b91505092915050565b60008060008060008060c08789031215613f4d57600080fd5b6000613f5b89828a01613c22565b9650506020613f6c89828a01613c0d565b9550506040613f7d89828a01613c0d565b9450506060613f8e89828a01613c0d565b9350506080613f9f89828a01613c0d565b92505060a0613fb089828a01613c0d565b9150509295509295509295565b613fce613fc98261507c565b615240565b82525050565b613fdd8161506a565b82525050565b613ff4613fef8261506a565b61522e565b82525050565b6140038161508e565b82525050565b61401a6140158261509a565b615252565b82525050565b600061402b82614ede565b6140358185614ef4565b9350614045818560208601615124565b61404e81615365565b840191505092915050565b600061406482614ee9565b61406e8185614f05565b935061407e818560208601615124565b61408781615365565b840191505092915050565b600061409d82614ee9565b6140a78185614f16565b93506140b7818560208601615124565b80840191505092915050565b600081546140d081615157565b6140da8186614f16565b945060018216600081146140f5576001811461410657614139565b60ff19831686528186019350614139565b61410f85614ec9565b60005b8381101561413157815481890152600182019150602081019050614112565b838801955050505b50505092915050565b600061414f601183614f16565b915061415a82615383565b601182019050919050565b6000614172602b83614f05565b915061417d826153ac565b604082019050919050565b6000614195603283614f05565b91506141a0826153fb565b604082019050919050565b60006141b8600283614f16565b91506141c38261544a565b600282019050919050565b60006141db602183614f16565b91506141e682615473565b602182019050919050565b60006141fe602683614f05565b9150614209826154c2565b604082019050919050565b6000614221601c83614f05565b915061422c82615511565b602082019050919050565b6000614244602383614f05565b915061424f8261553a565b604082019050919050565b6000614267600d83614f05565b915061427282615589565b602082019050919050565b600061428a600383614f16565b9150614295826155b2565b600382019050919050565b60006142ad602383614f05565b91506142b8826155db565b604082019050919050565b60006142d0602483614f05565b91506142db8261562a565b604082019050919050565b60006142f3601983614f05565b91506142fe82615679565b602082019050919050565b6000614316602183614f05565b9150614321826156a2565b604082019050919050565b6000614339602c83614f05565b9150614344826156f1565b604082019050919050565b600061435c601783614f05565b915061436782615740565b602082019050919050565b600061437f603883614f05565b915061438a82615769565b604082019050919050565b60006143a2601183614f05565b91506143ad826157b8565b602082019050919050565b60006143c5602a83614f05565b91506143d0826157e1565b604082019050919050565b60006143e8602983614f05565b91506143f382615830565b604082019050919050565b600061440b601383614f05565b91506144168261587f565b602082019050919050565b600061442e601883614f05565b9150614439826158a8565b602082019050919050565b6000614451600283614f16565b915061445c826158d1565b600282019050919050565b6000614474609983614f16565b915061447f826158fa565b609982019050919050565b6000614497602083614f05565b91506144a2826159bb565b602082019050919050565b60006144ba600a83614f16565b91506144c5826159e4565b600a82019050919050565b60006144dd602083614f05565b91506144e882615a0d565b602082019050919050565b6000614500602c83614f05565b915061450b82615a36565b604082019050919050565b6000614523601583614f05565b915061452e82615a85565b602082019050919050565b6000614546601083614f16565b915061455182615aae565b601082019050919050565b6000614569602083614f05565b915061457482615ad7565b602082019050919050565b600061458c602283614f16565b915061459782615b00565b602282019050919050565b60006145af602983614f05565b91506145ba82615b4f565b604082019050919050565b60006145d2602f83614f05565b91506145dd82615b9e565b604082019050919050565b60006145f5602183614f05565b915061460082615bed565b604082019050919050565b6000614618600a83614f16565b915061462382615c3c565b600a82019050919050565b600061463b602183614f05565b915061464682615c65565b604082019050919050565b600061465e600283614f16565b915061466982615cb4565b600282019050919050565b6000614681602183614f05565b915061468c82615cdd565b604082019050919050565b60006146a4601683614f05565b91506146af82615d2c565b602082019050919050565b60006146c7601683614f05565b91506146d282615d55565b602082019050919050565b60006146ea601d83614f16565b91506146f582615d7e565b601d82019050919050565b600061470d602183614f16565b915061471882615da7565b602182019050919050565b6000614730603183614f05565b915061473b82615df6565b604082019050919050565b6000614753602c83614f05565b915061475e82615e45565b604082019050919050565b6000614776601483614f05565b915061478182615e94565b602082019050919050565b614795816150d0565b82525050565b6147a4816150fe565b82525050565b6147bb6147b6826150fe565b61526e565b82525050565b60006147cc826141ce565b91506147d882856140c3565b91506147e38261427d565b91506147ee8261457f565b91506147fa82846140c3565b915061480582614444565b91508190509392505050565b600061481c826141ce565b915061482882846140c3565b915061483382614444565b915081905092915050565b60006148498261460b565b91506148558287614092565b9150614860826141ab565b915061486c8286614092565b915061487782614467565b915061488282614539565b915061488e82856140c3565b915061489982614142565b91506148a58284614092565b91506148b082614651565b915081905095945050505050565b60006148c9826146dd565b91506148d58284614092565b915081905092915050565b60006148eb82614700565b91506148f78285614092565b9150614902826144ad565b915061490e8284614092565b91508190509392505050565b600061492682886147aa565b6020820191506149368287614009565b6020820191506149468286613fbd565b60148201915061495682856147aa565b6020820191506149668284613fe3565b6014820191508190509695505050505050565b600060208201905061498e6000830184613fd4565b92915050565b60006080820190506149a96000830187613fd4565b6149b66020830186613fd4565b6149c3604083018561479b565b81810360608301526149d58184614020565b905095945050505050565b60006020820190506149f56000830184613ffa565b92915050565b60006020820190508181036000830152614a158184614059565b905092915050565b60006020820190508181036000830152614a3681614165565b9050919050565b60006020820190508181036000830152614a5681614188565b9050919050565b60006020820190508181036000830152614a76816141f1565b9050919050565b60006020820190508181036000830152614a9681614214565b9050919050565b60006020820190508181036000830152614ab681614237565b9050919050565b60006020820190508181036000830152614ad68161425a565b9050919050565b60006020820190508181036000830152614af6816142a0565b9050919050565b60006020820190508181036000830152614b16816142c3565b9050919050565b60006020820190508181036000830152614b36816142e6565b9050919050565b60006020820190508181036000830152614b5681614309565b9050919050565b60006020820190508181036000830152614b768161432c565b9050919050565b60006020820190508181036000830152614b968161434f565b9050919050565b60006020820190508181036000830152614bb681614372565b9050919050565b60006020820190508181036000830152614bd681614395565b9050919050565b60006020820190508181036000830152614bf6816143b8565b9050919050565b60006020820190508181036000830152614c16816143db565b9050919050565b60006020820190508181036000830152614c36816143fe565b9050919050565b60006020820190508181036000830152614c5681614421565b9050919050565b60006020820190508181036000830152614c768161448a565b9050919050565b60006020820190508181036000830152614c96816144d0565b9050919050565b60006020820190508181036000830152614cb6816144f3565b9050919050565b60006020820190508181036000830152614cd681614516565b9050919050565b60006020820190508181036000830152614cf68161455c565b9050919050565b60006020820190508181036000830152614d16816145a2565b9050919050565b60006020820190508181036000830152614d36816145c5565b9050919050565b60006020820190508181036000830152614d56816145e8565b9050919050565b60006020820190508181036000830152614d768161462e565b9050919050565b60006020820190508181036000830152614d9681614674565b9050919050565b60006020820190508181036000830152614db681614697565b9050919050565b60006020820190508181036000830152614dd6816146ba565b9050919050565b60006020820190508181036000830152614df681614723565b9050919050565b60006020820190508181036000830152614e1681614746565b9050919050565b60006020820190508181036000830152614e3681614769565b9050919050565b6000602082019050614e52600083018461478c565b92915050565b6000602082019050614e6d600083018461479b565b92915050565b6000614e7d614e8e565b9050614e898282615189565b919050565b6000604051905090565b600067ffffffffffffffff821115614eb357614eb2615336565b5b614ebc82615365565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f2c826150fe565b9150614f37836150fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f6c57614f6b6152a9565b5b828201905092915050565b6000614f82826150fe565b9150614f8d836150fe565b925082614f9d57614f9c6152d8565b5b828204905092915050565b6000614fb3826150fe565b9150614fbe836150fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ff757614ff66152a9565b5b828202905092915050565b600061500d826150d0565b9150615018836150d0565b92508282101561502b5761502a6152a9565b5b828203905092915050565b6000615041826150fe565b915061504c836150fe565b92508282101561505f5761505e6152a9565b5b828203905092915050565b6000615075826150de565b9050919050565b6000615087826150de565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615142578082015181840152602081019050615127565b83811115615151576000848401525b50505050565b6000600282049050600182168061516f57607f821691505b6020821081141561518357615182615307565b5b50919050565b61519282615365565b810181811067ffffffffffffffff821117156151b1576151b0615336565b5b80604052505050565b60006151c5826150d0565b915061ffff8214156151da576151d96152a9565b5b600182019050919050565b60006151f0826150fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615223576152226152a9565b5b600182019050919050565b60006152398261525c565b9050919050565b600061524b8261525c565b9050919050565b6000819050919050565b600061526782615376565b9050919050565b6000819050919050565b6000615283826150fe565b915061528e836150fe565b92508261529e5761529d6152d8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f222c2261747472696275746573223a205b000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f2023000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b202274726169745f74797065223a202254797065222c2276616c7565223a2060008201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53656e646572206973206e6f7420616e206f776e6572206f662063686172616360008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f742072656164792079657400000000000000000000000000000000000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f4368617261637465722070726573616c652068617320616c726561647920656e60008201527f6465640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4368617261637465722070726573616c6520686173206e6f742073746172746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546f6b656e2068617320612077726f6e6720636f6c6f72000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5468652067616d652068617320656e6465642e00000000000000000000000000600082015250565b7f53616c652068617320616c726561647920737461727465640000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a20224574686572446173682069732060008201527f6120706c617920746f206561726e204e46542067616d6520776865726520706c60208201527f617965727320636f6c6c65637420726f636b657420706172747320746f20617360408201527f73656d626c65206120726f636b657420616e642077696e207072697a6573206660608201527f726f6d2074686520636f6d6d756e6974792077616c6c65742e00000000000000608082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f2072656365697665642000000000000000000000000000000000000000000000600082015250565b7f4368617261637465722073616c652068617320616c726561647920656e646564600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f3130206d6178206d696e7473207065722074786e2e0000000000000000000000600082015250565b7f222c2022696d61676555726c223a202200000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7b202274726169745f74797065223a2022436f6c6f72222c2276616c7565223a60008201527f2022000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045746865722073656e7420666f722074686973207460008201527f7800000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f57616c6c657420616c7265616479206d696e746564206120636861726163746560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f546f6b656e2068617320612077726f6e6720747970653a20657870656374656460008201527f2000000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b615ec68161506a565b8114615ed157600080fd5b50565b615edd8161508e565b8114615ee857600080fd5b50565b615ef4816150a4565b8114615eff57600080fd5b50565b615f0b816150fe565b8114615f1657600080fd5b50565b615f2281615108565b8114615f2d57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e0bd84a6c8b5fff7752354e7c744252fefd88e1b3f30cbc9c6d51bf806d44cf964736f6c63430008040033

Deployed Bytecode Sourcemap

55289:15536:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44107:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28712:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30271:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29794:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44747:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55484:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31161:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44415:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55525:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31571:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67584:804;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56594:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44937:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56547:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63293:965;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64266:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28406:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28136:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41545:94;;;;;;;;;;;;;:::i;:::-;;40894:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28881:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66845:727;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30564:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66497:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62000:1285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55440:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31827:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64376:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64502:1218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56743:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30930:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41794:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44107:224;44209:4;44248:35;44233:50;;;:11;:50;;;;:90;;;;44287:36;44311:11;44287:23;:36::i;:::-;44233:90;44226:97;;44107:224;;;:::o;28712:100::-;28766:13;28799:5;28792:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28712:100;:::o;30271:221::-;30347:7;30375:16;30383:7;30375;:16::i;:::-;30367:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30460:15;:24;30476:7;30460:24;;;;;;;;;;;;;;;;;;;;;30453:31;;30271:221;;;:::o;29794:411::-;29875:13;29891:23;29906:7;29891:14;:23::i;:::-;29875:39;;29939:5;29933:11;;:2;:11;;;;29925:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30033:5;30017:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30042:37;30059:5;30066:12;:10;:12::i;:::-;30042:16;:37::i;:::-;30017:62;29995:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30176:21;30185:2;30189:7;30176:8;:21::i;:::-;29794:411;;;:::o;44747:113::-;44808:7;44835:10;:17;;;;44828:24;;44747:113;:::o;55484:34::-;;;;;;;;;;;;;:::o;31161:339::-;31356:41;31375:12;:10;:12::i;:::-;31389:7;31356:18;:41::i;:::-;31348:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31464:28;31474:4;31480:2;31484:7;31464:9;:28::i;:::-;31161:339;;;:::o;44415:256::-;44512:7;44548:23;44565:5;44548:16;:23::i;:::-;44540:5;:31;44532:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44637:12;:19;44650:5;44637:19;;;;;;;;;;;;;;;:26;44657:5;44637:26;;;;;;;;;;;;44630:33;;44415:256;;;;:::o;55525:32::-;;;;;;;;;;;;;:::o;31571:185::-;31709:39;31726:4;31732:2;31736:7;31709:39;;;;;;;;;;;;:16;:39::i;:::-;31571:185;;;:::o;67584:804::-;70766:12;;;;;;;;;;;70765:13;70757:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;67765:21:::1;56246:1;67804:22;;:8;:22;;;67801:71;;;67859:1;67843:17;;67801:71;56280:1;67885:20;;:8;:20;;;67882:69;;;67938:1;67922:17;;67882:69;56311:1;67964:17;;:8;:17;;;67961:67;;;68014:2;67998:18;;67961:67;56343:1;68041:18;;:8;:18;;;68038:68;;;68092:2;68076:18;;68038:68;56373:1;68119:16;;:8;:16;;;68116:67;;;68168:3;68152:19;;68116:67;68193:110;68215:11;68228:8;68238:10;68250:11;68263:10;68275:12;68289:13;68193:21;:110::i;:::-;56373:1;68317:16;;:8;:16;;;68314:67;;;68365:4;68350:12;;:19;;;;;;;;;;;;;;;;;;68314:67;70813:1;67584:804:::0;;;;;;:::o;56594:25::-;;;;:::o;44937:233::-;45012:7;45048:30;:28;:30::i;:::-;45040:5;:38;45032:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45145:10;45156:5;45145:17;;;;;;;;;;;;;;;;;;;;;;;;45138:24;;44937:233;;;:::o;56547:40::-;56581:6;56547:40;:::o;63293:965::-;70766:12;;;;;;;;;;;70765:13;70757:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;63387:14:::1;;;;;;;;;;;63379:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;55757:4;63445:17;;:31;63437:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63553:1;63536:14;:18;;;:42;;;;;63576:2;63558:14;:20;;;;63536:42;63514:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;55757:4;63660:37;63682:14;63660:37;;:17;;:21;;:37;;;;:::i;:::-;:52;;63638:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;63834:9;63795:35;63815:14;63795:35;;55855:10;63795:19;;:35;;;;:::i;:::-;:48;;63773:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;63922:9;63917:227;63941:14;63937:18;;:1;:18;63917:227;;;63977:17;64036:1;64016:17;;63997:16;;:36;;;;:::i;:::-;:40;;;;:::i;:::-;63977:60;;64052:43;64073:10;64085:9;64052:20;:43::i;:::-;64131:1;64110:17;;:22;;;;;;;:::i;:::-;;;;;;;;63917:227;63957:3;;;;;:::i;:::-;;;;63917:227;;;;64168:13;64201:3;64196:2;64184:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;64168:36;;64223:7;:5;:7::i;:::-;64215:25;;:35;64241:8;64215:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70813:1;63293:965:::0;:::o;64266:102::-;41125:12;:10;:12::i;:::-;41114:23;;:7;:5;:7::i;:::-;:23;;;41106:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64349:11:::1;64332:14;;:28;;;;;;;;;;;;;;;;;;64266:102:::0;:::o;28406:239::-;28478:7;28498:13;28514:7;:16;28522:7;28514:16;;;;;;;;;;;;;;;;;;;;;28498:32;;28566:1;28549:19;;:5;:19;;;;28541:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28632:5;28625:12;;;28406:239;;;:::o;28136:208::-;28208:7;28253:1;28236:19;;:5;:19;;;;28228:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28320:9;:16;28330:5;28320:16;;;;;;;;;;;;;;;;28313:23;;28136:208;;;:::o;41545:94::-;41125:12;:10;:12::i;:::-;41114:23;;:7;:5;:7::i;:::-;:23;;;41106:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41610:21:::1;41628:1;41610:9;:21::i;:::-;41545:94::o:0;40894:87::-;40940:7;40967:6;;;;;;;;;;;40960:13;;40894:87;:::o;28881:104::-;28937:13;28970:7;28963:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28881:104;:::o;66845:727::-;70766:12;;;;;;;;;;;70765:13;70757:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;67022:43:::1;67039:11;56210:1;67063::::0;67022:16:::1;:43::i;:::-;67076:45;67093:12;56246:1;67119;67076:16;:45::i;:::-;67132:41;67149:10;56280:1;67171;67132:16;:41::i;:::-;67184:35;67201:7;56311:1;67217;67184:16;:35::i;:::-;67230:37;67247:8;56343:1;67265;67230:16;:37::i;:::-;67278:33;67295:6;56373:1;67309;67278:16;:33::i;:::-;67324:19;67330:12;67324:5;:19::i;:::-;67354:17;67360:10;67354:5;:17::i;:::-;67382:14;67388:7;67382:5;:14::i;:::-;67407:15;67413:8;67407:5;:15::i;:::-;67433:13;67439:6;67433:5;:13::i;:::-;67467:17;67511:1;67487:21;:25;;;;:::i;:::-;67467:45;;67533:10;67525:28;;:39;67554:9;67525:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70813:1;66845:727:::0;;;;;;:::o;30564:295::-;30679:12;:10;:12::i;:::-;30667:24;;:8;:24;;;;30659:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30779:8;30734:18;:32;30753:12;:10;:12::i;:::-;30734:32;;;;;;;;;;;;;;;:42;30767:8;30734:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30832:8;30803:48;;30818:12;:10;:12::i;:::-;30803:48;;;30842:8;30803:48;;;;;;:::i;:::-;;;;;;;;30564:295;;:::o;66497:340::-;41125:12;:10;:12::i;:::-;41114:23;;:7;:5;:7::i;:::-;:23;;;41106:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66566:11:::1;66563:267;;;66607:15;66594:10;:28;;;;66563:267;;;56581:6;66682:10;;:20;;;;:::i;:::-;66663:15;:39;;66655:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;66751:4;66736:12;;:19;;;;;;;;;;;;;;;;;;66778:7;:5;:7::i;:::-;66770:25;;:48;66796:21;66770:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66563:267;66497:340:::0;:::o;62000:1285::-;70766:12;;;;;;;;;;;70765:13;70757:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;62079:7:::1;62076:672;;;62111:17;;;;;;;;;;;62103:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;62190:14;;;;;;;;;;;62189:15;62181:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55715:4;62274:16;;:36;62248:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;62076:672;;;62422:14;;;;;;;;;;;62414:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;55667:4;62502:16;;:29;62476:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;62658:9;55802:11;62640:27;;62614:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;62076:672;62781:16;:28;62798:10;62781:28;;;;;;;;;;;;;;;;;;;;;;;;;62780:29;62758:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;62881:17;62940:1;62920:17;;62901:16;;:36;;;;:::i;:::-;:40;;;;:::i;:::-;62881:60;;62994:27;55902:1;56210::::0;62994:4:::1;:27::i;:::-;62962:18;:29;62981:9;62962:29;;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;63032:32;63042:10;63054:9;63032;:32::i;:::-;63095:1;63075:16;;:21;;;;;;;:::i;:::-;;;;;;;;63146:4;63115:16;:28;63132:10;63115:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;63167:7;63163:115;;63191:13;63207:9;63191:25;;63239:7;:5;:7::i;:::-;63231:25;;:35;63257:8;63231:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;63163:115;;70813:1;62000:1285:::0;:::o;55440:37::-;;;;;;;;;;;;;:::o;31827:328::-;32002:41;32021:12;:10;:12::i;:::-;32035:7;32002:18;:41::i;:::-;31994:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32108:39;32122:4;32128:2;32132:7;32141:5;32108:13;:39::i;:::-;31827:328;;;;:::o;64376:114::-;41125:12;:10;:12::i;:::-;41114:23;;:7;:5;:7::i;:::-;:23;;;41106:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64468:14:::1;64448:17;;:34;;;;;;;;;;;;;;;;;;64376:114:::0;:::o;64502:1218::-;64575:13;64609:16;64617:7;64609;:16::i;:::-;64601:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64691:11;64704:15;64723:35;64730:18;:27;64749:7;64730:27;;;;;;;;;;;;;;;;;;;;;64723:6;:35::i;:::-;64690:68;;;;64908:770;56210:1;65038:22;;:9;:22;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65157:18;:7;:16;:18::i;:::-;65442:9;65452;65442:20;;;;;;;;;;;;;;;;;;;;65463:5;65442:27;;;;;;;;;;;;;;;;;;65550:33;65566:9;65577:5;65550:15;:33::i;:::-;64947:698;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64908:768;:770::i;:::-;64815:882;;;;;;;;:::i;:::-;;;;;;;;;;;;;64770:942;;;;64502:1218;;;:::o;56743:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;30930:164::-;31027:4;31051:18;:25;31070:5;31051:25;;;;;;;;;;;;;;;:35;31077:8;31051:35;;;;;;;;;;;;;;;;;;;;;;;;;31044:42;;30930:164;;;;:::o;41794:192::-;41125:12;:10;:12::i;:::-;41114:23;;:7;:5;:7::i;:::-;:23;;;41106:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41903:1:::1;41883:22;;:8;:22;;;;41875:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41959:19;41969:8;41959:9;:19::i;:::-;41794:192:::0;:::o;27767:305::-;27869:4;27921:25;27906:40;;;:11;:40;;;;:105;;;;27978:33;27963:48;;;:11;:48;;;;27906:105;:158;;;;28028:36;28052:11;28028:23;:36::i;:::-;27906:158;27886:178;;27767:305;;;:::o;33665:127::-;33730:4;33782:1;33754:30;;:7;:16;33762:7;33754:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33747:37;;33665:127;;;:::o;25247:98::-;25300:7;25327:10;25320:17;;25247:98;:::o;37647:174::-;37749:2;37722:15;:24;37738:7;37722:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37805:7;37801:2;37767:46;;37776:23;37791:7;37776:14;:23::i;:::-;37767:46;;;;;;;;;;;;37647:174;;:::o;33959:348::-;34052:4;34077:16;34085:7;34077;:16::i;:::-;34069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34153:13;34169:23;34184:7;34169:14;:23::i;:::-;34153:39;;34222:5;34211:16;;:7;:16;;;:51;;;;34255:7;34231:31;;:20;34243:7;34231:11;:20::i;:::-;:31;;;34211:51;:87;;;;34266:32;34283:5;34290:7;34266:16;:32::i;:::-;34211:87;34203:96;;;33959:348;;;;:::o;36951:578::-;37110:4;37083:31;;:23;37098:7;37083:14;:23::i;:::-;:31;;;37075:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37193:1;37179:16;;:2;:16;;;;37171:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37249:39;37270:4;37276:2;37280:7;37249:20;:39::i;:::-;37353:29;37370:1;37374:7;37353:8;:29::i;:::-;37414:1;37395:9;:15;37405:4;37395:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37443:1;37426:9;:13;37436:2;37426:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37474:2;37455:7;:16;37463:7;37455:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37513:7;37509:2;37494:27;;37503:4;37494:27;;;;;;;;;;;;36951:578;;;:::o;68398:743::-;68588:43;68605:11;56210:1;68629;68588:16;:43::i;:::-;68644:49;68661:10;68673:8;55937:1;68644:16;:49::i;:::-;68704:51;68721:11;68734:8;55973:1;68704:16;:51::i;:::-;68766:49;68783:10;68795:8;56008:1;68766:16;:49::i;:::-;68826:53;68843:12;68857:8;56045:1;68826:16;:53::i;:::-;68892:17;68898:10;68892:5;:17::i;:::-;68920:18;68926:11;68920:5;:18::i;:::-;68949:17;68955:10;68949:5;:17::i;:::-;68977:19;68983:12;68977:5;:19::i;:::-;69017:17;69037:46;69079:3;69037:37;69063:10;69037:21;:25;;:37;;;;:::i;:::-;:41;;:46;;;;:::i;:::-;69017:66;;69102:10;69094:28;;:39;69123:9;69094:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68398:743;;;;;;;;:::o;4971:98::-;5029:7;5060:1;5056;:5;;;;:::i;:::-;5049:12;;4971:98;;;;:::o;5709:::-;5767:7;5798:1;5794;:5;;;;:::i;:::-;5787:12;;5709:98;;;;:::o;69740:976::-;69825:20;70190:17;;55757:4;70176:31;;;;:::i;:::-;69951:17;;55757:4;69937:31;;;;:::i;:::-;70016:1;70001:12;:16;;;;:::i;:::-;69991:27;70041:14;70078:16;70117:10;69898:248;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69870:291;;;;;;69848:324;;:360;;;;:::i;:::-;69825:383;;70225:8;70221:488;70243:23;70239:1;:27;;;70221:488;;;70332:1;70291:17;:38;70309:16;70326:1;70309:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70291:38;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;:99;;;;;70378:12;70337:17;:38;70355:16;70372:1;70355:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70337:38;;;;;;;;;;;;;;;;;;;;;;;;;:53;;;70291:99;70288:341;;;70459:16;70476:1;70459:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70429:18;:27;70448:7;70429:27;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;70539:1;70497:17;:38;70515:16;70532:1;70515:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70497:38;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;70559:29;70569:9;70580:7;70559:9;:29::i;:::-;70607:7;;;;70288:341;70659:17;:38;70677:16;70694:1;70677:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70659:38;;;;;;;;;;;;;;;;;;;;;;;;;70643:54;;;;;;;:::i;:::-;;;70268:3;;;;;:::i;:::-;;;;70221:488;;;;69740:976;;;;:::o;41994:173::-;42050:16;42069:6;;;;;;;;;;;42050:25;;42095:8;42086:6;;:17;;;;;;;;;;;;;;;;;;42150:8;42119:40;;42140:8;42119:40;;;;;;;;;;;;41994:173;;:::o;69149:583::-;69253:16;69261:7;69253;:16::i;:::-;69245:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;69330:10;69310:30;;:16;69318:7;69310;:16::i;:::-;:30;;;69302:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;69392:16;69410:15;69429:35;69436:18;:27;69455:7;69436:27;;;;;;;;;;;;;;;;;;;;;69429:6;:35::i;:::-;69391:73;;;;69497:8;69484:21;;:9;:21;;;69568:28;69576:8;69568:17;;:26;:28::i;:::-;69612:29;69620:9;69612:18;;:27;:29::i;:::-;69514:128;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69476:168;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;69672:1;69663:5;:10;;;:33;;;;69691:5;69677:19;;:10;:19;;;69663:33;69655:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;69149:583;;;;;:::o;36254:360::-;36314:13;36330:23;36345:7;36330:14;:23::i;:::-;36314:39;;36366:48;36387:5;36402:1;36406:7;36366:20;:48::i;:::-;36455:29;36472:1;36476:7;36455:8;:29::i;:::-;36517:1;36497:9;:16;36507:5;36497:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;36536:7;:16;36544:7;36536:16;;;;;;;;;;;;36529:23;;;;;;;;;;;36598:7;36594:1;36570:36;;36579:5;36570:36;;;;;;;;;;;;36254:360;;:::o;61710:129::-;61774:6;61823:8;61800:31;;61818:1;61808:5;61801:13;;:18;;;;61800:31;61793:38;;61710:129;;;;:::o;34649:110::-;34725:26;34735:2;34739:7;34725:26;;;;;;;;;;;;:9;:26::i;:::-;34649:110;;:::o;33037:315::-;33194:28;33204:4;33210:2;33214:7;33194:9;:28::i;:::-;33241:48;33264:4;33270:2;33274:7;33283:5;33241:22;:48::i;:::-;33233:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33037:315;;;;:::o;61851:141::-;61905:5;61912;61956:1;61944:8;:13;;;;61977:3;61966:8;:14;61930:52;;;;61851:141;;;:::o;412:723::-;468:13;698:1;689:5;:10;685:53;;;716:10;;;;;;;;;;;;;;;;;;;;;685:53;748:12;763:5;748:20;;779:14;804:78;819:1;811:4;:9;804:78;;837:8;;;;;:::i;:::-;;;;868:2;860:10;;;;;:::i;:::-;;;804:78;;;892:19;924:6;914:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;892:39;;942:154;958:1;949:5;:10;942:154;;986:1;976:11;;;;;:::i;:::-;;;1053:2;1045:5;:10;;;;:::i;:::-;1032:2;:24;;;;:::i;:::-;1019:39;;1002:6;1009;1002:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1082:2;1073:11;;;;;:::i;:::-;;;942:154;;;1120:6;1106:21;;;;;412:723;;;;:::o;65728:761::-;65806:13;56210:1;65835:22;;:9;:22;;;65832:293;;;66027:14;66042:9;66027:25;;;;;;;;;;;;;;;;;;;;;;;;;65906:192;;;;;;;;:::i;:::-;;;;;;;;;;;;;65874:239;;;;65832:293;66272:14;66287:9;66272:25;;;;;;;;;;;;;;;;;;;;;;;;;66415:10;66426:5;66415:17;;;;;;;;;;;;;;;;;;;;;;;;;66163:307;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66135:346;;65728:761;;;;;:::o;51046:1912::-;51104:13;51149:1;51134:4;:11;:16;51130:31;;;51152:9;;;;;;;;;;;;;;;;51130:31;51213:19;51235:12;;;;;;;;;;;;;;;;;51213:34;;51299:18;51345:1;51340;51326:4;:11;:15;;;;:::i;:::-;51325:21;;;;:::i;:::-;51320:1;:27;;;;:::i;:::-;51299:48;;51430:20;51477:2;51464:10;:15;;;;:::i;:::-;51453:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51430:50;;51577:10;51569:6;51562:26;51672:1;51665:5;51661:13;51731:4;51782;51776:11;51767:7;51763:25;51878:2;51870:6;51866:15;51951:754;51970:6;51961:7;51958:19;51951:754;;;52070:1;52061:7;52057:15;52046:26;;52109:7;52103:14;52235:4;52227:5;52223:2;52219:14;52215:25;52205:8;52201:40;52195:47;52184:9;52176:67;52289:1;52278:9;52274:17;52261:30;;52368:4;52360:5;52356:2;52352:14;52348:25;52338:8;52334:40;52328:47;52317:9;52309:67;52422:1;52411:9;52407:17;52394:30;;52501:4;52493:5;52490:1;52485:14;52481:25;52471:8;52467:40;52461:47;52450:9;52442:67;52555:1;52544:9;52540:17;52527:30;;52634:4;52626:5;52614:25;52604:8;52600:40;52594:47;52583:9;52575:67;52688:1;52677:9;52673:17;52660:30;;51994:711;51951:754;;;52778:1;52771:4;52765:11;52761:19;52799:1;52794:54;;;;52867:1;52862:52;;;;52754:160;;52794:54;52838:6;52833:3;52829:16;52825:1;52814:9;52810:17;52803:43;52794:54;;52862:52;52906:4;52901:3;52897:14;52893:1;52882:9;52878:17;52871:41;52754:160;;51502:1423;;;;52944:6;52937:13;;;;;51046:1912;;;;:::o;26265:157::-;26350:4;26389:25;26374:40;;;:11;:40;;;;26367:47;;26265:157;;;:::o;45783:589::-;45927:45;45954:4;45960:2;45964:7;45927:26;:45::i;:::-;46005:1;45989:18;;:4;:18;;;45985:187;;;46024:40;46056:7;46024:31;:40::i;:::-;45985:187;;;46094:2;46086:10;;:4;:10;;;46082:90;;46113:47;46146:4;46152:7;46113:32;:47::i;:::-;46082:90;45985:187;46200:1;46186:16;;:2;:16;;;46182:183;;;46219:45;46256:7;46219:36;:45::i;:::-;46182:183;;;46292:4;46286:10;;:2;:10;;;46282:83;;46313:40;46341:2;46345:7;46313:27;:40::i;:::-;46282:83;46182:183;45783:589;;;:::o;6108:98::-;6166:7;6197:1;6193;:5;;;;:::i;:::-;6186:12;;6108:98;;;;:::o;34986:321::-;35116:18;35122:2;35126:7;35116:5;:18::i;:::-;35167:54;35198:1;35202:2;35206:7;35215:5;35167:22;:54::i;:::-;35145:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34986:321;;;:::o;38386:799::-;38541:4;38562:15;:2;:13;;;:15::i;:::-;38558:620;;;38614:2;38598:36;;;38635:12;:10;:12::i;:::-;38649:4;38655:7;38664:5;38598:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38594:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38857:1;38840:6;:13;:18;38836:272;;;38883:60;;;;;;;;;;:::i;:::-;;;;;;;;38836:272;39058:6;39052:13;39043:6;39039:2;39035:15;39028:38;38594:529;38731:41;;;38721:51;;;:6;:51;;;;38714:58;;;;;38558:620;39162:4;39155:11;;38386:799;;;;;;;:::o;39757:126::-;;;;:::o;47095:164::-;47199:10;:17;;;;47172:15;:24;47188:7;47172:24;;;;;;;;;;;:44;;;;47227:10;47243:7;47227:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47095:164;:::o;47886:988::-;48152:22;48202:1;48177:22;48194:4;48177:16;:22::i;:::-;:26;;;;:::i;:::-;48152:51;;48214:18;48235:17;:26;48253:7;48235:26;;;;;;;;;;;;48214:47;;48382:14;48368:10;:28;48364:328;;48413:19;48435:12;:18;48448:4;48435:18;;;;;;;;;;;;;;;:34;48454:14;48435:34;;;;;;;;;;;;48413:56;;48519:11;48486:12;:18;48499:4;48486:18;;;;;;;;;;;;;;;:30;48505:10;48486:30;;;;;;;;;;;:44;;;;48636:10;48603:17;:30;48621:11;48603:30;;;;;;;;;;;:43;;;;48364:328;;48788:17;:26;48806:7;48788:26;;;;;;;;;;;48781:33;;;48832:12;:18;48845:4;48832:18;;;;;;;;;;;;;;;:34;48851:14;48832:34;;;;;;;;;;;48825:41;;;47886:988;;;;:::o;49169:1079::-;49422:22;49467:1;49447:10;:17;;;;:21;;;;:::i;:::-;49422:46;;49479:18;49500:15;:24;49516:7;49500:24;;;;;;;;;;;;49479:45;;49851:19;49873:10;49884:14;49873:26;;;;;;;;;;;;;;;;;;;;;;;;49851:48;;49937:11;49912:10;49923;49912:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;50048:10;50017:15;:28;50033:11;50017:28;;;;;;;;;;;:41;;;;50189:15;:24;50205:7;50189:24;;;;;;;;;;;50182:31;;;50224:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49169:1079;;;;:::o;46673:221::-;46758:14;46775:20;46792:2;46775:16;:20::i;:::-;46758:37;;46833:7;46806:12;:16;46819:2;46806:16;;;;;;;;;;;;;;;:24;46823:6;46806:24;;;;;;;;;;;:34;;;;46880:6;46851:17;:26;46869:7;46851:26;;;;;;;;;;;:35;;;;46673:221;;;:::o;35643:382::-;35737:1;35723:16;;:2;:16;;;;35715:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35796:16;35804:7;35796;:16::i;:::-;35795:17;35787:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35858:45;35887:1;35891:2;35895:7;35858:20;:45::i;:::-;35933:1;35916:9;:13;35926:2;35916:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35964:2;35945:7;:16;35953:7;35945:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36009:7;36005:2;35984:33;;36001:1;35984:33;;;;;;;;;;;;35643:382;;:::o;17283:387::-;17343:4;17551:12;17618:7;17606:20;17598:28;;17661:1;17654:4;:8;17647:15;;;17283:387;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;1266:5;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:135::-;1409:5;1447:6;1434:20;1425:29;;1463:31;1488:5;1463:31;:::i;:::-;1415:85;;;;:::o;1506:262::-;1565:6;1614:2;1602:9;1593:7;1589:23;1585:32;1582:2;;;1630:1;1627;1620:12;1582:2;1673:1;1698:53;1743:7;1734:6;1723:9;1719:22;1698:53;:::i;:::-;1688:63;;1644:117;1572:196;;;;:::o;1774:407::-;1842:6;1850;1899:2;1887:9;1878:7;1874:23;1870:32;1867:2;;;1915:1;1912;1905:12;1867:2;1958:1;1983:53;2028:7;2019:6;2008:9;2004:22;1983:53;:::i;:::-;1973:63;;1929:117;2085:2;2111:53;2156:7;2147:6;2136:9;2132:22;2111:53;:::i;:::-;2101:63;;2056:118;1857:324;;;;;:::o;2187:552::-;2264:6;2272;2280;2329:2;2317:9;2308:7;2304:23;2300:32;2297:2;;;2345:1;2342;2335:12;2297:2;2388:1;2413:53;2458:7;2449:6;2438:9;2434:22;2413:53;:::i;:::-;2403:63;;2359:117;2515:2;2541:53;2586:7;2577:6;2566:9;2562:22;2541:53;:::i;:::-;2531:63;;2486:118;2643:2;2669:53;2714:7;2705:6;2694:9;2690:22;2669:53;:::i;:::-;2659:63;;2614:118;2287:452;;;;;:::o;2745:809::-;2840:6;2848;2856;2864;2913:3;2901:9;2892:7;2888:23;2884:33;2881:2;;;2930:1;2927;2920:12;2881:2;2973:1;2998:53;3043:7;3034:6;3023:9;3019:22;2998:53;:::i;:::-;2988:63;;2944:117;3100:2;3126:53;3171:7;3162:6;3151:9;3147:22;3126:53;:::i;:::-;3116:63;;3071:118;3228:2;3254:53;3299:7;3290:6;3279:9;3275:22;3254:53;:::i;:::-;3244:63;;3199:118;3384:2;3373:9;3369:18;3356:32;3415:18;3407:6;3404:30;3401:2;;;3447:1;3444;3437:12;3401:2;3475:62;3529:7;3520:6;3509:9;3505:22;3475:62;:::i;:::-;3465:72;;3327:220;2871:683;;;;;;;:::o;3560:401::-;3625:6;3633;3682:2;3670:9;3661:7;3657:23;3653:32;3650:2;;;3698:1;3695;3688:12;3650:2;3741:1;3766:53;3811:7;3802:6;3791:9;3787:22;3766:53;:::i;:::-;3756:63;;3712:117;3868:2;3894:50;3936:7;3927:6;3916:9;3912:22;3894:50;:::i;:::-;3884:60;;3839:115;3640:321;;;;;:::o;3967:407::-;4035:6;4043;4092:2;4080:9;4071:7;4067:23;4063:32;4060:2;;;4108:1;4105;4098:12;4060:2;4151:1;4176:53;4221:7;4212:6;4201:9;4197:22;4176:53;:::i;:::-;4166:63;;4122:117;4278:2;4304:53;4349:7;4340:6;4329:9;4325:22;4304:53;:::i;:::-;4294:63;;4249:118;4050:324;;;;;:::o;4380:256::-;4436:6;4485:2;4473:9;4464:7;4460:23;4456:32;4453:2;;;4501:1;4498;4491:12;4453:2;4544:1;4569:50;4611:7;4602:6;4591:9;4587:22;4569:50;:::i;:::-;4559:60;;4515:114;4443:193;;;;:::o;4642:260::-;4700:6;4749:2;4737:9;4728:7;4724:23;4720:32;4717:2;;;4765:1;4762;4755:12;4717:2;4808:1;4833:52;4877:7;4868:6;4857:9;4853:22;4833:52;:::i;:::-;4823:62;;4779:116;4707:195;;;;:::o;4908:282::-;4977:6;5026:2;5014:9;5005:7;5001:23;4997:32;4994:2;;;5042:1;5039;5032:12;4994:2;5085:1;5110:63;5165:7;5156:6;5145:9;5141:22;5110:63;:::i;:::-;5100:73;;5056:127;4984:206;;;;:::o;5196:262::-;5255:6;5304:2;5292:9;5283:7;5279:23;5275:32;5272:2;;;5320:1;5317;5310:12;5272:2;5363:1;5388:53;5433:7;5424:6;5413:9;5409:22;5388:53;:::i;:::-;5378:63;;5334:117;5262:196;;;;:::o;5464:990::-;5568:6;5576;5584;5592;5600;5608;5657:3;5645:9;5636:7;5632:23;5628:33;5625:2;;;5674:1;5671;5664:12;5625:2;5717:1;5742:53;5787:7;5778:6;5767:9;5763:22;5742:53;:::i;:::-;5732:63;;5688:117;5844:2;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5815:118;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;6228:3;6255:53;6300:7;6291:6;6280:9;6276:22;6255:53;:::i;:::-;6245:63;;6199:119;6357:3;6384:53;6429:7;6420:6;6409:9;6405:22;6384:53;:::i;:::-;6374:63;;6328:119;5615:839;;;;;;;;:::o;6460:258::-;6517:6;6566:2;6554:9;6545:7;6541:23;6537:32;6534:2;;;6582:1;6579;6572:12;6534:2;6625:1;6650:51;6693:7;6684:6;6673:9;6669:22;6650:51;:::i;:::-;6640:61;;6596:115;6524:194;;;;:::o;6724:986::-;6826:6;6834;6842;6850;6858;6866;6915:3;6903:9;6894:7;6890:23;6886:33;6883:2;;;6932:1;6929;6922:12;6883:2;6975:1;7000:51;7043:7;7034:6;7023:9;7019:22;7000:51;:::i;:::-;6990:61;;6946:115;7100:2;7126:53;7171:7;7162:6;7151:9;7147:22;7126:53;:::i;:::-;7116:63;;7071:118;7228:2;7254:53;7299:7;7290:6;7279:9;7275:22;7254:53;:::i;:::-;7244:63;;7199:118;7356:2;7382:53;7427:7;7418:6;7407:9;7403:22;7382:53;:::i;:::-;7372:63;;7327:118;7484:3;7511:53;7556:7;7547:6;7536:9;7532:22;7511:53;:::i;:::-;7501:63;;7455:119;7613:3;7640:53;7685:7;7676:6;7665:9;7661:22;7640:53;:::i;:::-;7630:63;;7584:119;6873:837;;;;;;;;:::o;7716:189::-;7837:61;7865:32;7891:5;7865:32;:::i;:::-;7837:61;:::i;:::-;7832:3;7825:74;7815:90;;:::o;7911:118::-;7998:24;8016:5;7998:24;:::i;:::-;7993:3;7986:37;7976:53;;:::o;8035:157::-;8140:45;8160:24;8178:5;8160:24;:::i;:::-;8140:45;:::i;:::-;8135:3;8128:58;8118:74;;:::o;8198:109::-;8279:21;8294:5;8279:21;:::i;:::-;8274:3;8267:34;8257:50;;:::o;8313:157::-;8418:45;8438:24;8456:5;8438:24;:::i;:::-;8418:45;:::i;:::-;8413:3;8406:58;8396:74;;:::o;8476:360::-;8562:3;8590:38;8622:5;8590:38;:::i;:::-;8644:70;8707:6;8702:3;8644:70;:::i;:::-;8637:77;;8723:52;8768:6;8763:3;8756:4;8749:5;8745:16;8723:52;:::i;:::-;8800:29;8822:6;8800:29;:::i;:::-;8795:3;8791:39;8784:46;;8566:270;;;;;:::o;8842:364::-;8930:3;8958:39;8991:5;8958:39;:::i;:::-;9013:71;9077:6;9072:3;9013:71;:::i;:::-;9006:78;;9093:52;9138:6;9133:3;9126:4;9119:5;9115:16;9093:52;:::i;:::-;9170:29;9192:6;9170:29;:::i;:::-;9165:3;9161:39;9154:46;;8934:272;;;;;:::o;9212:377::-;9318:3;9346:39;9379:5;9346:39;:::i;:::-;9401:89;9483:6;9478:3;9401:89;:::i;:::-;9394:96;;9499:52;9544:6;9539:3;9532:4;9525:5;9521:16;9499:52;:::i;:::-;9576:6;9571:3;9567:16;9560:23;;9322:267;;;;;:::o;9619:845::-;9722:3;9759:5;9753:12;9788:36;9814:9;9788:36;:::i;:::-;9840:89;9922:6;9917:3;9840:89;:::i;:::-;9833:96;;9960:1;9949:9;9945:17;9976:1;9971:137;;;;10122:1;10117:341;;;;9938:520;;9971:137;10055:4;10051:9;10040;10036:25;10031:3;10024:38;10091:6;10086:3;10082:16;10075:23;;9971:137;;10117:341;10184:38;10216:5;10184:38;:::i;:::-;10244:1;10258:154;10272:6;10269:1;10266:13;10258:154;;;10346:7;10340:14;10336:1;10331:3;10327:11;10320:35;10396:1;10387:7;10383:15;10372:26;;10294:4;10291:1;10287:12;10282:17;;10258:154;;;10441:6;10436:3;10432:16;10425:23;;10124:334;;9938:520;;9726:738;;;;;;:::o;10470:402::-;10630:3;10651:85;10733:2;10728:3;10651:85;:::i;:::-;10644:92;;10745:93;10834:3;10745:93;:::i;:::-;10863:2;10858:3;10854:12;10847:19;;10634:238;;;:::o;10878:366::-;11020:3;11041:67;11105:2;11100:3;11041:67;:::i;:::-;11034:74;;11117:93;11206:3;11117:93;:::i;:::-;11235:2;11230:3;11226:12;11219:19;;11024:220;;;:::o;11250:366::-;11392:3;11413:67;11477:2;11472:3;11413:67;:::i;:::-;11406:74;;11489:93;11578:3;11489:93;:::i;:::-;11607:2;11602:3;11598:12;11591:19;;11396:220;;;:::o;11622:400::-;11782:3;11803:84;11885:1;11880:3;11803:84;:::i;:::-;11796:91;;11896:93;11985:3;11896:93;:::i;:::-;12014:1;12009:3;12005:11;11998:18;;11786:236;;;:::o;12028:402::-;12188:3;12209:85;12291:2;12286:3;12209:85;:::i;:::-;12202:92;;12303:93;12392:3;12303:93;:::i;:::-;12421:2;12416:3;12412:12;12405:19;;12192:238;;;:::o;12436:366::-;12578:3;12599:67;12663:2;12658:3;12599:67;:::i;:::-;12592:74;;12675:93;12764:3;12675:93;:::i;:::-;12793:2;12788:3;12784:12;12777:19;;12582:220;;;:::o;12808:366::-;12950:3;12971:67;13035:2;13030:3;12971:67;:::i;:::-;12964:74;;13047:93;13136:3;13047:93;:::i;:::-;13165:2;13160:3;13156:12;13149:19;;12954:220;;;:::o;13180:366::-;13322:3;13343:67;13407:2;13402:3;13343:67;:::i;:::-;13336:74;;13419:93;13508:3;13419:93;:::i;:::-;13537:2;13532:3;13528:12;13521:19;;13326:220;;;:::o;13552:366::-;13694:3;13715:67;13779:2;13774:3;13715:67;:::i;:::-;13708:74;;13791:93;13880:3;13791:93;:::i;:::-;13909:2;13904:3;13900:12;13893:19;;13698:220;;;:::o;13924:400::-;14084:3;14105:84;14187:1;14182:3;14105:84;:::i;:::-;14098:91;;14198:93;14287:3;14198:93;:::i;:::-;14316:1;14311:3;14307:11;14300:18;;14088:236;;;:::o;14330:366::-;14472:3;14493:67;14557:2;14552:3;14493:67;:::i;:::-;14486:74;;14569:93;14658:3;14569:93;:::i;:::-;14687:2;14682:3;14678:12;14671:19;;14476:220;;;:::o;14702:366::-;14844:3;14865:67;14929:2;14924:3;14865:67;:::i;:::-;14858:74;;14941:93;15030:3;14941:93;:::i;:::-;15059:2;15054:3;15050:12;15043:19;;14848:220;;;:::o;15074:366::-;15216:3;15237:67;15301:2;15296:3;15237:67;:::i;:::-;15230:74;;15313:93;15402:3;15313:93;:::i;:::-;15431:2;15426:3;15422:12;15415:19;;15220:220;;;:::o;15446:366::-;15588:3;15609:67;15673:2;15668:3;15609:67;:::i;:::-;15602:74;;15685:93;15774:3;15685:93;:::i;:::-;15803:2;15798:3;15794:12;15787:19;;15592:220;;;:::o;15818:366::-;15960:3;15981:67;16045:2;16040:3;15981:67;:::i;:::-;15974:74;;16057:93;16146:3;16057:93;:::i;:::-;16175:2;16170:3;16166:12;16159:19;;15964:220;;;:::o;16190:366::-;16332:3;16353:67;16417:2;16412:3;16353:67;:::i;:::-;16346:74;;16429:93;16518:3;16429:93;:::i;:::-;16547:2;16542:3;16538:12;16531:19;;16336:220;;;:::o;16562:366::-;16704:3;16725:67;16789:2;16784:3;16725:67;:::i;:::-;16718:74;;16801:93;16890:3;16801:93;:::i;:::-;16919:2;16914:3;16910:12;16903:19;;16708:220;;;:::o;16934:366::-;17076:3;17097:67;17161:2;17156:3;17097:67;:::i;:::-;17090:74;;17173:93;17262:3;17173:93;:::i;:::-;17291:2;17286:3;17282:12;17275:19;;17080:220;;;:::o;17306:366::-;17448:3;17469:67;17533:2;17528:3;17469:67;:::i;:::-;17462:74;;17545:93;17634:3;17545:93;:::i;:::-;17663:2;17658:3;17654:12;17647:19;;17452:220;;;:::o;17678:366::-;17820:3;17841:67;17905:2;17900:3;17841:67;:::i;:::-;17834:74;;17917:93;18006:3;17917:93;:::i;:::-;18035:2;18030:3;18026:12;18019:19;;17824:220;;;:::o;18050:366::-;18192:3;18213:67;18277:2;18272:3;18213:67;:::i;:::-;18206:74;;18289:93;18378:3;18289:93;:::i;:::-;18407:2;18402:3;18398:12;18391:19;;18196:220;;;:::o;18422:366::-;18564:3;18585:67;18649:2;18644:3;18585:67;:::i;:::-;18578:74;;18661:93;18750:3;18661:93;:::i;:::-;18779:2;18774:3;18770:12;18763:19;;18568:220;;;:::o;18794:400::-;18954:3;18975:84;19057:1;19052:3;18975:84;:::i;:::-;18968:91;;19068:93;19157:3;19068:93;:::i;:::-;19186:1;19181:3;19177:11;19170:18;;18958:236;;;:::o;19200:404::-;19360:3;19381:86;19463:3;19458;19381:86;:::i;:::-;19374:93;;19476;19565:3;19476:93;:::i;:::-;19594:3;19589;19585:13;19578:20;;19364:240;;;:::o;19610:366::-;19752:3;19773:67;19837:2;19832:3;19773:67;:::i;:::-;19766:74;;19849:93;19938:3;19849:93;:::i;:::-;19967:2;19962:3;19958:12;19951:19;;19756:220;;;:::o;19982:402::-;20142:3;20163:85;20245:2;20240:3;20163:85;:::i;:::-;20156:92;;20257:93;20346:3;20257:93;:::i;:::-;20375:2;20370:3;20366:12;20359:19;;20146:238;;;:::o;20390:366::-;20532:3;20553:67;20617:2;20612:3;20553:67;:::i;:::-;20546:74;;20629:93;20718:3;20629:93;:::i;:::-;20747:2;20742:3;20738:12;20731:19;;20536:220;;;:::o;20762:366::-;20904:3;20925:67;20989:2;20984:3;20925:67;:::i;:::-;20918:74;;21001:93;21090:3;21001:93;:::i;:::-;21119:2;21114:3;21110:12;21103:19;;20908:220;;;:::o;21134:366::-;21276:3;21297:67;21361:2;21356:3;21297:67;:::i;:::-;21290:74;;21373:93;21462:3;21373:93;:::i;:::-;21491:2;21486:3;21482:12;21475:19;;21280:220;;;:::o;21506:402::-;21666:3;21687:85;21769:2;21764:3;21687:85;:::i;:::-;21680:92;;21781:93;21870:3;21781:93;:::i;:::-;21899:2;21894:3;21890:12;21883:19;;21670:238;;;:::o;21914:366::-;22056:3;22077:67;22141:2;22136:3;22077:67;:::i;:::-;22070:74;;22153:93;22242:3;22153:93;:::i;:::-;22271:2;22266:3;22262:12;22255:19;;22060:220;;;:::o;22286:402::-;22446:3;22467:85;22549:2;22544:3;22467:85;:::i;:::-;22460:92;;22561:93;22650:3;22561:93;:::i;:::-;22679:2;22674:3;22670:12;22663:19;;22450:238;;;:::o;22694:366::-;22836:3;22857:67;22921:2;22916:3;22857:67;:::i;:::-;22850:74;;22933:93;23022:3;22933:93;:::i;:::-;23051:2;23046:3;23042:12;23035:19;;22840:220;;;:::o;23066:366::-;23208:3;23229:67;23293:2;23288:3;23229:67;:::i;:::-;23222:74;;23305:93;23394:3;23305:93;:::i;:::-;23423:2;23418:3;23414:12;23407:19;;23212:220;;;:::o;23438:366::-;23580:3;23601:67;23665:2;23660:3;23601:67;:::i;:::-;23594:74;;23677:93;23766:3;23677:93;:::i;:::-;23795:2;23790:3;23786:12;23779:19;;23584:220;;;:::o;23810:402::-;23970:3;23991:85;24073:2;24068:3;23991:85;:::i;:::-;23984:92;;24085:93;24174:3;24085:93;:::i;:::-;24203:2;24198:3;24194:12;24187:19;;23974:238;;;:::o;24218:366::-;24360:3;24381:67;24445:2;24440:3;24381:67;:::i;:::-;24374:74;;24457:93;24546:3;24457:93;:::i;:::-;24575:2;24570:3;24566:12;24559:19;;24364:220;;;:::o;24590:400::-;24750:3;24771:84;24853:1;24848:3;24771:84;:::i;:::-;24764:91;;24864:93;24953:3;24864:93;:::i;:::-;24982:1;24977:3;24973:11;24966:18;;24754:236;;;:::o;24996:366::-;25138:3;25159:67;25223:2;25218:3;25159:67;:::i;:::-;25152:74;;25235:93;25324:3;25235:93;:::i;:::-;25353:2;25348:3;25344:12;25337:19;;25142:220;;;:::o;25368:366::-;25510:3;25531:67;25595:2;25590:3;25531:67;:::i;:::-;25524:74;;25607:93;25696:3;25607:93;:::i;:::-;25725:2;25720:3;25716:12;25709:19;;25514:220;;;:::o;25740:366::-;25882:3;25903:67;25967:2;25962:3;25903:67;:::i;:::-;25896:74;;25979:93;26068:3;25979:93;:::i;:::-;26097:2;26092:3;26088:12;26081:19;;25886:220;;;:::o;26112:402::-;26272:3;26293:85;26375:2;26370:3;26293:85;:::i;:::-;26286:92;;26387:93;26476:3;26387:93;:::i;:::-;26505:2;26500:3;26496:12;26489:19;;26276:238;;;:::o;26520:402::-;26680:3;26701:85;26783:2;26778:3;26701:85;:::i;:::-;26694:92;;26795:93;26884:3;26795:93;:::i;:::-;26913:2;26908:3;26904:12;26897:19;;26684:238;;;:::o;26928:366::-;27070:3;27091:67;27155:2;27150:3;27091:67;:::i;:::-;27084:74;;27167:93;27256:3;27167:93;:::i;:::-;27285:2;27280:3;27276:12;27269:19;;27074:220;;;:::o;27300:366::-;27442:3;27463:67;27527:2;27522:3;27463:67;:::i;:::-;27456:74;;27539:93;27628:3;27539:93;:::i;:::-;27657:2;27652:3;27648:12;27641:19;;27446:220;;;:::o;27672:366::-;27814:3;27835:67;27899:2;27894:3;27835:67;:::i;:::-;27828:74;;27911:93;28000:3;27911:93;:::i;:::-;28029:2;28024:3;28020:12;28013:19;;27818:220;;;:::o;28044:115::-;28129:23;28146:5;28129:23;:::i;:::-;28124:3;28117:36;28107:52;;:::o;28165:118::-;28252:24;28270:5;28252:24;:::i;:::-;28247:3;28240:37;28230:53;;:::o;28289:157::-;28394:45;28414:24;28432:5;28414:24;:::i;:::-;28394:45;:::i;:::-;28389:3;28382:58;28372:74;;:::o;28452:1487::-;29030:3;29052:148;29196:3;29052:148;:::i;:::-;29045:155;;29217:92;29305:3;29296:6;29217:92;:::i;:::-;29210:99;;29326:148;29470:3;29326:148;:::i;:::-;29319:155;;29491:148;29635:3;29491:148;:::i;:::-;29484:155;;29656:92;29744:3;29735:6;29656:92;:::i;:::-;29649:99;;29765:148;29909:3;29765:148;:::i;:::-;29758:155;;29930:3;29923:10;;29034:905;;;;;:::o;29945:801::-;30276:3;30298:148;30442:3;30298:148;:::i;:::-;30291:155;;30463:92;30551:3;30542:6;30463:92;:::i;:::-;30456:99;;30572:148;30716:3;30572:148;:::i;:::-;30565:155;;30737:3;30730:10;;30280:466;;;;:::o;30752:2345::-;31631:3;31653:148;31797:3;31653:148;:::i;:::-;31646:155;;31818:95;31909:3;31900:6;31818:95;:::i;:::-;31811:102;;31930:148;32074:3;31930:148;:::i;:::-;31923:155;;32095:95;32186:3;32177:6;32095:95;:::i;:::-;32088:102;;32207:148;32351:3;32207:148;:::i;:::-;32200:155;;32372:148;32516:3;32372:148;:::i;:::-;32365:155;;32537:92;32625:3;32616:6;32537:92;:::i;:::-;32530:99;;32646:148;32790:3;32646:148;:::i;:::-;32639:155;;32811:95;32902:3;32893:6;32811:95;:::i;:::-;32804:102;;32923:148;33067:3;32923:148;:::i;:::-;32916:155;;33088:3;33081:10;;31635:1462;;;;;;;:::o;33103:541::-;33336:3;33358:148;33502:3;33358:148;:::i;:::-;33351:155;;33523:95;33614:3;33605:6;33523:95;:::i;:::-;33516:102;;33635:3;33628:10;;33340:304;;;;:::o;33650:967::-;34032:3;34054:148;34198:3;34054:148;:::i;:::-;34047:155;;34219:95;34310:3;34301:6;34219:95;:::i;:::-;34212:102;;34331:148;34475:3;34331:148;:::i;:::-;34324:155;;34496:95;34587:3;34578:6;34496:95;:::i;:::-;34489:102;;34608:3;34601:10;;34036:581;;;;;:::o;34623:852::-;34863:3;34878:75;34949:3;34940:6;34878:75;:::i;:::-;34978:2;34973:3;34969:12;34962:19;;34991:75;35062:3;35053:6;34991:75;:::i;:::-;35091:2;35086:3;35082:12;35075:19;;35104:91;35191:3;35182:6;35104:91;:::i;:::-;35220:2;35215:3;35211:12;35204:19;;35233:75;35304:3;35295:6;35233:75;:::i;:::-;35333:2;35328:3;35324:12;35317:19;;35346:75;35417:3;35408:6;35346:75;:::i;:::-;35446:2;35441:3;35437:12;35430:19;;35466:3;35459:10;;34867:608;;;;;;;;:::o;35481:222::-;35574:4;35612:2;35601:9;35597:18;35589:26;;35625:71;35693:1;35682:9;35678:17;35669:6;35625:71;:::i;:::-;35579:124;;;;:::o;35709:640::-;35904:4;35942:3;35931:9;35927:19;35919:27;;35956:71;36024:1;36013:9;36009:17;36000:6;35956:71;:::i;:::-;36037:72;36105:2;36094:9;36090:18;36081:6;36037:72;:::i;:::-;36119;36187:2;36176:9;36172:18;36163:6;36119:72;:::i;:::-;36238:9;36232:4;36228:20;36223:2;36212:9;36208:18;36201:48;36266:76;36337:4;36328:6;36266:76;:::i;:::-;36258:84;;35909:440;;;;;;;:::o;36355:210::-;36442:4;36480:2;36469:9;36465:18;36457:26;;36493:65;36555:1;36544:9;36540:17;36531:6;36493:65;:::i;:::-;36447:118;;;;:::o;36571:313::-;36684:4;36722:2;36711:9;36707:18;36699:26;;36771:9;36765:4;36761:20;36757:1;36746:9;36742:17;36735:47;36799:78;36872:4;36863:6;36799:78;:::i;:::-;36791:86;;36689:195;;;;:::o;36890:419::-;37056:4;37094:2;37083:9;37079:18;37071:26;;37143:9;37137:4;37133:20;37129:1;37118:9;37114:17;37107:47;37171:131;37297:4;37171:131;:::i;:::-;37163:139;;37061:248;;;:::o;37315:419::-;37481:4;37519:2;37508:9;37504:18;37496:26;;37568:9;37562:4;37558:20;37554:1;37543:9;37539:17;37532:47;37596:131;37722:4;37596:131;:::i;:::-;37588:139;;37486:248;;;:::o;37740:419::-;37906:4;37944:2;37933:9;37929:18;37921:26;;37993:9;37987:4;37983:20;37979:1;37968:9;37964:17;37957:47;38021:131;38147:4;38021:131;:::i;:::-;38013:139;;37911:248;;;:::o;38165:419::-;38331:4;38369:2;38358:9;38354:18;38346:26;;38418:9;38412:4;38408:20;38404:1;38393:9;38389:17;38382:47;38446:131;38572:4;38446:131;:::i;:::-;38438:139;;38336:248;;;:::o;38590:419::-;38756:4;38794:2;38783:9;38779:18;38771:26;;38843:9;38837:4;38833:20;38829:1;38818:9;38814:17;38807:47;38871:131;38997:4;38871:131;:::i;:::-;38863:139;;38761:248;;;:::o;39015:419::-;39181:4;39219:2;39208:9;39204:18;39196:26;;39268:9;39262:4;39258:20;39254:1;39243:9;39239:17;39232:47;39296:131;39422:4;39296:131;:::i;:::-;39288:139;;39186:248;;;:::o;39440:419::-;39606:4;39644:2;39633:9;39629:18;39621:26;;39693:9;39687:4;39683:20;39679:1;39668:9;39664:17;39657:47;39721:131;39847:4;39721:131;:::i;:::-;39713:139;;39611:248;;;:::o;39865:419::-;40031:4;40069:2;40058:9;40054:18;40046:26;;40118:9;40112:4;40108:20;40104:1;40093:9;40089:17;40082:47;40146:131;40272:4;40146:131;:::i;:::-;40138:139;;40036:248;;;:::o;40290:419::-;40456:4;40494:2;40483:9;40479:18;40471:26;;40543:9;40537:4;40533:20;40529:1;40518:9;40514:17;40507:47;40571:131;40697:4;40571:131;:::i;:::-;40563:139;;40461:248;;;:::o;40715:419::-;40881:4;40919:2;40908:9;40904:18;40896:26;;40968:9;40962:4;40958:20;40954:1;40943:9;40939:17;40932:47;40996:131;41122:4;40996:131;:::i;:::-;40988:139;;40886:248;;;:::o;41140:419::-;41306:4;41344:2;41333:9;41329:18;41321:26;;41393:9;41387:4;41383:20;41379:1;41368:9;41364:17;41357:47;41421:131;41547:4;41421:131;:::i;:::-;41413:139;;41311:248;;;:::o;41565:419::-;41731:4;41769:2;41758:9;41754:18;41746:26;;41818:9;41812:4;41808:20;41804:1;41793:9;41789:17;41782:47;41846:131;41972:4;41846:131;:::i;:::-;41838:139;;41736:248;;;:::o;41990:419::-;42156:4;42194:2;42183:9;42179:18;42171:26;;42243:9;42237:4;42233:20;42229:1;42218:9;42214:17;42207:47;42271:131;42397:4;42271:131;:::i;:::-;42263:139;;42161:248;;;:::o;42415:419::-;42581:4;42619:2;42608:9;42604:18;42596:26;;42668:9;42662:4;42658:20;42654:1;42643:9;42639:17;42632:47;42696:131;42822:4;42696:131;:::i;:::-;42688:139;;42586:248;;;:::o;42840:419::-;43006:4;43044:2;43033:9;43029:18;43021:26;;43093:9;43087:4;43083:20;43079:1;43068:9;43064:17;43057:47;43121:131;43247:4;43121:131;:::i;:::-;43113:139;;43011:248;;;:::o;43265:419::-;43431:4;43469:2;43458:9;43454:18;43446:26;;43518:9;43512:4;43508:20;43504:1;43493:9;43489:17;43482:47;43546:131;43672:4;43546:131;:::i;:::-;43538:139;;43436:248;;;:::o;43690:419::-;43856:4;43894:2;43883:9;43879:18;43871:26;;43943:9;43937:4;43933:20;43929:1;43918:9;43914:17;43907:47;43971:131;44097:4;43971:131;:::i;:::-;43963:139;;43861:248;;;:::o;44115:419::-;44281:4;44319:2;44308:9;44304:18;44296:26;;44368:9;44362:4;44358:20;44354:1;44343:9;44339:17;44332:47;44396:131;44522:4;44396:131;:::i;:::-;44388:139;;44286:248;;;:::o;44540:419::-;44706:4;44744:2;44733:9;44729:18;44721:26;;44793:9;44787:4;44783:20;44779:1;44768:9;44764:17;44757:47;44821:131;44947:4;44821:131;:::i;:::-;44813:139;;44711:248;;;:::o;44965:419::-;45131:4;45169:2;45158:9;45154:18;45146:26;;45218:9;45212:4;45208:20;45204:1;45193:9;45189:17;45182:47;45246:131;45372:4;45246:131;:::i;:::-;45238:139;;45136:248;;;:::o;45390:419::-;45556:4;45594:2;45583:9;45579:18;45571:26;;45643:9;45637:4;45633:20;45629:1;45618:9;45614:17;45607:47;45671:131;45797:4;45671:131;:::i;:::-;45663:139;;45561:248;;;:::o;45815:419::-;45981:4;46019:2;46008:9;46004:18;45996:26;;46068:9;46062:4;46058:20;46054:1;46043:9;46039:17;46032:47;46096:131;46222:4;46096:131;:::i;:::-;46088:139;;45986:248;;;:::o;46240:419::-;46406:4;46444:2;46433:9;46429:18;46421:26;;46493:9;46487:4;46483:20;46479:1;46468:9;46464:17;46457:47;46521:131;46647:4;46521:131;:::i;:::-;46513:139;;46411:248;;;:::o;46665:419::-;46831:4;46869:2;46858:9;46854:18;46846:26;;46918:9;46912:4;46908:20;46904:1;46893:9;46889:17;46882:47;46946:131;47072:4;46946:131;:::i;:::-;46938:139;;46836:248;;;:::o;47090:419::-;47256:4;47294:2;47283:9;47279:18;47271:26;;47343:9;47337:4;47333:20;47329:1;47318:9;47314:17;47307:47;47371:131;47497:4;47371:131;:::i;:::-;47363:139;;47261:248;;;:::o;47515:419::-;47681:4;47719:2;47708:9;47704:18;47696:26;;47768:9;47762:4;47758:20;47754:1;47743:9;47739:17;47732:47;47796:131;47922:4;47796:131;:::i;:::-;47788:139;;47686:248;;;:::o;47940:419::-;48106:4;48144:2;48133:9;48129:18;48121:26;;48193:9;48187:4;48183:20;48179:1;48168:9;48164:17;48157:47;48221:131;48347:4;48221:131;:::i;:::-;48213:139;;48111:248;;;:::o;48365:419::-;48531:4;48569:2;48558:9;48554:18;48546:26;;48618:9;48612:4;48608:20;48604:1;48593:9;48589:17;48582:47;48646:131;48772:4;48646:131;:::i;:::-;48638:139;;48536:248;;;:::o;48790:419::-;48956:4;48994:2;48983:9;48979:18;48971:26;;49043:9;49037:4;49033:20;49029:1;49018:9;49014:17;49007:47;49071:131;49197:4;49071:131;:::i;:::-;49063:139;;48961:248;;;:::o;49215:419::-;49381:4;49419:2;49408:9;49404:18;49396:26;;49468:9;49462:4;49458:20;49454:1;49443:9;49439:17;49432:47;49496:131;49622:4;49496:131;:::i;:::-;49488:139;;49386:248;;;:::o;49640:419::-;49806:4;49844:2;49833:9;49829:18;49821:26;;49893:9;49887:4;49883:20;49879:1;49868:9;49864:17;49857:47;49921:131;50047:4;49921:131;:::i;:::-;49913:139;;49811:248;;;:::o;50065:419::-;50231:4;50269:2;50258:9;50254:18;50246:26;;50318:9;50312:4;50308:20;50304:1;50293:9;50289:17;50282:47;50346:131;50472:4;50346:131;:::i;:::-;50338:139;;50236:248;;;:::o;50490:419::-;50656:4;50694:2;50683:9;50679:18;50671:26;;50743:9;50737:4;50733:20;50729:1;50718:9;50714:17;50707:47;50771:131;50897:4;50771:131;:::i;:::-;50763:139;;50661:248;;;:::o;50915:218::-;51006:4;51044:2;51033:9;51029:18;51021:26;;51057:69;51123:1;51112:9;51108:17;51099:6;51057:69;:::i;:::-;51011:122;;;;:::o;51139:222::-;51232:4;51270:2;51259:9;51255:18;51247:26;;51283:71;51351:1;51340:9;51336:17;51327:6;51283:71;:::i;:::-;51237:124;;;;:::o;51367:129::-;51401:6;51428:20;;:::i;:::-;51418:30;;51457:33;51485:4;51477:6;51457:33;:::i;:::-;51408:88;;;:::o;51502:75::-;51535:6;51568:2;51562:9;51552:19;;51542:35;:::o;51583:307::-;51644:4;51734:18;51726:6;51723:30;51720:2;;;51756:18;;:::i;:::-;51720:2;51794:29;51816:6;51794:29;:::i;:::-;51786:37;;51878:4;51872;51868:15;51860:23;;51649:241;;;:::o;51896:141::-;51945:4;51968:3;51960:11;;51991:3;51988:1;51981:14;52025:4;52022:1;52012:18;52004:26;;51950:87;;;:::o;52043:98::-;52094:6;52128:5;52122:12;52112:22;;52101:40;;;:::o;52147:99::-;52199:6;52233:5;52227:12;52217:22;;52206:40;;;:::o;52252:168::-;52335:11;52369:6;52364:3;52357:19;52409:4;52404:3;52400:14;52385:29;;52347:73;;;;:::o;52426:169::-;52510:11;52544:6;52539:3;52532:19;52584:4;52579:3;52575:14;52560:29;;52522:73;;;;:::o;52601:148::-;52703:11;52740:3;52725:18;;52715:34;;;;:::o;52755:305::-;52795:3;52814:20;52832:1;52814:20;:::i;:::-;52809:25;;52848:20;52866:1;52848:20;:::i;:::-;52843:25;;53002:1;52934:66;52930:74;52927:1;52924:81;52921:2;;;53008:18;;:::i;:::-;52921:2;53052:1;53049;53045:9;53038:16;;52799:261;;;;:::o;53066:185::-;53106:1;53123:20;53141:1;53123:20;:::i;:::-;53118:25;;53157:20;53175:1;53157:20;:::i;:::-;53152:25;;53196:1;53186:2;;53201:18;;:::i;:::-;53186:2;53243:1;53240;53236:9;53231:14;;53108:143;;;;:::o;53257:348::-;53297:7;53320:20;53338:1;53320:20;:::i;:::-;53315:25;;53354:20;53372:1;53354:20;:::i;:::-;53349:25;;53542:1;53474:66;53470:74;53467:1;53464:81;53459:1;53452:9;53445:17;53441:105;53438:2;;;53549:18;;:::i;:::-;53438:2;53597:1;53594;53590:9;53579:20;;53305:300;;;;:::o;53611:188::-;53650:4;53670:19;53687:1;53670:19;:::i;:::-;53665:24;;53703:19;53720:1;53703:19;:::i;:::-;53698:24;;53741:1;53738;53735:8;53732:2;;;53746:18;;:::i;:::-;53732:2;53791:1;53788;53784:9;53776:17;;53655:144;;;;:::o;53805:191::-;53845:4;53865:20;53883:1;53865:20;:::i;:::-;53860:25;;53899:20;53917:1;53899:20;:::i;:::-;53894:25;;53938:1;53935;53932:8;53929:2;;;53943:18;;:::i;:::-;53929:2;53988:1;53985;53981:9;53973:17;;53850:146;;;;:::o;54002:96::-;54039:7;54068:24;54086:5;54068:24;:::i;:::-;54057:35;;54047:51;;;:::o;54104:104::-;54149:7;54178:24;54196:5;54178:24;:::i;:::-;54167:35;;54157:51;;;:::o;54214:90::-;54248:7;54291:5;54284:13;54277:21;54266:32;;54256:48;;;:::o;54310:77::-;54347:7;54376:5;54365:16;;54355:32;;;:::o;54393:149::-;54429:7;54469:66;54462:5;54458:78;54447:89;;54437:105;;;:::o;54548:89::-;54584:7;54624:6;54617:5;54613:18;54602:29;;54592:45;;;:::o;54643:126::-;54680:7;54720:42;54713:5;54709:54;54698:65;;54688:81;;;:::o;54775:77::-;54812:7;54841:5;54830:16;;54820:32;;;:::o;54858:86::-;54893:7;54933:4;54926:5;54922:16;54911:27;;54901:43;;;:::o;54950:154::-;55034:6;55029:3;55024;55011:30;55096:1;55087:6;55082:3;55078:16;55071:27;55001:103;;;:::o;55110:307::-;55178:1;55188:113;55202:6;55199:1;55196:13;55188:113;;;55287:1;55282:3;55278:11;55272:18;55268:1;55263:3;55259:11;55252:39;55224:2;55221:1;55217:10;55212:15;;55188:113;;;55319:6;55316:1;55313:13;55310:2;;;55399:1;55390:6;55385:3;55381:16;55374:27;55310:2;55159:258;;;;:::o;55423:320::-;55467:6;55504:1;55498:4;55494:12;55484:22;;55551:1;55545:4;55541:12;55572:18;55562:2;;55628:4;55620:6;55616:17;55606:27;;55562:2;55690;55682:6;55679:14;55659:18;55656:38;55653:2;;;55709:18;;:::i;:::-;55653:2;55474:269;;;;:::o;55749:281::-;55832:27;55854:4;55832:27;:::i;:::-;55824:6;55820:40;55962:6;55950:10;55947:22;55926:18;55914:10;55911:34;55908:62;55905:2;;;55973:18;;:::i;:::-;55905:2;56013:10;56009:2;56002:22;55792:238;;;:::o;56036:171::-;56074:3;56097:23;56114:5;56097:23;:::i;:::-;56088:32;;56142:6;56135:5;56132:17;56129:2;;;56152:18;;:::i;:::-;56129:2;56199:1;56192:5;56188:13;56181:20;;56078:129;;;:::o;56213:233::-;56252:3;56275:24;56293:5;56275:24;:::i;:::-;56266:33;;56321:66;56314:5;56311:77;56308:2;;;56391:18;;:::i;:::-;56308:2;56438:1;56431:5;56427:13;56420:20;;56256:190;;;:::o;56452:100::-;56491:7;56520:26;56540:5;56520:26;:::i;:::-;56509:37;;56499:53;;;:::o;56558:108::-;56605:7;56634:26;56654:5;56634:26;:::i;:::-;56623:37;;56613:53;;;:::o;56672:79::-;56711:7;56740:5;56729:16;;56719:32;;;:::o;56757:94::-;56796:7;56825:20;56839:5;56825:20;:::i;:::-;56814:31;;56804:47;;;:::o;56857:79::-;56896:7;56925:5;56914:16;;56904:32;;;:::o;56942:176::-;56974:1;56991:20;57009:1;56991:20;:::i;:::-;56986:25;;57025:20;57043:1;57025:20;:::i;:::-;57020:25;;57064:1;57054:2;;57069:18;;:::i;:::-;57054:2;57110:1;57107;57103:9;57098:14;;56976:142;;;;:::o;57124:180::-;57172:77;57169:1;57162:88;57269:4;57266:1;57259:15;57293:4;57290:1;57283:15;57310:180;57358:77;57355:1;57348:88;57455:4;57452:1;57445:15;57479:4;57476:1;57469:15;57496:180;57544:77;57541:1;57534:88;57641:4;57638:1;57631:15;57665:4;57662:1;57655:15;57682:180;57730:77;57727:1;57720:88;57827:4;57824:1;57817:15;57851:4;57848:1;57841:15;57868:102;57909:6;57960:2;57956:7;57951:2;57944:5;57940:14;57936:28;57926:38;;57916:54;;;:::o;57976:94::-;58009:8;58057:5;58053:2;58049:14;58028:35;;58018:52;;;:::o;58076:214::-;58216:66;58212:1;58204:6;58200:14;58193:90;58182:108;:::o;58296:230::-;58436:34;58432:1;58424:6;58420:14;58413:58;58505:13;58500:2;58492:6;58488:15;58481:38;58402:124;:::o;58532:237::-;58672:34;58668:1;58660:6;58656:14;58649:58;58741:20;58736:2;58728:6;58724:15;58717:45;58638:131;:::o;58775:152::-;58915:4;58911:1;58903:6;58899:14;58892:28;58881:46;:::o;58933:315::-;59073:66;59069:1;59061:6;59057:14;59050:90;59174:66;59169:2;59161:6;59157:15;59150:91;59039:209;:::o;59254:225::-;59394:34;59390:1;59382:6;59378:14;59371:58;59463:8;59458:2;59450:6;59446:15;59439:33;59360:119;:::o;59485:178::-;59625:30;59621:1;59613:6;59609:14;59602:54;59591:72;:::o;59669:222::-;59809:34;59805:1;59797:6;59793:14;59786:58;59878:5;59873:2;59865:6;59861:15;59854:30;59775:116;:::o;59897:163::-;60037:15;60033:1;60025:6;60021:14;60014:39;60003:57;:::o;60066:214::-;60206:66;60202:1;60194:6;60190:14;60183:90;60172:108;:::o;60286:222::-;60426:34;60422:1;60414:6;60410:14;60403:58;60495:5;60490:2;60482:6;60478:15;60471:30;60392:116;:::o;60514:223::-;60654:34;60650:1;60642:6;60638:14;60631:58;60723:6;60718:2;60710:6;60706:15;60699:31;60620:117;:::o;60743:175::-;60883:27;60879:1;60871:6;60867:14;60860:51;60849:69;:::o;60924:220::-;61064:34;61060:1;61052:6;61048:14;61041:58;61133:3;61128:2;61120:6;61116:15;61109:28;61030:114;:::o;61150:231::-;61290:34;61286:1;61278:6;61274:14;61267:58;61359:14;61354:2;61346:6;61342:15;61335:39;61256:125;:::o;61387:173::-;61527:25;61523:1;61515:6;61511:14;61504:49;61493:67;:::o;61566:243::-;61706:34;61702:1;61694:6;61690:14;61683:58;61775:26;61770:2;61762:6;61758:15;61751:51;61672:137;:::o;61815:167::-;61955:19;61951:1;61943:6;61939:14;61932:43;61921:61;:::o;61988:229::-;62128:34;62124:1;62116:6;62112:14;62105:58;62197:12;62192:2;62184:6;62180:15;62173:37;62094:123;:::o;62223:228::-;62363:34;62359:1;62351:6;62347:14;62340:58;62432:11;62427:2;62419:6;62415:15;62408:36;62329:122;:::o;62457:169::-;62597:21;62593:1;62585:6;62581:14;62574:45;62563:63;:::o;62632:174::-;62772:26;62768:1;62760:6;62756:14;62749:50;62738:68;:::o;62812:214::-;62952:66;62948:1;62940:6;62936:14;62929:90;62918:108;:::o;63032:484::-;63172:66;63168:1;63160:6;63156:14;63149:90;63273:34;63268:2;63260:6;63256:15;63249:59;63342:34;63337:2;63329:6;63325:15;63318:59;63411:34;63406:2;63398:6;63394:15;63387:59;63481:27;63475:3;63467:6;63463:16;63456:53;63138:378;:::o;63522:182::-;63662:34;63658:1;63650:6;63646:14;63639:58;63628:76;:::o;63710:160::-;63850:12;63846:1;63838:6;63834:14;63827:36;63816:54;:::o;63876:182::-;64016:34;64012:1;64004:6;64000:14;63993:58;63982:76;:::o;64064:231::-;64204:34;64200:1;64192:6;64188:14;64181:58;64273:14;64268:2;64260:6;64256:15;64249:39;64170:125;:::o;64301:171::-;64441:23;64437:1;64429:6;64425:14;64418:47;64407:65;:::o;64478:214::-;64618:66;64614:1;64606:6;64602:14;64595:90;64584:108;:::o;64698:182::-;64838:34;64834:1;64826:6;64822:14;64815:58;64804:76;:::o;64886:315::-;65026:66;65022:1;65014:6;65010:14;65003:90;65127:66;65122:2;65114:6;65110:15;65103:91;64992:209;:::o;65207:228::-;65347:34;65343:1;65335:6;65331:14;65324:58;65416:11;65411:2;65403:6;65399:15;65392:36;65313:122;:::o;65441:234::-;65581:34;65577:1;65569:6;65565:14;65558:58;65650:17;65645:2;65637:6;65633:15;65626:42;65547:128;:::o;65681:220::-;65821:34;65817:1;65809:6;65805:14;65798:58;65890:3;65885:2;65877:6;65873:15;65866:28;65787:114;:::o;65907:214::-;66047:66;66043:1;66035:6;66031:14;66024:90;66013:108;:::o;66127:220::-;66267:34;66263:1;66255:6;66251:14;66244:58;66336:3;66331:2;66323:6;66319:15;66312:28;66233:114;:::o;66353:144::-;66489:4;66485:1;66477:6;66473:14;66466:28;66459:38;:::o;66499:208::-;66635:34;66631:1;66623:6;66619:14;66612:58;66700:3;66695:2;66687:6;66683:15;66676:28;66605:102;:::o;66709:164::-;66845:24;66841:1;66833:6;66829:14;66822:48;66815:58;:::o;66875:164::-;67011:24;67007:1;66999:6;66995:14;66988:48;66981:58;:::o;67041:171::-;67177:31;67173:1;67165:6;67161:14;67154:55;67147:65;:::o;67214:208::-;67350:34;67346:1;67338:6;67334:14;67327:58;67415:3;67410:2;67402:6;67398:15;67391:28;67320:102;:::o;67424:224::-;67560:34;67556:1;67548:6;67544:14;67537:58;67625:19;67620:2;67612:6;67608:15;67601:44;67530:118;:::o;67650:219::-;67786:34;67782:1;67774:6;67770:14;67763:58;67851:14;67846:2;67838:6;67834:15;67827:39;67756:113;:::o;67871:162::-;68007:22;68003:1;67995:6;67991:14;67984:46;67977:56;:::o;68035:114::-;68104:24;68122:5;68104:24;:::i;:::-;68097:5;68094:35;68084:2;;68143:1;68140;68133:12;68084:2;68078:71;:::o;68151:108::-;68217:21;68232:5;68217:21;:::i;:::-;68210:5;68207:32;68197:2;;68253:1;68250;68243:12;68197:2;68191:68;:::o;68261:112::-;68329:23;68346:5;68329:23;:::i;:::-;68322:5;68319:34;68309:2;;68367:1;68364;68357:12;68309:2;68303:70;:::o;68375:114::-;68444:24;68462:5;68444:24;:::i;:::-;68437:5;68434:35;68424:2;;68483:1;68480;68473:12;68424:2;68418:71;:::o;68491:110::-;68558:22;68574:5;68558:22;:::i;:::-;68551:5;68548:33;68538:2;;68595:1;68592;68585:12;68538:2;68532:69;:::o

Swarm Source

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