ETH Price: $2,465.57 (+4.22%)

Token

8BitMekas (8BitMekas)
 

Overview

Max Total Supply

494 8BitMekas

Holders

140

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
foulr.eth
Balance
3 8BitMekas
0x6bcdb3eb8d2e093852595cb75a46c28d2e942a3f
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:
eightbitMekascontract

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-17
*/

/**
 *Submitted for verification at Etherscan.io on 2021-09-17
*/

// SPDX-License-Identifier: MIT

// GO TO LINE 1904 TO SEE WHERE THE BANANA CONTRACT STARTS
 


pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity >=0.6.0 <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);
}




pragma solidity >=0.6.2 <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/IERC721Metadata.sol



pragma solidity >=0.6.2 <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/token/ERC721/IERC721Enumerable.sol



pragma solidity >=0.6.2 <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/IERC721Receiver.sol



pragma solidity >=0.6.0 <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/introspection/ERC165.sol



pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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



pragma solidity >=0.6.2 <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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
 
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

    // 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;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @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 _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @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 _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 || ERC721.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 _tokenOwners.contains(tokenId);
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(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); // internal owner

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(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"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

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



pragma solidity >=0.6.0 <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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


//hero

pragma solidity ^0.7.0;
pragma abicoder v2;


abstract contract Weapon {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
}


contract eightbitMekascontract is ERC721, Ownable {
    using SafeMath for uint256;

    string public meka_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN

    uint256 public  mekaPrice = 30000000000000000; // 0.03 ETH
    uint public constant MAX_MEKA_PURCHASE = 20;
    uint256 public  MAX_mekaS = 8888;

    bool public PresaleIsActive = false;
    bool public composeIsActive = false;
    bool public MintSaleIsActive = false;
    bool public claimIsActive = false;
    address public  WeaponContractAddress;
 
    mapping(uint => uint256) public mekacombinetokenid;
    mapping (address => bool) whitelist;
    mapping(address => bool) minted;
    
    // Reserve 300 meka for team
    uint public mekaReserve = 300;
    event mekaInternaltokenidChange(address _by, uint _tokenId,  uint256 _internaltokenID);

    constructor() ERC721("8BitMekas", "8BitMekas") { }
    
    modifier mintOnlyOnce() {
        require(!minted[_msgSender()], 'Can only mint once');
        minted[_msgSender()] = true;
        _;
    }
    
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        msg.sender.transfer(balance);
    }
    
    function forge(address _to, uint256 _reserveAmount) public onlyOwner {        
        uint supply = totalSupply();
        require(_reserveAmount > 0 && supply.add(_reserveAmount) <= MAX_mekaS, "Not enough reserve left");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        mekaReserve = mekaReserve.sub(_reserveAmount);
    }
    
    function setMintPrice(uint price) external onlyOwner {
        mekaPrice = price;
    }
    
    function setMaxMekas(uint maxmeka) external onlyOwner {
        MAX_mekaS = maxmeka;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        meka_PROVENANCE = provenanceHash;
    }

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

    function flipPreSaleState() public onlyOwner {
        PresaleIsActive = !PresaleIsActive;
    }
    
    function flipMintSaleState() public onlyOwner {
        MintSaleIsActive = !MintSaleIsActive;
    }

    function flipComposeState() public onlyOwner {
        composeIsActive = !composeIsActive;
    }
    
    function flipClaimState() public onlyOwner {
        claimIsActive = !claimIsActive;
    }
    
    function claim() public mintOnlyOnce {
        require(claimIsActive, "Claim must be active to mint mekas");
        require(totalSupply().add(1) <= MAX_mekaS, 'Purchase would exceed max supply of mekas');
        _safeMint(msg.sender, totalSupply());
    }    
    
    function mintmekas(uint numberOfTokens) public payable {
    require(MintSaleIsActive, "Sale must be active to mint meka");
    require(numberOfTokens > 0 && numberOfTokens <= MAX_MEKA_PURCHASE, "Can only mint 20 meka at a time");
    require(totalSupply().add(numberOfTokens) <= MAX_mekaS, "Purchase would exceed max supply of mekas");
    require(msg.value >= mekaPrice.mul(numberOfTokens), "Ether value sent is not correct");

    for (uint i = 0; i < numberOfTokens; i++) {
      if (totalSupply() < MAX_mekaS) {
        _safeMint(msg.sender, totalSupply());
      }
    }
   }
  
    function presalemekas(uint numberOfTokens) public payable {
    require(PresaleIsActive, "Pre Sale must be active to mint meka");
    require(numberOfTokens > 0 && numberOfTokens <= MAX_MEKA_PURCHASE, "Can only mint 20 meka at a time");
    require(totalSupply().add(numberOfTokens) <= MAX_mekaS, "Purchase would exceed max supply of mekas");
    require(msg.value >= mekaPrice.mul(numberOfTokens), "Ether value sent is not correct");
    require(whitelist[msg.sender], "You are not in whitelist");
 
    for (uint i = 0; i < numberOfTokens; i++) {
      if (totalSupply() < MAX_mekaS) {
        _safeMint(msg.sender, totalSupply());
      }
    }
   }
   
  
   function composeWeapon(address owner, uint256 WeapontokenId, uint256 mekatokenId, uint256 newMekacombinetokenId) public returns (bool) {
     require(composeIsActive, "Compose is not active at the moment");
     require(ERC721.ownerOf(mekatokenId) == owner, "You do not have this meka");
     Weapon weapon = Weapon(WeaponContractAddress);
     require(weapon.ownerOf(WeapontokenId) == owner, "You do not have this weapon");

     mekacombinetokenid[mekatokenId] = newMekacombinetokenId;
     emit mekaInternaltokenidChange(msg.sender,  mekatokenId, newMekacombinetokenId);
     return true;
    }

    function isEligiblePrivateSale(address _wallet) public view virtual returns (bool){
        return whitelist[_wallet];
    }

    function addWalletsToWhiteList(address[] memory _wallets) public onlyOwner{
        for(uint i = 0; i < _wallets.length; i++) {
            whitelist[_wallets[i]] = true;
        }
    }
    
   function setWeaponContractAddress(address contractAddress) public onlyOwner {
        WeaponContractAddress = contractAddress;
   }
    
  function getMekacombinetokenID(uint _tokenId) public  view returns( uint256  ){
       require(_tokenId <= totalSupply(), "ID would exceed max supply of mekas");
       return mekacombinetokenid[_tokenId];
  }
    

  function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    
}

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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_internaltokenID","type":"uint256"}],"name":"mekaInternaltokenidChange","type":"event"},{"inputs":[],"name":"MAX_MEKA_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_mekaS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MintSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PresaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WeaponContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"addWalletsToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"composeIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"WeapontokenId","type":"uint256"},{"internalType":"uint256","name":"mekatokenId","type":"uint256"},{"internalType":"uint256","name":"newMekacombinetokenId","type":"uint256"}],"name":"composeWeapon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipClaimState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipComposeState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"forge","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getMekacombinetokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"_wallet","type":"address"}],"name":"isEligiblePrivateSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mekaPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mekaReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"meka_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mekacombinetokenid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintmekas","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":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"presalemekas","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxmeka","type":"uint256"}],"name":"setMaxMekas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setWeaponContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b92919062000354565b50666a94d74f430000600c556122b8600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506000600e60036101000a81548160ff02191690831515021790555061012c601255348015620000bc57600080fd5b506040518060400160405280600981526020017f384269744d656b617300000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f384269744d656b61730000000000000000000000000000000000000000000000815250620001416301ffc9a760e01b6200027460201b60201c565b81600690805190602001906200015992919062000354565b5080600790805190602001906200017292919062000354565b506200018b6380ac58cd60e01b6200027460201b60201c565b620001a3635b5e139f60e01b6200027460201b60201c565b620001bb63780e9d6360e01b6200027460201b60201c565b50506000620001cf6200034c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200047f565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d7906200044c565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200038c5760008555620003d8565b82601f10620003a757805160ff1916838001178555620003d8565b82800160010185558215620003d8579182015b82811115620003d7578251825591602001919060010190620003ba565b5b509050620003e79190620003eb565b5090565b5b8082111562000406576000816000905550600101620003ec565b5090565b600062000419601c836200046e565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b6000602082019050818103600083015262000467816200040a565b9050919050565b600082825260208201905092915050565b615877806200048f6000396000f3fe6080604052600436106102c85760003560e01c80636d60e6c111610175578063b7d16640116100dc578063df21f95711610095578063eb7a33331161006f578063eb7a333314610ad9578063f032554914610af0578063f2fde38b14610b07578063f4a0a52814610b30576102c8565b8063df21f95714610a36578063e2e1796314610a73578063e985e9c514610a9c576102c8565b8063b7d1664014610942578063b88d4fde1461096d578063c37550b214610996578063c37fae9b146109b2578063c87b56dd146109dd578063d790c8c714610a1a576102c8565b806386ed1a541161012e57806386ed1a54146108445780638da5cb5b1461086f57806395d89b411461089a578063a22cb465146108c5578063a66bcb8c146108ee578063af7420a314610905576102c8565b80636d60e6c11461074657806370a082311461075d578063715018a61461079a5780637fbc15cf146107b15780638263e4c4146107dc5780638462151c14610807576102c8565b80632d807405116102345780634e71d92d116101ed57806355f804b3116101c757806355f804b31461068c5780636352211e146106b5578063641cc9d4146106f25780636c0360eb1461071b576102c8565b80634e71d92d1461060d5780634f6ccce7146106245780635303f68c14610661576102c8565b80632d807405146104ff5780632f745c591461053c5780633ccfd60b146105795780633f495e5d1461059057806342842e0e146105bb5780634e315efc146105e4576102c8565b80631096952311610286578063109695231461040357806318160ddd1461042c5780631a36a7dc1461045757806323b872dd146104825780632a3800e4146104ab5780632b48bfbd146104d6576102c8565b806215f6dd146102cd57806301ffc9a71461030a57806306fdde0314610347578063081812fc146103725780630821a1ae146103af578063095ea7b3146103da575b600080fd5b3480156102d957600080fd5b506102f460048036038101906102ef91906141fd565b610b59565b604051610301919061551a565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c919061416a565b610bc0565b60405161033e919061507d565b60405180910390f35b34801561035357600080fd5b5061035c610c27565b6040516103699190615098565b60405180910390f35b34801561037e57600080fd5b50610399600480360381019061039491906141fd565b610cc9565b6040516103a69190614fbd565b60405180910390f35b3480156103bb57600080fd5b506103c4610d4e565b6040516103d1919061551a565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc919061408a565b610d54565b005b34801561040f57600080fd5b5061042a600480360381019061042591906141bc565b610e6c565b005b34801561043857600080fd5b50610441610f02565b60405161044e919061551a565b60405180910390f35b34801561046357600080fd5b5061046c610f13565b6040516104799190615098565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613f84565b610fb1565b005b3480156104b757600080fd5b506104c0611011565b6040516104cd919061507d565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906141fd565b611024565b005b34801561050b57600080fd5b50610526600480360381019061052191906140c6565b6110aa565b604051610533919061507d565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e919061408a565b6112ee565b604051610570919061551a565b60405180910390f35b34801561058557600080fd5b5061058e611349565b005b34801561059c57600080fd5b506105a5611414565b6040516105b2919061551a565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190613f84565b61141a565b005b3480156105f057600080fd5b5061060b60048036038101906106069190613ef6565b61143a565b005b34801561061957600080fd5b506106226114fa565b005b34801561063057600080fd5b5061064b600480360381019061064691906141fd565b6116ae565b604051610658919061551a565b60405180910390f35b34801561066d57600080fd5b506106766116d1565b604051610683919061507d565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906141bc565b6116e4565b005b3480156106c157600080fd5b506106dc60048036038101906106d791906141fd565b61176c565b6040516106e99190614fbd565b60405180910390f35b3480156106fe57600080fd5b506107196004803603810190610714919061408a565b6117a3565b005b34801561072757600080fd5b506107306118d3565b60405161073d9190615098565b60405180910390f35b34801561075257600080fd5b5061075b611975565b005b34801561076957600080fd5b50610784600480360381019061077f9190613ef6565b611a1d565b604051610791919061551a565b60405180910390f35b3480156107a657600080fd5b506107af611adc565b005b3480156107bd57600080fd5b506107c6611c19565b6040516107d3919061551a565b60405180910390f35b3480156107e857600080fd5b506107f1611c1f565b6040516107fe919061551a565b60405180910390f35b34801561081357600080fd5b5061082e60048036038101906108299190613ef6565b611c24565b60405161083b919061505b565b60405180910390f35b34801561085057600080fd5b50610859611d1d565b604051610866919061507d565b60405180910390f35b34801561087b57600080fd5b50610884611d30565b6040516108919190614fbd565b60405180910390f35b3480156108a657600080fd5b506108af611d5a565b6040516108bc9190615098565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e7919061404e565b611dfc565b005b3480156108fa57600080fd5b50610903611f7d565b005b34801561091157600080fd5b5061092c60048036038101906109279190613ef6565b612025565b604051610939919061507d565b60405180910390f35b34801561094e57600080fd5b5061095761207b565b604051610964919061507d565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f9190613fd3565b61208e565b005b6109b060048036038101906109ab91906141fd565b6120f0565b005b3480156109be57600080fd5b506109c761230f565b6040516109d49190614fbd565b60405180910390f35b3480156109e957600080fd5b50610a0460048036038101906109ff91906141fd565b612335565b604051610a119190615098565b60405180910390f35b610a346004803603810190610a2f91906141fd565b6124b8565b005b348015610a4257600080fd5b50610a5d6004803603810190610a5891906141fd565b61264b565b604051610a6a919061551a565b60405180910390f35b348015610a7f57600080fd5b50610a9a6004803603810190610a959190614129565b612663565b005b348015610aa857600080fd5b50610ac36004803603810190610abe9190613f48565b612767565b604051610ad0919061507d565b60405180910390f35b348015610ae557600080fd5b50610aee6127fb565b005b348015610afc57600080fd5b50610b056128a3565b005b348015610b1357600080fd5b50610b2e6004803603810190610b299190613ef6565b61294b565b005b348015610b3c57600080fd5b50610b576004803603810190610b5291906141fd565b612af7565b005b6000610b63610f02565b821115610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c906154da565b60405180910390fd5b600f6000838152602001908152602001600020549050919050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610cbf5780601f10610c9457610100808354040283529160200191610cbf565b820191906000526020600020905b815481529060010190602001808311610ca257829003601f168201915b5050505050905090565b6000610cd482612b7d565b610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a906153ba565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c5481565b6000610d5f8261176c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc79061545a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610def612b9a565b73ffffffffffffffffffffffffffffffffffffffff161480610e1e5750610e1d81610e18612b9a565b612767565b5b610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e549061531a565b60405180910390fd5b610e678383612ba2565b505050565b610e74612b9a565b73ffffffffffffffffffffffffffffffffffffffff16610e92611d30565b73ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf906153da565b60405180910390fd5b80600b9080519060200190610efe929190613c67565b5050565b6000610f0e6002612c5b565b905090565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fa95780601f10610f7e57610100808354040283529160200191610fa9565b820191906000526020600020905b815481529060010190602001808311610f8c57829003601f168201915b505050505081565b610fc2610fbc612b9a565b82612c70565b611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff89061549a565b60405180910390fd5b61100c838383612d4e565b505050565b600e60029054906101000a900460ff1681565b61102c612b9a565b73ffffffffffffffffffffffffffffffffffffffff1661104a611d30565b73ffffffffffffffffffffffffffffffffffffffff16146110a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611097906153da565b60405180910390fd5b80600d8190555050565b6000600e60019054906101000a900460ff166110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f2906151da565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1661111b8461176c565b73ffffffffffffffffffffffffffffffffffffffff1614611171576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611168906154fa565b60405180910390fd5b6000600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b81526004016111e8919061551a565b60206040518083038186803b15801561120057600080fd5b505afa158015611214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112389190613f1f565b73ffffffffffffffffffffffffffffffffffffffff161461128e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611285906151fa565b60405180910390fd5b82600f6000868152602001908152602001600020819055507fca5868f22b66cf6d4984769dace93e37cb3fb54543ff049883fa74649a1069793385856040516112d993929190615024565b60405180910390a16001915050949350505050565b600061134182600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612f6590919063ffffffff16565b905092915050565b611351612b9a565b73ffffffffffffffffffffffffffffffffffffffff1661136f611d30565b73ffffffffffffffffffffffffffffffffffffffff16146113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc906153da565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611410573d6000803e3d6000fd5b5050565b60125481565b6114358383836040518060200160405280600081525061208e565b505050565b611442612b9a565b73ffffffffffffffffffffffffffffffffffffffff16611460611d30565b73ffffffffffffffffffffffffffffffffffffffff16146114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad906153da565b60405180910390fd5b80600e60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60116000611506612b9a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561158e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115859061547a565b60405180910390fd5b60016011600061159c612b9a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600e60039054906101000a900460ff1661163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906152fa565b60405180910390fd5b600d5461165a600161164c610f02565b612f7f90919063ffffffff16565b111561169b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116929061511a565b60405180910390fd5b6116ac336116a7610f02565b612fd4565b565b6000806116c5836002612ff290919063ffffffff16565b50905080915050919050565b600e60039054906101000a900460ff1681565b6116ec612b9a565b73ffffffffffffffffffffffffffffffffffffffff1661170a611d30565b73ffffffffffffffffffffffffffffffffffffffff1614611760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611757906153da565b60405180910390fd5b6117698161301e565b50565b600061179c826040518060600160405280602981526020016158196029913960026130389092919063ffffffff16565b9050919050565b6117ab612b9a565b73ffffffffffffffffffffffffffffffffffffffff166117c9611d30565b73ffffffffffffffffffffffffffffffffffffffff161461181f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611816906153da565b60405180910390fd5b6000611829610f02565b905060008211801561184f5750600d5461184c8383612f7f90919063ffffffff16565b11155b61188e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118859061543a565b60405180910390fd5b60005b828110156118b2576118a584828401612fd4565b8080600101915050611891565b506118c88260125461305790919063ffffffff16565b601281905550505050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561196b5780601f106119405761010080835404028352916020019161196b565b820191906000526020600020905b81548152906001019060200180831161194e57829003601f168201915b5050505050905090565b61197d612b9a565b73ffffffffffffffffffffffffffffffffffffffff1661199b611d30565b73ffffffffffffffffffffffffffffffffffffffff16146119f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e8906153da565b60405180910390fd5b600e60039054906101000a900460ff1615600e60036101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a859061533a565b60405180910390fd5b611ad5600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a7565b9050919050565b611ae4612b9a565b73ffffffffffffffffffffffffffffffffffffffff16611b02611d30565b73ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f906153da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600d5481565b601481565b60606000611c3183611a1d565b90506000811415611c8c57600067ffffffffffffffff81118015611c5457600080fd5b50604051908082528060200260200182016040528015611c835781602001602082028036833780820191505090505b50915050611d18565b60008167ffffffffffffffff81118015611ca557600080fd5b50604051908082528060200260200182016040528015611cd45781602001602082028036833780820191505090505b50905060005b82811015611d1157611cec85826112ee565b828281518110611cf857fe5b6020026020010181815250508080600101915050611cda565b8193505050505b919050565b600e60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611df25780601f10611dc757610100808354040283529160200191611df2565b820191906000526020600020905b815481529060010190602001808311611dd557829003601f168201915b5050505050905090565b611e04612b9a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e699061523a565b60405180910390fd5b8060056000611e7f612b9a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f2c612b9a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f71919061507d565b60405180910390a35050565b611f85612b9a565b73ffffffffffffffffffffffffffffffffffffffff16611fa3611d30565b73ffffffffffffffffffffffffffffffffffffffff1614611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff0906153da565b60405180910390fd5b600e60029054906101000a900460ff1615600e60026101000a81548160ff021916908315150217905550565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600e60019054906101000a900460ff1681565b61209f612099612b9a565b83612c70565b6120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d59061549a565b60405180910390fd5b6120ea848484846130bc565b50505050565b600e60009054906101000a900460ff1661213f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612136906150ba565b60405180910390fd5b600081118015612150575060148111155b61218f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612186906151ba565b60405180910390fd5b600d546121ac8261219e610f02565b612f7f90919063ffffffff16565b11156121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e49061511a565b60405180910390fd5b61220281600c5461311890919063ffffffff16565b341015612244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223b9061525a565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c79061529a565b60405180910390fd5b60005b8181101561230b57600d546122e6610f02565b10156122fe576122fd336122f8610f02565b612fd4565b5b80806001019150506122d3565b5050565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061234082612b7d565b61237f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123769061541a565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124285780601f106123fd57610100808354040283529160200191612428565b820191906000526020600020905b81548152906001019060200180831161240b57829003601f168201915b5050505050905060006124396118d3565b905060008151141561244f5781925050506124b3565b60008251111561248457808260405160200161246c929190614f99565b604051602081830303815290604052925050506124b3565b8061248e85613188565b60405160200161249f929190614f99565b604051602081830303815290604052925050505b919050565b600e60029054906101000a900460ff16612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe906150fa565b60405180910390fd5b600081118015612518575060148111155b612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e906151ba565b60405180910390fd5b600d5461257482612566610f02565b612f7f90919063ffffffff16565b11156125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac9061511a565b60405180910390fd5b6125ca81600c5461311890919063ffffffff16565b34101561260c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126039061525a565b60405180910390fd5b60005b8181101561264757600d54612622610f02565b101561263a5761263933612634610f02565b612fd4565b5b808060010191505061260f565b5050565b600f6020528060005260406000206000915090505481565b61266b612b9a565b73ffffffffffffffffffffffffffffffffffffffff16612689611d30565b73ffffffffffffffffffffffffffffffffffffffff16146126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d6906153da565b60405180910390fd5b60005b8151811015612763576001601060008484815181106126fd57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506126e2565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612803612b9a565b73ffffffffffffffffffffffffffffffffffffffff16612821611d30565b73ffffffffffffffffffffffffffffffffffffffff1614612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e906153da565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b6128ab612b9a565b73ffffffffffffffffffffffffffffffffffffffff166128c9611d30565b73ffffffffffffffffffffffffffffffffffffffff161461291f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612916906153da565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b612953612b9a565b73ffffffffffffffffffffffffffffffffffffffff16612971611d30565b73ffffffffffffffffffffffffffffffffffffffff16146129c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129be906153da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e9061515a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612aff612b9a565b73ffffffffffffffffffffffffffffffffffffffff16612b1d611d30565b73ffffffffffffffffffffffffffffffffffffffff1614612b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6a906153da565b60405180910390fd5b80600c8190555050565b6000612b938260026132cf90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c158361176c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612c69826000016132e9565b9050919050565b6000612c7b82612b7d565b612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb1906152da565b60405180910390fd5b6000612cc58361176c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d3457508373ffffffffffffffffffffffffffffffffffffffff16612d1c84610cc9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d455750612d448185612767565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d6e8261176c565b73ffffffffffffffffffffffffffffffffffffffff1614612dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbb906153fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2b9061521a565b60405180910390fd5b612e3f8383836132fa565b612e4a600082612ba2565b612e9b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206132ff90919063ffffffff16565b50612eed81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061331990919063ffffffff16565b50612f04818360026133339092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612f748360000183613368565b60001c905092915050565b600080828401905083811015612fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc19061519a565b60405180910390fd5b8091505092915050565b612fee8282604051806020016040528060008152506133d5565b5050565b6000806000806130058660000186613430565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190613034929190613c67565b5050565b600061304b846000018460001b846134b3565b60001c90509392505050565b60008282111561309c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130939061527a565b60405180910390fd5b818303905092915050565b60006130b582600001613544565b9050919050565b6130c7848484612d4e565b6130d384848484613555565b613112576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131099061513a565b60405180910390fd5b50505050565b60008083141561312b5760009050613182565b600082840290508284828161313c57fe5b041461317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131749061539a565b60405180910390fd5b809150505b92915050565b606060008214156131d0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132ca565b600082905060005b600082146131fa578080600101915050600a82816131f257fe5b0491506131d8565b60008167ffffffffffffffff8111801561321357600080fd5b506040519080825280601f01601f1916602001820160405280156132465781602001600182028036833780820191505090505b50905060006001830390508593505b600084146132c257600a848161326757fe5b0660300160f81b8282806001900393508151811061328157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816132ba57fe5b049350613255565b819450505050505b919050565b60006132e1836000018360001b6136b9565b905092915050565b600081600001805490509050919050565b505050565b6000613311836000018360001b6136dc565b905092915050565b600061332b836000018360001b6137c4565b905092915050565b600061335f846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613834565b90509392505050565b6000818360000180549050116133b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133aa906150da565b60405180910390fd5b8260000182815481106133c257fe5b9060005260206000200154905092915050565b6133df8383613910565b6133ec6000848484613555565b61342b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134229061513a565b60405180910390fd5b505050565b6000808284600001805490501161347c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134739061535a565b60405180910390fd5b600084600001848154811061348d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c9190615098565b60405180910390fd5b5084600001600182038154811061352857fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006135768473ffffffffffffffffffffffffffffffffffffffff16613a9e565b61358357600190506136b1565b600061364a63150b7a0260e01b613598612b9a565b8887876040516024016135ae9493929190614fd8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016157e7603291398773ffffffffffffffffffffffffffffffffffffffff16613ab19092919063ffffffff16565b90506000818060200190518101906136629190614193565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146137b8576000600182039050600060018660000180549050039050600086600001828154811061372757fe5b906000526020600020015490508087600001848154811061374457fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061377c57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506137be565b60009150505b92915050565b60006137d08383613ac9565b61382957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061382e565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156138db57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613909565b828560000160018303815481106138ee57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613980576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139779061537a565b60405180910390fd5b61398981612b7d565b156139c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c09061517a565b60405180910390fd5b6139d5600083836132fa565b613a2681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061331990919063ffffffff16565b50613a3d818360026133339092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613ac08484600085613aec565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b28906152ba565b60405180910390fd5b613b3a85613a9e565b613b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b70906154ba565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613ba29190614f82565b60006040518083038185875af1925050503d8060008114613bdf576040519150601f19603f3d011682016040523d82523d6000602084013e613be4565b606091505b5091509150613bf4828286613c00565b92505050949350505050565b60608315613c1057829050613c60565b600083511115613c235782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c579190615098565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613c9d5760008555613ce4565b82601f10613cb657805160ff1916838001178555613ce4565b82800160010185558215613ce4579182015b82811115613ce3578251825591602001919060010190613cc8565b5b509050613cf19190613cf5565b5090565b5b80821115613d0e576000816000905550600101613cf6565b5090565b6000613d25613d2084615566565b615535565b90508083825260208201905082856020860282011115613d4457600080fd5b60005b85811015613d745781613d5a8882613dfa565b845260208401935060208301925050600181019050613d47565b5050509392505050565b6000613d91613d8c84615592565b615535565b905082815260208101848484011115613da957600080fd5b613db4848285615735565b509392505050565b6000613dcf613dca846155c2565b615535565b905082815260208101848484011115613de757600080fd5b613df2848285615735565b509392505050565b600081359050613e098161578a565b92915050565b600081519050613e1e8161578a565b92915050565b600082601f830112613e3557600080fd5b8135613e45848260208601613d12565b91505092915050565b600081359050613e5d816157a1565b92915050565b600081359050613e72816157b8565b92915050565b600081519050613e87816157b8565b92915050565b600082601f830112613e9e57600080fd5b8135613eae848260208601613d7e565b91505092915050565b600082601f830112613ec857600080fd5b8135613ed8848260208601613dbc565b91505092915050565b600081359050613ef0816157cf565b92915050565b600060208284031215613f0857600080fd5b6000613f1684828501613dfa565b91505092915050565b600060208284031215613f3157600080fd5b6000613f3f84828501613e0f565b91505092915050565b60008060408385031215613f5b57600080fd5b6000613f6985828601613dfa565b9250506020613f7a85828601613dfa565b9150509250929050565b600080600060608486031215613f9957600080fd5b6000613fa786828701613dfa565b9350506020613fb886828701613dfa565b9250506040613fc986828701613ee1565b9150509250925092565b60008060008060808587031215613fe957600080fd5b6000613ff787828801613dfa565b945050602061400887828801613dfa565b935050604061401987828801613ee1565b925050606085013567ffffffffffffffff81111561403657600080fd5b61404287828801613e8d565b91505092959194509250565b6000806040838503121561406157600080fd5b600061406f85828601613dfa565b925050602061408085828601613e4e565b9150509250929050565b6000806040838503121561409d57600080fd5b60006140ab85828601613dfa565b92505060206140bc85828601613ee1565b9150509250929050565b600080600080608085870312156140dc57600080fd5b60006140ea87828801613dfa565b94505060206140fb87828801613ee1565b935050604061410c87828801613ee1565b925050606061411d87828801613ee1565b91505092959194509250565b60006020828403121561413b57600080fd5b600082013567ffffffffffffffff81111561415557600080fd5b61416184828501613e24565b91505092915050565b60006020828403121561417c57600080fd5b600061418a84828501613e63565b91505092915050565b6000602082840312156141a557600080fd5b60006141b384828501613e78565b91505092915050565b6000602082840312156141ce57600080fd5b600082013567ffffffffffffffff8111156141e857600080fd5b6141f484828501613eb7565b91505092915050565b60006020828403121561420f57600080fd5b600061421d84828501613ee1565b91505092915050565b60006142328383614f64565b60208301905092915050565b614247816156ff565b82525050565b6142568161568b565b82525050565b61426581615679565b82525050565b600061427682615602565b6142808185615630565b935061428b836155f2565b8060005b838110156142bc5781516142a38882614226565b97506142ae83615623565b92505060018101905061428f565b5085935050505092915050565b6142d28161569d565b82525050565b60006142e38261560d565b6142ed8185615641565b93506142fd818560208601615744565b61430681615779565b840191505092915050565b600061431c8261560d565b6143268185615652565b9350614336818560208601615744565b80840191505092915050565b600061434d82615618565b614357818561565d565b9350614367818560208601615744565b61437081615779565b840191505092915050565b600061438682615618565b614390818561566e565b93506143a0818560208601615744565b80840191505092915050565b60006143b960248361565d565b91507f5072652053616c65206d7573742062652061637469766520746f206d696e742060008301527f6d656b61000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061441f60228361565d565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061448560208361565d565b91507f53616c65206d7573742062652061637469766520746f206d696e74206d656b616000830152602082019050919050565b60006144c560298361565d565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66206d656b617300000000000000000000000000000000000000000000006020830152604082019050919050565b600061452b60328361565d565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061459160268361565d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145f7601c8361565d565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614637601b8361565d565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614677601f8361565d565b91507f43616e206f6e6c79206d696e74203230206d656b6120617420612074696d65006000830152602082019050919050565b60006146b760238361565d565b91507f436f6d706f7365206973206e6f742061637469766520617420746865206d6f6d60008301527f656e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061471d601b8361565d565b91507f596f7520646f206e6f742068617665207468697320776561706f6e00000000006000830152602082019050919050565b600061475d60248361565d565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147c360198361565d565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614803601f8361565d565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614843601e8361565d565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061488360188361565d565b91507f596f7520617265206e6f7420696e2077686974656c69737400000000000000006000830152602082019050919050565b60006148c360268361565d565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614929602c8361565d565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061498f60228361565d565b91507f436c61696d206d7573742062652061637469766520746f206d696e74206d656b60008301527f61730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149f560388361565d565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614a5b602a8361565d565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ac160228361565d565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b2760208361565d565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614b6760218361565d565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614bcd602c8361565d565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614c3360208361565d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614c7360298361565d565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cd9602f8361565d565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614d3f60178361565d565b91507f4e6f7420656e6f7567682072657365727665206c6566740000000000000000006000830152602082019050919050565b6000614d7f60218361565d565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614de560128361565d565b91507f43616e206f6e6c79206d696e74206f6e636500000000000000000000000000006000830152602082019050919050565b6000614e2560318361565d565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614e8b601d8361565d565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614ecb60238361565d565b91507f494420776f756c6420657863656564206d617820737570706c79206f66206d6560008301527f6b617300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f3160198361565d565b91507f596f7520646f206e6f7420686176652074686973206d656b61000000000000006000830152602082019050919050565b614f6d816156f5565b82525050565b614f7c816156f5565b82525050565b6000614f8e8284614311565b915081905092915050565b6000614fa5828561437b565b9150614fb1828461437b565b91508190509392505050565b6000602082019050614fd2600083018461425c565b92915050565b6000608082019050614fed600083018761424d565b614ffa602083018661425c565b6150076040830185614f73565b818103606083015261501981846142d8565b905095945050505050565b6000606082019050615039600083018661423e565b6150466020830185614f73565b6150536040830184614f73565b949350505050565b60006020820190508181036000830152615075818461426b565b905092915050565b600060208201905061509260008301846142c9565b92915050565b600060208201905081810360008301526150b28184614342565b905092915050565b600060208201905081810360008301526150d3816143ac565b9050919050565b600060208201905081810360008301526150f381614412565b9050919050565b6000602082019050818103600083015261511381614478565b9050919050565b60006020820190508181036000830152615133816144b8565b9050919050565b600060208201905081810360008301526151538161451e565b9050919050565b6000602082019050818103600083015261517381614584565b9050919050565b60006020820190508181036000830152615193816145ea565b9050919050565b600060208201905081810360008301526151b38161462a565b9050919050565b600060208201905081810360008301526151d38161466a565b9050919050565b600060208201905081810360008301526151f3816146aa565b9050919050565b6000602082019050818103600083015261521381614710565b9050919050565b6000602082019050818103600083015261523381614750565b9050919050565b60006020820190508181036000830152615253816147b6565b9050919050565b60006020820190508181036000830152615273816147f6565b9050919050565b6000602082019050818103600083015261529381614836565b9050919050565b600060208201905081810360008301526152b381614876565b9050919050565b600060208201905081810360008301526152d3816148b6565b9050919050565b600060208201905081810360008301526152f38161491c565b9050919050565b6000602082019050818103600083015261531381614982565b9050919050565b60006020820190508181036000830152615333816149e8565b9050919050565b6000602082019050818103600083015261535381614a4e565b9050919050565b6000602082019050818103600083015261537381614ab4565b9050919050565b6000602082019050818103600083015261539381614b1a565b9050919050565b600060208201905081810360008301526153b381614b5a565b9050919050565b600060208201905081810360008301526153d381614bc0565b9050919050565b600060208201905081810360008301526153f381614c26565b9050919050565b6000602082019050818103600083015261541381614c66565b9050919050565b6000602082019050818103600083015261543381614ccc565b9050919050565b6000602082019050818103600083015261545381614d32565b9050919050565b6000602082019050818103600083015261547381614d72565b9050919050565b6000602082019050818103600083015261549381614dd8565b9050919050565b600060208201905081810360008301526154b381614e18565b9050919050565b600060208201905081810360008301526154d381614e7e565b9050919050565b600060208201905081810360008301526154f381614ebe565b9050919050565b6000602082019050818103600083015261551381614f24565b9050919050565b600060208201905061552f6000830184614f73565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561555c5761555b615777565b5b8060405250919050565b600067ffffffffffffffff82111561558157615580615777565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156155ad576155ac615777565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156155dd576155dc615777565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615684826156d5565b9050919050565b6000615696826156d5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061570a82615711565b9050919050565b600061571c82615723565b9050919050565b600061572e826156d5565b9050919050565b82818337600083830152505050565b60005b83811015615762578082015181840152602081019050615747565b83811115615771576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b61579381615679565b811461579e57600080fd5b50565b6157aa8161569d565b81146157b557600080fd5b50565b6157c1816156a9565b81146157cc57600080fd5b50565b6157d8816156f5565b81146157e357600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220eea733e75bd9abd5be9baef7223d04a72fe1b57ac4d930093a49d1fb236a4aba64736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102c85760003560e01c80636d60e6c111610175578063b7d16640116100dc578063df21f95711610095578063eb7a33331161006f578063eb7a333314610ad9578063f032554914610af0578063f2fde38b14610b07578063f4a0a52814610b30576102c8565b8063df21f95714610a36578063e2e1796314610a73578063e985e9c514610a9c576102c8565b8063b7d1664014610942578063b88d4fde1461096d578063c37550b214610996578063c37fae9b146109b2578063c87b56dd146109dd578063d790c8c714610a1a576102c8565b806386ed1a541161012e57806386ed1a54146108445780638da5cb5b1461086f57806395d89b411461089a578063a22cb465146108c5578063a66bcb8c146108ee578063af7420a314610905576102c8565b80636d60e6c11461074657806370a082311461075d578063715018a61461079a5780637fbc15cf146107b15780638263e4c4146107dc5780638462151c14610807576102c8565b80632d807405116102345780634e71d92d116101ed57806355f804b3116101c757806355f804b31461068c5780636352211e146106b5578063641cc9d4146106f25780636c0360eb1461071b576102c8565b80634e71d92d1461060d5780634f6ccce7146106245780635303f68c14610661576102c8565b80632d807405146104ff5780632f745c591461053c5780633ccfd60b146105795780633f495e5d1461059057806342842e0e146105bb5780634e315efc146105e4576102c8565b80631096952311610286578063109695231461040357806318160ddd1461042c5780631a36a7dc1461045757806323b872dd146104825780632a3800e4146104ab5780632b48bfbd146104d6576102c8565b806215f6dd146102cd57806301ffc9a71461030a57806306fdde0314610347578063081812fc146103725780630821a1ae146103af578063095ea7b3146103da575b600080fd5b3480156102d957600080fd5b506102f460048036038101906102ef91906141fd565b610b59565b604051610301919061551a565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c919061416a565b610bc0565b60405161033e919061507d565b60405180910390f35b34801561035357600080fd5b5061035c610c27565b6040516103699190615098565b60405180910390f35b34801561037e57600080fd5b50610399600480360381019061039491906141fd565b610cc9565b6040516103a69190614fbd565b60405180910390f35b3480156103bb57600080fd5b506103c4610d4e565b6040516103d1919061551a565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc919061408a565b610d54565b005b34801561040f57600080fd5b5061042a600480360381019061042591906141bc565b610e6c565b005b34801561043857600080fd5b50610441610f02565b60405161044e919061551a565b60405180910390f35b34801561046357600080fd5b5061046c610f13565b6040516104799190615098565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613f84565b610fb1565b005b3480156104b757600080fd5b506104c0611011565b6040516104cd919061507d565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906141fd565b611024565b005b34801561050b57600080fd5b50610526600480360381019061052191906140c6565b6110aa565b604051610533919061507d565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e919061408a565b6112ee565b604051610570919061551a565b60405180910390f35b34801561058557600080fd5b5061058e611349565b005b34801561059c57600080fd5b506105a5611414565b6040516105b2919061551a565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190613f84565b61141a565b005b3480156105f057600080fd5b5061060b60048036038101906106069190613ef6565b61143a565b005b34801561061957600080fd5b506106226114fa565b005b34801561063057600080fd5b5061064b600480360381019061064691906141fd565b6116ae565b604051610658919061551a565b60405180910390f35b34801561066d57600080fd5b506106766116d1565b604051610683919061507d565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906141bc565b6116e4565b005b3480156106c157600080fd5b506106dc60048036038101906106d791906141fd565b61176c565b6040516106e99190614fbd565b60405180910390f35b3480156106fe57600080fd5b506107196004803603810190610714919061408a565b6117a3565b005b34801561072757600080fd5b506107306118d3565b60405161073d9190615098565b60405180910390f35b34801561075257600080fd5b5061075b611975565b005b34801561076957600080fd5b50610784600480360381019061077f9190613ef6565b611a1d565b604051610791919061551a565b60405180910390f35b3480156107a657600080fd5b506107af611adc565b005b3480156107bd57600080fd5b506107c6611c19565b6040516107d3919061551a565b60405180910390f35b3480156107e857600080fd5b506107f1611c1f565b6040516107fe919061551a565b60405180910390f35b34801561081357600080fd5b5061082e60048036038101906108299190613ef6565b611c24565b60405161083b919061505b565b60405180910390f35b34801561085057600080fd5b50610859611d1d565b604051610866919061507d565b60405180910390f35b34801561087b57600080fd5b50610884611d30565b6040516108919190614fbd565b60405180910390f35b3480156108a657600080fd5b506108af611d5a565b6040516108bc9190615098565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e7919061404e565b611dfc565b005b3480156108fa57600080fd5b50610903611f7d565b005b34801561091157600080fd5b5061092c60048036038101906109279190613ef6565b612025565b604051610939919061507d565b60405180910390f35b34801561094e57600080fd5b5061095761207b565b604051610964919061507d565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f9190613fd3565b61208e565b005b6109b060048036038101906109ab91906141fd565b6120f0565b005b3480156109be57600080fd5b506109c761230f565b6040516109d49190614fbd565b60405180910390f35b3480156109e957600080fd5b50610a0460048036038101906109ff91906141fd565b612335565b604051610a119190615098565b60405180910390f35b610a346004803603810190610a2f91906141fd565b6124b8565b005b348015610a4257600080fd5b50610a5d6004803603810190610a5891906141fd565b61264b565b604051610a6a919061551a565b60405180910390f35b348015610a7f57600080fd5b50610a9a6004803603810190610a959190614129565b612663565b005b348015610aa857600080fd5b50610ac36004803603810190610abe9190613f48565b612767565b604051610ad0919061507d565b60405180910390f35b348015610ae557600080fd5b50610aee6127fb565b005b348015610afc57600080fd5b50610b056128a3565b005b348015610b1357600080fd5b50610b2e6004803603810190610b299190613ef6565b61294b565b005b348015610b3c57600080fd5b50610b576004803603810190610b5291906141fd565b612af7565b005b6000610b63610f02565b821115610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c906154da565b60405180910390fd5b600f6000838152602001908152602001600020549050919050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610cbf5780601f10610c9457610100808354040283529160200191610cbf565b820191906000526020600020905b815481529060010190602001808311610ca257829003601f168201915b5050505050905090565b6000610cd482612b7d565b610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a906153ba565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c5481565b6000610d5f8261176c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc79061545a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610def612b9a565b73ffffffffffffffffffffffffffffffffffffffff161480610e1e5750610e1d81610e18612b9a565b612767565b5b610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e549061531a565b60405180910390fd5b610e678383612ba2565b505050565b610e74612b9a565b73ffffffffffffffffffffffffffffffffffffffff16610e92611d30565b73ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf906153da565b60405180910390fd5b80600b9080519060200190610efe929190613c67565b5050565b6000610f0e6002612c5b565b905090565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fa95780601f10610f7e57610100808354040283529160200191610fa9565b820191906000526020600020905b815481529060010190602001808311610f8c57829003601f168201915b505050505081565b610fc2610fbc612b9a565b82612c70565b611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff89061549a565b60405180910390fd5b61100c838383612d4e565b505050565b600e60029054906101000a900460ff1681565b61102c612b9a565b73ffffffffffffffffffffffffffffffffffffffff1661104a611d30565b73ffffffffffffffffffffffffffffffffffffffff16146110a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611097906153da565b60405180910390fd5b80600d8190555050565b6000600e60019054906101000a900460ff166110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f2906151da565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1661111b8461176c565b73ffffffffffffffffffffffffffffffffffffffff1614611171576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611168906154fa565b60405180910390fd5b6000600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b81526004016111e8919061551a565b60206040518083038186803b15801561120057600080fd5b505afa158015611214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112389190613f1f565b73ffffffffffffffffffffffffffffffffffffffff161461128e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611285906151fa565b60405180910390fd5b82600f6000868152602001908152602001600020819055507fca5868f22b66cf6d4984769dace93e37cb3fb54543ff049883fa74649a1069793385856040516112d993929190615024565b60405180910390a16001915050949350505050565b600061134182600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612f6590919063ffffffff16565b905092915050565b611351612b9a565b73ffffffffffffffffffffffffffffffffffffffff1661136f611d30565b73ffffffffffffffffffffffffffffffffffffffff16146113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc906153da565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611410573d6000803e3d6000fd5b5050565b60125481565b6114358383836040518060200160405280600081525061208e565b505050565b611442612b9a565b73ffffffffffffffffffffffffffffffffffffffff16611460611d30565b73ffffffffffffffffffffffffffffffffffffffff16146114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad906153da565b60405180910390fd5b80600e60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60116000611506612b9a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561158e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115859061547a565b60405180910390fd5b60016011600061159c612b9a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600e60039054906101000a900460ff1661163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906152fa565b60405180910390fd5b600d5461165a600161164c610f02565b612f7f90919063ffffffff16565b111561169b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116929061511a565b60405180910390fd5b6116ac336116a7610f02565b612fd4565b565b6000806116c5836002612ff290919063ffffffff16565b50905080915050919050565b600e60039054906101000a900460ff1681565b6116ec612b9a565b73ffffffffffffffffffffffffffffffffffffffff1661170a611d30565b73ffffffffffffffffffffffffffffffffffffffff1614611760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611757906153da565b60405180910390fd5b6117698161301e565b50565b600061179c826040518060600160405280602981526020016158196029913960026130389092919063ffffffff16565b9050919050565b6117ab612b9a565b73ffffffffffffffffffffffffffffffffffffffff166117c9611d30565b73ffffffffffffffffffffffffffffffffffffffff161461181f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611816906153da565b60405180910390fd5b6000611829610f02565b905060008211801561184f5750600d5461184c8383612f7f90919063ffffffff16565b11155b61188e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118859061543a565b60405180910390fd5b60005b828110156118b2576118a584828401612fd4565b8080600101915050611891565b506118c88260125461305790919063ffffffff16565b601281905550505050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561196b5780601f106119405761010080835404028352916020019161196b565b820191906000526020600020905b81548152906001019060200180831161194e57829003601f168201915b5050505050905090565b61197d612b9a565b73ffffffffffffffffffffffffffffffffffffffff1661199b611d30565b73ffffffffffffffffffffffffffffffffffffffff16146119f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e8906153da565b60405180910390fd5b600e60039054906101000a900460ff1615600e60036101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a859061533a565b60405180910390fd5b611ad5600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a7565b9050919050565b611ae4612b9a565b73ffffffffffffffffffffffffffffffffffffffff16611b02611d30565b73ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f906153da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600d5481565b601481565b60606000611c3183611a1d565b90506000811415611c8c57600067ffffffffffffffff81118015611c5457600080fd5b50604051908082528060200260200182016040528015611c835781602001602082028036833780820191505090505b50915050611d18565b60008167ffffffffffffffff81118015611ca557600080fd5b50604051908082528060200260200182016040528015611cd45781602001602082028036833780820191505090505b50905060005b82811015611d1157611cec85826112ee565b828281518110611cf857fe5b6020026020010181815250508080600101915050611cda565b8193505050505b919050565b600e60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611df25780601f10611dc757610100808354040283529160200191611df2565b820191906000526020600020905b815481529060010190602001808311611dd557829003601f168201915b5050505050905090565b611e04612b9a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e699061523a565b60405180910390fd5b8060056000611e7f612b9a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f2c612b9a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f71919061507d565b60405180910390a35050565b611f85612b9a565b73ffffffffffffffffffffffffffffffffffffffff16611fa3611d30565b73ffffffffffffffffffffffffffffffffffffffff1614611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff0906153da565b60405180910390fd5b600e60029054906101000a900460ff1615600e60026101000a81548160ff021916908315150217905550565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600e60019054906101000a900460ff1681565b61209f612099612b9a565b83612c70565b6120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d59061549a565b60405180910390fd5b6120ea848484846130bc565b50505050565b600e60009054906101000a900460ff1661213f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612136906150ba565b60405180910390fd5b600081118015612150575060148111155b61218f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612186906151ba565b60405180910390fd5b600d546121ac8261219e610f02565b612f7f90919063ffffffff16565b11156121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e49061511a565b60405180910390fd5b61220281600c5461311890919063ffffffff16565b341015612244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223b9061525a565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c79061529a565b60405180910390fd5b60005b8181101561230b57600d546122e6610f02565b10156122fe576122fd336122f8610f02565b612fd4565b5b80806001019150506122d3565b5050565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061234082612b7d565b61237f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123769061541a565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124285780601f106123fd57610100808354040283529160200191612428565b820191906000526020600020905b81548152906001019060200180831161240b57829003601f168201915b5050505050905060006124396118d3565b905060008151141561244f5781925050506124b3565b60008251111561248457808260405160200161246c929190614f99565b604051602081830303815290604052925050506124b3565b8061248e85613188565b60405160200161249f929190614f99565b604051602081830303815290604052925050505b919050565b600e60029054906101000a900460ff16612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe906150fa565b60405180910390fd5b600081118015612518575060148111155b612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e906151ba565b60405180910390fd5b600d5461257482612566610f02565b612f7f90919063ffffffff16565b11156125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac9061511a565b60405180910390fd5b6125ca81600c5461311890919063ffffffff16565b34101561260c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126039061525a565b60405180910390fd5b60005b8181101561264757600d54612622610f02565b101561263a5761263933612634610f02565b612fd4565b5b808060010191505061260f565b5050565b600f6020528060005260406000206000915090505481565b61266b612b9a565b73ffffffffffffffffffffffffffffffffffffffff16612689611d30565b73ffffffffffffffffffffffffffffffffffffffff16146126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d6906153da565b60405180910390fd5b60005b8151811015612763576001601060008484815181106126fd57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506126e2565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612803612b9a565b73ffffffffffffffffffffffffffffffffffffffff16612821611d30565b73ffffffffffffffffffffffffffffffffffffffff1614612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e906153da565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b6128ab612b9a565b73ffffffffffffffffffffffffffffffffffffffff166128c9611d30565b73ffffffffffffffffffffffffffffffffffffffff161461291f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612916906153da565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b612953612b9a565b73ffffffffffffffffffffffffffffffffffffffff16612971611d30565b73ffffffffffffffffffffffffffffffffffffffff16146129c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129be906153da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e9061515a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612aff612b9a565b73ffffffffffffffffffffffffffffffffffffffff16612b1d611d30565b73ffffffffffffffffffffffffffffffffffffffff1614612b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6a906153da565b60405180910390fd5b80600c8190555050565b6000612b938260026132cf90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c158361176c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612c69826000016132e9565b9050919050565b6000612c7b82612b7d565b612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb1906152da565b60405180910390fd5b6000612cc58361176c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d3457508373ffffffffffffffffffffffffffffffffffffffff16612d1c84610cc9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d455750612d448185612767565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d6e8261176c565b73ffffffffffffffffffffffffffffffffffffffff1614612dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbb906153fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2b9061521a565b60405180910390fd5b612e3f8383836132fa565b612e4a600082612ba2565b612e9b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206132ff90919063ffffffff16565b50612eed81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061331990919063ffffffff16565b50612f04818360026133339092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612f748360000183613368565b60001c905092915050565b600080828401905083811015612fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc19061519a565b60405180910390fd5b8091505092915050565b612fee8282604051806020016040528060008152506133d5565b5050565b6000806000806130058660000186613430565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190613034929190613c67565b5050565b600061304b846000018460001b846134b3565b60001c90509392505050565b60008282111561309c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130939061527a565b60405180910390fd5b818303905092915050565b60006130b582600001613544565b9050919050565b6130c7848484612d4e565b6130d384848484613555565b613112576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131099061513a565b60405180910390fd5b50505050565b60008083141561312b5760009050613182565b600082840290508284828161313c57fe5b041461317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131749061539a565b60405180910390fd5b809150505b92915050565b606060008214156131d0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132ca565b600082905060005b600082146131fa578080600101915050600a82816131f257fe5b0491506131d8565b60008167ffffffffffffffff8111801561321357600080fd5b506040519080825280601f01601f1916602001820160405280156132465781602001600182028036833780820191505090505b50905060006001830390508593505b600084146132c257600a848161326757fe5b0660300160f81b8282806001900393508151811061328157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816132ba57fe5b049350613255565b819450505050505b919050565b60006132e1836000018360001b6136b9565b905092915050565b600081600001805490509050919050565b505050565b6000613311836000018360001b6136dc565b905092915050565b600061332b836000018360001b6137c4565b905092915050565b600061335f846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613834565b90509392505050565b6000818360000180549050116133b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133aa906150da565b60405180910390fd5b8260000182815481106133c257fe5b9060005260206000200154905092915050565b6133df8383613910565b6133ec6000848484613555565b61342b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134229061513a565b60405180910390fd5b505050565b6000808284600001805490501161347c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134739061535a565b60405180910390fd5b600084600001848154811061348d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c9190615098565b60405180910390fd5b5084600001600182038154811061352857fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006135768473ffffffffffffffffffffffffffffffffffffffff16613a9e565b61358357600190506136b1565b600061364a63150b7a0260e01b613598612b9a565b8887876040516024016135ae9493929190614fd8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016157e7603291398773ffffffffffffffffffffffffffffffffffffffff16613ab19092919063ffffffff16565b90506000818060200190518101906136629190614193565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146137b8576000600182039050600060018660000180549050039050600086600001828154811061372757fe5b906000526020600020015490508087600001848154811061374457fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061377c57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506137be565b60009150505b92915050565b60006137d08383613ac9565b61382957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061382e565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156138db57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613909565b828560000160018303815481106138ee57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613980576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139779061537a565b60405180910390fd5b61398981612b7d565b156139c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c09061517a565b60405180910390fd5b6139d5600083836132fa565b613a2681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061331990919063ffffffff16565b50613a3d818360026133339092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613ac08484600085613aec565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b28906152ba565b60405180910390fd5b613b3a85613a9e565b613b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b70906154ba565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613ba29190614f82565b60006040518083038185875af1925050503d8060008114613bdf576040519150601f19603f3d011682016040523d82523d6000602084013e613be4565b606091505b5091509150613bf4828286613c00565b92505050949350505050565b60608315613c1057829050613c60565b600083511115613c235782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c579190615098565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613c9d5760008555613ce4565b82601f10613cb657805160ff1916838001178555613ce4565b82800160010185558215613ce4579182015b82811115613ce3578251825591602001919060010190613cc8565b5b509050613cf19190613cf5565b5090565b5b80821115613d0e576000816000905550600101613cf6565b5090565b6000613d25613d2084615566565b615535565b90508083825260208201905082856020860282011115613d4457600080fd5b60005b85811015613d745781613d5a8882613dfa565b845260208401935060208301925050600181019050613d47565b5050509392505050565b6000613d91613d8c84615592565b615535565b905082815260208101848484011115613da957600080fd5b613db4848285615735565b509392505050565b6000613dcf613dca846155c2565b615535565b905082815260208101848484011115613de757600080fd5b613df2848285615735565b509392505050565b600081359050613e098161578a565b92915050565b600081519050613e1e8161578a565b92915050565b600082601f830112613e3557600080fd5b8135613e45848260208601613d12565b91505092915050565b600081359050613e5d816157a1565b92915050565b600081359050613e72816157b8565b92915050565b600081519050613e87816157b8565b92915050565b600082601f830112613e9e57600080fd5b8135613eae848260208601613d7e565b91505092915050565b600082601f830112613ec857600080fd5b8135613ed8848260208601613dbc565b91505092915050565b600081359050613ef0816157cf565b92915050565b600060208284031215613f0857600080fd5b6000613f1684828501613dfa565b91505092915050565b600060208284031215613f3157600080fd5b6000613f3f84828501613e0f565b91505092915050565b60008060408385031215613f5b57600080fd5b6000613f6985828601613dfa565b9250506020613f7a85828601613dfa565b9150509250929050565b600080600060608486031215613f9957600080fd5b6000613fa786828701613dfa565b9350506020613fb886828701613dfa565b9250506040613fc986828701613ee1565b9150509250925092565b60008060008060808587031215613fe957600080fd5b6000613ff787828801613dfa565b945050602061400887828801613dfa565b935050604061401987828801613ee1565b925050606085013567ffffffffffffffff81111561403657600080fd5b61404287828801613e8d565b91505092959194509250565b6000806040838503121561406157600080fd5b600061406f85828601613dfa565b925050602061408085828601613e4e565b9150509250929050565b6000806040838503121561409d57600080fd5b60006140ab85828601613dfa565b92505060206140bc85828601613ee1565b9150509250929050565b600080600080608085870312156140dc57600080fd5b60006140ea87828801613dfa565b94505060206140fb87828801613ee1565b935050604061410c87828801613ee1565b925050606061411d87828801613ee1565b91505092959194509250565b60006020828403121561413b57600080fd5b600082013567ffffffffffffffff81111561415557600080fd5b61416184828501613e24565b91505092915050565b60006020828403121561417c57600080fd5b600061418a84828501613e63565b91505092915050565b6000602082840312156141a557600080fd5b60006141b384828501613e78565b91505092915050565b6000602082840312156141ce57600080fd5b600082013567ffffffffffffffff8111156141e857600080fd5b6141f484828501613eb7565b91505092915050565b60006020828403121561420f57600080fd5b600061421d84828501613ee1565b91505092915050565b60006142328383614f64565b60208301905092915050565b614247816156ff565b82525050565b6142568161568b565b82525050565b61426581615679565b82525050565b600061427682615602565b6142808185615630565b935061428b836155f2565b8060005b838110156142bc5781516142a38882614226565b97506142ae83615623565b92505060018101905061428f565b5085935050505092915050565b6142d28161569d565b82525050565b60006142e38261560d565b6142ed8185615641565b93506142fd818560208601615744565b61430681615779565b840191505092915050565b600061431c8261560d565b6143268185615652565b9350614336818560208601615744565b80840191505092915050565b600061434d82615618565b614357818561565d565b9350614367818560208601615744565b61437081615779565b840191505092915050565b600061438682615618565b614390818561566e565b93506143a0818560208601615744565b80840191505092915050565b60006143b960248361565d565b91507f5072652053616c65206d7573742062652061637469766520746f206d696e742060008301527f6d656b61000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061441f60228361565d565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061448560208361565d565b91507f53616c65206d7573742062652061637469766520746f206d696e74206d656b616000830152602082019050919050565b60006144c560298361565d565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66206d656b617300000000000000000000000000000000000000000000006020830152604082019050919050565b600061452b60328361565d565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061459160268361565d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145f7601c8361565d565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614637601b8361565d565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614677601f8361565d565b91507f43616e206f6e6c79206d696e74203230206d656b6120617420612074696d65006000830152602082019050919050565b60006146b760238361565d565b91507f436f6d706f7365206973206e6f742061637469766520617420746865206d6f6d60008301527f656e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061471d601b8361565d565b91507f596f7520646f206e6f742068617665207468697320776561706f6e00000000006000830152602082019050919050565b600061475d60248361565d565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147c360198361565d565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614803601f8361565d565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614843601e8361565d565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061488360188361565d565b91507f596f7520617265206e6f7420696e2077686974656c69737400000000000000006000830152602082019050919050565b60006148c360268361565d565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614929602c8361565d565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061498f60228361565d565b91507f436c61696d206d7573742062652061637469766520746f206d696e74206d656b60008301527f61730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149f560388361565d565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614a5b602a8361565d565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ac160228361565d565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b2760208361565d565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614b6760218361565d565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614bcd602c8361565d565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614c3360208361565d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614c7360298361565d565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cd9602f8361565d565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614d3f60178361565d565b91507f4e6f7420656e6f7567682072657365727665206c6566740000000000000000006000830152602082019050919050565b6000614d7f60218361565d565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614de560128361565d565b91507f43616e206f6e6c79206d696e74206f6e636500000000000000000000000000006000830152602082019050919050565b6000614e2560318361565d565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614e8b601d8361565d565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614ecb60238361565d565b91507f494420776f756c6420657863656564206d617820737570706c79206f66206d6560008301527f6b617300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f3160198361565d565b91507f596f7520646f206e6f7420686176652074686973206d656b61000000000000006000830152602082019050919050565b614f6d816156f5565b82525050565b614f7c816156f5565b82525050565b6000614f8e8284614311565b915081905092915050565b6000614fa5828561437b565b9150614fb1828461437b565b91508190509392505050565b6000602082019050614fd2600083018461425c565b92915050565b6000608082019050614fed600083018761424d565b614ffa602083018661425c565b6150076040830185614f73565b818103606083015261501981846142d8565b905095945050505050565b6000606082019050615039600083018661423e565b6150466020830185614f73565b6150536040830184614f73565b949350505050565b60006020820190508181036000830152615075818461426b565b905092915050565b600060208201905061509260008301846142c9565b92915050565b600060208201905081810360008301526150b28184614342565b905092915050565b600060208201905081810360008301526150d3816143ac565b9050919050565b600060208201905081810360008301526150f381614412565b9050919050565b6000602082019050818103600083015261511381614478565b9050919050565b60006020820190508181036000830152615133816144b8565b9050919050565b600060208201905081810360008301526151538161451e565b9050919050565b6000602082019050818103600083015261517381614584565b9050919050565b60006020820190508181036000830152615193816145ea565b9050919050565b600060208201905081810360008301526151b38161462a565b9050919050565b600060208201905081810360008301526151d38161466a565b9050919050565b600060208201905081810360008301526151f3816146aa565b9050919050565b6000602082019050818103600083015261521381614710565b9050919050565b6000602082019050818103600083015261523381614750565b9050919050565b60006020820190508181036000830152615253816147b6565b9050919050565b60006020820190508181036000830152615273816147f6565b9050919050565b6000602082019050818103600083015261529381614836565b9050919050565b600060208201905081810360008301526152b381614876565b9050919050565b600060208201905081810360008301526152d3816148b6565b9050919050565b600060208201905081810360008301526152f38161491c565b9050919050565b6000602082019050818103600083015261531381614982565b9050919050565b60006020820190508181036000830152615333816149e8565b9050919050565b6000602082019050818103600083015261535381614a4e565b9050919050565b6000602082019050818103600083015261537381614ab4565b9050919050565b6000602082019050818103600083015261539381614b1a565b9050919050565b600060208201905081810360008301526153b381614b5a565b9050919050565b600060208201905081810360008301526153d381614bc0565b9050919050565b600060208201905081810360008301526153f381614c26565b9050919050565b6000602082019050818103600083015261541381614c66565b9050919050565b6000602082019050818103600083015261543381614ccc565b9050919050565b6000602082019050818103600083015261545381614d32565b9050919050565b6000602082019050818103600083015261547381614d72565b9050919050565b6000602082019050818103600083015261549381614dd8565b9050919050565b600060208201905081810360008301526154b381614e18565b9050919050565b600060208201905081810360008301526154d381614e7e565b9050919050565b600060208201905081810360008301526154f381614ebe565b9050919050565b6000602082019050818103600083015261551381614f24565b9050919050565b600060208201905061552f6000830184614f73565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561555c5761555b615777565b5b8060405250919050565b600067ffffffffffffffff82111561558157615580615777565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156155ad576155ac615777565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156155dd576155dc615777565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615684826156d5565b9050919050565b6000615696826156d5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061570a82615711565b9050919050565b600061571c82615723565b9050919050565b600061572e826156d5565b9050919050565b82818337600083830152505050565b60005b83811015615762578082015181840152602081019050615747565b83811115615771576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b61579381615679565b811461579e57600080fd5b50565b6157aa8161569d565b81146157b557600080fd5b50565b6157c1816156a9565b81146157cc57600080fd5b50565b6157d8816156f5565b81146157e357600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220eea733e75bd9abd5be9baef7223d04a72fe1b57ac4d930093a49d1fb236a4aba64736f6c63430007060033

Deployed Bytecode Sourcemap

67172:5907:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72304:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10262:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51547:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54333:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67338:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53863:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68982:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53341:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67264:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55223:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67577:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68882:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71212:606;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53103:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68234:131;;;;;;;;;;;;;:::i;:::-;;67884:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55599:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72161:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69655:261;;;;;;;;;;;;;:::i;:::-;;53629:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67620:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69115:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51303:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68377:392;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52922:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69551:92;;;;;;;;;;;;;:::i;:::-;;51020:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66258:148;;;;;;;;;;;;;:::i;:::-;;67452:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67402:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72528:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67493:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65607:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51716:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54626:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69332:101;;;;;;;;;;;;;:::i;:::-;;71826:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67535:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55821:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70534:664;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67660:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51891:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69932:592;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67707:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71960:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54992:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69441:98;;;;;;;;;;;;;:::i;:::-;;69222;;;;;;;;;;;;;:::i;:::-;;66561:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68781:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72304:212;72372:7;72412:13;:11;:13::i;:::-;72400:8;:25;;72392:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;72482:18;:28;72501:8;72482:28;;;;;;;;;;;;72475:35;;72304:212;;;:::o;10262:150::-;10347:4;10371:20;:33;10392:11;10371:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10364:40;;10262:150;;;:::o;51547:100::-;51601:13;51634:5;51627:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51547:100;:::o;54333:221::-;54409:7;54437:16;54445:7;54437;:16::i;:::-;54429:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54522:15;:24;54538:7;54522:24;;;;;;;;;;;;;;;;;;;;;54515:31;;54333:221;;;:::o;67338:45::-;;;;:::o;53863:404::-;53944:13;53960:23;53975:7;53960:14;:23::i;:::-;53944:39;;54008:5;54002:11;;:2;:11;;;;53994:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54088:5;54072:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54097:44;54121:5;54128:12;:10;:12::i;:::-;54097:23;:44::i;:::-;54072:69;54064:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54238:21;54247:2;54251:7;54238:8;:21::i;:::-;53863:404;;;:::o;68982:125::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69085:14:::1;69067:15;:32;;;;;;;;;;;;:::i;:::-;;68982:125:::0;:::o;53341:211::-;53402:7;53523:21;:12;:19;:21::i;:::-;53516:28;;53341:211;:::o;67264:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55223:305::-;55384:41;55403:12;:10;:12::i;:::-;55417:7;55384:18;:41::i;:::-;55376:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55492:28;55502:4;55508:2;55512:7;55492:9;:28::i;:::-;55223:305;;;:::o;67577:36::-;;;;;;;;;;;;;:::o;68882:92::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68959:7:::1;68947:9;:19;;;;68882:92:::0;:::o;71212:606::-;71341:4;71363:15;;;;;;;;;;;71355:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;71465:5;71434:36;;:27;71449:11;71434:14;:27::i;:::-;:36;;;71426:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;71508:13;71531:21;;;;;;;;;;;71508:45;;71602:5;71569:38;;:6;:14;;;71584:13;71569:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;71561:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;71683:21;71649:18;:31;71668:11;71649:31;;;;;;;;;;;:55;;;;71717:74;71743:10;71756:11;71769:21;71717:74;;;;;;;;:::i;:::-;;;;;;;;71806:4;71799:11;;;71212:606;;;;;;:::o;53103:162::-;53200:7;53227:30;53251:5;53227:13;:20;53241:5;53227:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53220:37;;53103:162;;;;:::o;68234:131::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68282:12:::1;68297:21;68282:36;;68329:10;:19;;:28;68349:7;68329:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65898:1;68234:131::o:0;67884:29::-;;;;:::o;55599:151::-;55703:39;55720:4;55726:2;55730:7;55703:39;;;;;;;;;;;;:16;:39::i;:::-;55599:151;;;:::o;72161:133::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72272:15:::1;72248:21;;:39;;;;;;;;;;;;;;;;;;72161:133:::0;:::o;69655:261::-;68121:6;:20;68128:12;:10;:12::i;:::-;68121:20;;;;;;;;;;;;;;;;;;;;;;;;;68120:21;68112:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;68198:4;68175:6;:20;68182:12;:10;:12::i;:::-;68175:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;69711:13:::1;;;;;;;;;;;69703:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;69806:9;;69782:20;69800:1;69782:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:33;;69774:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;69872:36;69882:10;69894:13;:11;:13::i;:::-;69872:9;:36::i;:::-;69655:261::o:0;53629:172::-;53704:7;53725:15;53746:22;53762:5;53746:12;:15;;:22;;;;:::i;:::-;53724:44;;;53786:7;53779:14;;;53629:172;;;:::o;67620:33::-;;;;;;;;;;;;;:::o;69115:99::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69186:20:::1;69198:7;69186:11;:20::i;:::-;69115:99:::0;:::o;51303:177::-;51375:7;51402:70;51419:7;51402:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51395:77;;51303:177;;;:::o;68377:392::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68465:11:::1;68479:13;:11;:13::i;:::-;68465:27;;68528:1;68511:14;:18;:61;;;;;68563:9;;68533:26;68544:14;68533:6;:10;;:26;;;;:::i;:::-;:39;;68511:61;68503:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;68616:6;68611:95;68632:14;68628:1;:18;68611:95;;;68668:26;68678:3;68692:1;68683:6;:10;68668:9;:26::i;:::-;68648:3;;;;;;;68611:95;;;;68730:31;68746:14;68730:11;;:15;;:31;;;;:::i;:::-;68716:11;:45;;;;65898:1;68377:392:::0;;:::o;52922:97::-;52970:13;53003:8;52996:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52922:97;:::o;69551:92::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69622:13:::1;;;;;;;;;;;69621:14;69605:13;;:30;;;;;;;;;;;;;;;;;;69551:92::o:0;51020:221::-;51092:7;51137:1;51120:19;;:5;:19;;;;51112:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51204:29;:13;:20;51218:5;51204:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51197:36;;51020:221;;;:::o;66258:148::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66365:1:::1;66328:40;;66349:6;;;;;;;;;;;66328:40;;;;;;;;;;;;66396:1;66379:6;;:19;;;;;;;;;;;;;;;;;;66258:148::o:0;67452:32::-;;;;:::o;67402:43::-;67443:2;67402:43;:::o;72528:540::-;72589:16;72619:18;72640:17;72650:6;72640:9;:17::i;:::-;72619:38;;72686:1;72672:10;:15;72668:393;;;72763:1;72749:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72742:23;;;;;72668:393;72798:23;72838:10;72824:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72798:51;;72864:13;72892:130;72916:10;72908:5;:18;72892:130;;;72972:34;72992:6;73000:5;72972:19;:34::i;:::-;72956:6;72963:5;72956:13;;;;;;;;;;;;;:50;;;;;72928:7;;;;;;;72892:130;;;73043:6;73036:13;;;;;72528:540;;;;:::o;67493:35::-;;;;;;;;;;;;;:::o;65607:87::-;65653:7;65680:6;;;;;;;;;;;65673:13;;65607:87;:::o;51716:104::-;51772:13;51805:7;51798:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51716:104;:::o;54626:295::-;54741:12;:10;:12::i;:::-;54729:24;;:8;:24;;;;54721:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54841:8;54796:18;:32;54815:12;:10;:12::i;:::-;54796:32;;;;;;;;;;;;;;;:42;54829:8;54796:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54894:8;54865:48;;54880:12;:10;:12::i;:::-;54865:48;;;54904:8;54865:48;;;;;;:::i;:::-;;;;;;;;54626:295;;:::o;69332:101::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69409:16:::1;;;;;;;;;;;69408:17;69389:16;;:36;;;;;;;;;;;;;;;;;;69332:101::o:0;71826:126::-;71903:4;71926:9;:18;71936:7;71926:18;;;;;;;;;;;;;;;;;;;;;;;;;71919:25;;71826:126;;;:::o;67535:35::-;;;;;;;;;;;;;:::o;55821:285::-;55953:41;55972:12;:10;:12::i;:::-;55986:7;55953:18;:41::i;:::-;55945:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56059:39;56073:4;56079:2;56083:7;56092:5;56059:13;:39::i;:::-;55821:285;;;;:::o;70534:664::-;70607:15;;;;;;;;;;;70599:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;70695:1;70678:14;:18;:57;;;;;67443:2;70700:14;:35;;70678:57;70670:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;70823:9;;70786:33;70804:14;70786:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;;70778:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;70906:29;70920:14;70906:9;;:13;;:29;;;;:::i;:::-;70893:9;:42;;70885:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;70986:9;:21;70996:10;70986:21;;;;;;;;;;;;;;;;;;;;;;;;;70978:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;71051:6;71046:146;71067:14;71063:1;:18;71046:146;;;71117:9;;71101:13;:11;:13::i;:::-;:25;71097:88;;;71139:36;71149:10;71161:13;:11;:13::i;:::-;71139:9;:36::i;:::-;71097:88;71083:3;;;;;;;71046:146;;;;70534:664;:::o;67660:37::-;;;;;;;;;;;;;:::o;51891:792::-;51964:13;51998:16;52006:7;51998;:16::i;:::-;51990:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52079:23;52105:10;:19;52116:7;52105:19;;;;;;;;;;;52079:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52135:18;52156:9;:7;:9::i;:::-;52135:30;;52263:1;52247:4;52241:18;:23;52237:72;;;52288:9;52281:16;;;;;;52237:72;52439:1;52419:9;52413:23;:27;52409:108;;;52488:4;52494:9;52471:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52457:48;;;;;;52409:108;52649:4;52655:18;:7;:16;:18::i;:::-;52632:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52618:57;;;;51891:792;;;;:::o;69932:592::-;70002:16;;;;;;;;;;;69994:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70087:1;70070:14;:18;:57;;;;;67443:2;70092:14;:35;;70070:57;70062:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;70215:9;;70178:33;70196:14;70178:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;;70170:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;70298:29;70312:14;70298:9;;:13;;:29;;;;:::i;:::-;70285:9;:42;;70277:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;70377:6;70372:146;70393:14;70389:1;:18;70372:146;;;70443:9;;70427:13;:11;:13::i;:::-;:25;70423:88;;;70465:36;70475:10;70487:13;:11;:13::i;:::-;70465:9;:36::i;:::-;70423:88;70409:3;;;;;;;70372:146;;;;69932:592;:::o;67707:50::-;;;;;;;;;;;;;;;;;:::o;71960:190::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72049:6:::1;72045:98;72065:8;:15;72061:1;:19;72045:98;;;72127:4;72102:9;:22;72112:8;72121:1;72112:11;;;;;;;;;;;;;;72102:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;72082:3;;;;;;;72045:98;;;;71960:190:::0;:::o;54992:164::-;55089:4;55113:18;:25;55132:5;55113:25;;;;;;;;;;;;;;;:35;55139:8;55113:35;;;;;;;;;;;;;;;;;;;;;;;;;55106:42;;54992:164;;;;:::o;69441:98::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69516:15:::1;;;;;;;;;;;69515:16;69497:15;;:34;;;;;;;;;;;;;;;;;;69441:98::o:0;69222:::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69297:15:::1;;;;;;;;;;;69296:16;69278:15;;:34;;;;;;;;;;;;;;;;;;69222:98::o:0;66561:244::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66670:1:::1;66650:22;;:8;:22;;;;66642:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66760:8;66731:38;;66752:6;;;;;;;;;;;66731:38;;;;;;;;;;;;66789:8;66780:6;;:17;;;;;;;;;;;;;;;;;;66561:244:::0;:::o;68781:89::-;65838:12;:10;:12::i;:::-;65827:23;;:7;:5;:7::i;:::-;:23;;;65819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68857:5:::1;68845:9;:17;;;;68781:89:::0;:::o;57573:127::-;57638:4;57662:30;57684:7;57662:12;:21;;:30;;;;:::i;:::-;57655:37;;57573:127;;;:::o;751:106::-;804:15;839:10;832:17;;751:106;:::o;63591:192::-;63693:2;63666:15;:24;63682:7;63666:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63749:7;63745:2;63711:46;;63720:23;63735:7;63720:14;:23::i;:::-;63711:46;;;;;;;;;;;;63591:192;;:::o;44305:123::-;44374:7;44401:19;44409:3;:10;;44401:7;:19::i;:::-;44394:26;;44305:123;;;:::o;57867:355::-;57960:4;57985:16;57993:7;57985;:16::i;:::-;57977:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58061:13;58077:23;58092:7;58077:14;:23::i;:::-;58061:39;;58130:5;58119:16;;:7;:16;;;:51;;;;58163:7;58139:31;;:20;58151:7;58139:11;:20::i;:::-;:31;;;58119:51;:94;;;;58174:39;58198:5;58205:7;58174:23;:39::i;:::-;58119:94;58111:103;;;57867:355;;;;:::o;61003:599::-;61128:4;61101:31;;:23;61116:7;61101:14;:23::i;:::-;:31;;;61093:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61229:1;61215:16;;:2;:16;;;;61207:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61285:39;61306:4;61312:2;61316:7;61285:20;:39::i;:::-;61389:29;61406:1;61410:7;61389:8;:29::i;:::-;61431:35;61458:7;61431:13;:19;61445:4;61431:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61477:30;61499:7;61477:13;:17;61491:2;61477:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61520:29;61537:7;61546:2;61520:12;:16;;:29;;;;;:::i;:::-;;61586:7;61582:2;61567:27;;61576:4;61567:27;;;;;;;;;;;;61003:599;;;:::o;36096:137::-;36167:7;36202:22;36206:3;:10;;36218:5;36202:3;:22::i;:::-;36194:31;;36187:38;;36096:137;;;;:::o;13824:179::-;13882:7;13902:9;13918:1;13914;:5;13902:17;;13943:1;13938;:6;;13930:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;13994:1;13987:8;;;13824:179;;;;:::o;58565:110::-;58641:26;58651:2;58655:7;58641:26;;;;;;;;;;;;:9;:26::i;:::-;58565:110;;:::o;44767:236::-;44847:7;44856;44877:11;44890:13;44907:22;44911:3;:10;;44923:5;44907:3;:22::i;:::-;44876:53;;;;44956:3;44948:12;;44986:5;44978:14;;44940:55;;;;;;44767:236;;;;;:::o;62203:100::-;62287:8;62276;:19;;;;;;;;;;;;:::i;:::-;;62203:100;:::o;46053:213::-;46160:7;46211:44;46216:3;:10;;46236:3;46228:12;;46242;46211:4;:44::i;:::-;46203:53;;46180:78;;46053:213;;;;;:::o;14286:158::-;14344:7;14377:1;14372;:6;;14364:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14435:1;14431;:5;14424:12;;14286:158;;;;:::o;35638:114::-;35698:7;35725:19;35733:3;:10;;35725:7;:19::i;:::-;35718:26;;35638:114;;;:::o;56988:272::-;57102:28;57112:4;57118:2;57122:7;57102:9;:28::i;:::-;57149:48;57172:4;57178:2;57182:7;57191:5;57149:22;:48::i;:::-;57141:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56988:272;;;;:::o;14703:220::-;14761:7;14790:1;14785;:6;14781:20;;;14800:1;14793:8;;;;14781:20;14812:9;14828:1;14824;:5;14812:17;;14857:1;14852;14848;:5;;;;;;:10;14840:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14914:1;14907:8;;;14703:220;;;;;:::o;46517:746::-;46573:13;46803:1;46794:5;:10;46790:53;;;46821:10;;;;;;;;;;;;;;;;;;;;;46790:53;46853:12;46868:5;46853:20;;46884:14;46909:78;46924:1;46916:4;:9;46909:78;;46942:8;;;;;;;46973:2;46965:10;;;;;;;;;46909:78;;;46997:19;47029:6;47019:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46997:39;;47047:13;47072:1;47063:6;:10;47047:26;;47091:5;47084:12;;47107:117;47122:1;47114:4;:9;47107:117;;47183:2;47176:4;:9;;;;;;47171:2;:14;47158:29;;47140:6;47147:7;;;;;;;47140:15;;;;;;;;;;;:47;;;;;;;;;;;47210:2;47202:10;;;;;;;;;47107:117;;;47248:6;47234:21;;;;;;46517:746;;;;:::o;44066:151::-;44150:4;44174:35;44184:3;:10;;44204:3;44196:12;;44174:9;:35::i;:::-;44167:42;;44066:151;;;;:::o;40884:110::-;40940:7;40967:3;:12;;:19;;;;40960:26;;40884:110;;;:::o;64396:93::-;;;;:::o;35183:137::-;35253:4;35277:35;35285:3;:10;;35305:5;35297:14;;35277:7;:35::i;:::-;35270:42;;35183:137;;;;:::o;34876:131::-;34943:4;34967:32;34972:3;:10;;34992:5;34984:14;;34967:4;:32::i;:::-;34960:39;;34876:131;;;;:::o;43489:185::-;43578:4;43602:64;43607:3;:10;;43627:3;43619:12;;43657:5;43641:23;;43633:32;;43602:4;:64::i;:::-;43595:71;;43489:185;;;;;:::o;31134:204::-;31201:7;31250:5;31229:3;:11;;:18;;;;:26;31221:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31312:3;:11;;31324:5;31312:18;;;;;;;;;;;;;;;;31305:25;;31134:204;;;;:::o;58902:250::-;58998:18;59004:2;59008:7;58998:5;:18::i;:::-;59035:54;59066:1;59070:2;59074:7;59083:5;59035:22;:54::i;:::-;59027:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58902:250;;;:::o;41349:279::-;41416:7;41425;41475:5;41453:3;:12;;:19;;;;:27;41445:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41532:22;41557:3;:12;;41570:5;41557:19;;;;;;;;;;;;;;;;;;41532:44;;41595:5;:10;;;41607:5;:12;;;41587:33;;;;;41349:279;;;;;:::o;42846:319::-;42940:7;42960:16;42979:3;:12;;:17;42992:3;42979:17;;;;;;;;;;;;42960:36;;43027:1;43015:8;:13;;43030:12;43007:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43097:3;:12;;43121:1;43110:8;:12;43097:26;;;;;;;;;;;;;;;;;;:33;;;43090:40;;;42846:319;;;;;:::o;30681:109::-;30737:7;30764:3;:11;;:18;;;;30757:25;;30681:109;;;:::o;62868:604::-;62989:4;63016:15;:2;:13;;;:15::i;:::-;63011:60;;63055:4;63048:11;;;;63011:60;63081:23;63107:252;63160:45;;;63220:12;:10;:12::i;:::-;63247:4;63266:7;63288:5;63123:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63107:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63081:278;;63370:13;63397:10;63386:32;;;;;;;;;;;;:::i;:::-;63370:48;;48017:10;63447:16;;63437:26;;;:6;:26;;;;63429:35;;;;62868:604;;;;;;;:::o;40664:125::-;40735:4;40780:1;40759:3;:12;;:17;40772:3;40759:17;;;;;;;;;;;;:22;;40752:29;;40664:125;;;;:::o;28836:1544::-;28902:4;29020:18;29041:3;:12;;:19;29054:5;29041:19;;;;;;;;;;;;29020:40;;29091:1;29077:10;:15;29073:1300;;29439:21;29476:1;29463:10;:14;29439:38;;29492:17;29533:1;29512:3;:11;;:18;;;;:22;29492:42;;29779:17;29799:3;:11;;29811:9;29799:22;;;;;;;;;;;;;;;;29779:42;;29945:9;29916:3;:11;;29928:13;29916:26;;;;;;;;;;;;;;;:38;;;;30064:1;30048:13;:17;30022:3;:12;;:23;30035:9;30022:23;;;;;;;;;;;:43;;;;30174:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30269:3;:12;;:19;30282:5;30269:19;;;;;;;;;;;30262:26;;;30312:4;30305:11;;;;;;;;29073:1300;30356:5;30349:12;;;28836:1544;;;;;:::o;28246:414::-;28309:4;28331:21;28341:3;28346:5;28331:9;:21::i;:::-;28326:327;;28369:3;:11;;28386:5;28369:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28552:3;:11;;:18;;;;28530:3;:12;;:19;28543:5;28530:19;;;;;;;;;;;:40;;;;28592:4;28585:11;;;;28326:327;28636:5;28629:12;;28246:414;;;;;:::o;38164:692::-;38240:4;38356:16;38375:3;:12;;:17;38388:3;38375:17;;;;;;;;;;;;38356:36;;38421:1;38409:8;:13;38405:444;;;38476:3;:12;;38494:38;;;;;;;;38511:3;38494:38;;;;38524:5;38494:38;;;38476:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38691:3;:12;;:19;;;;38671:3;:12;;:17;38684:3;38671:17;;;;;;;;;;;:39;;;;38732:4;38725:11;;;;;38405:444;38805:5;38769:3;:12;;38793:1;38782:8;:12;38769:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38832:5;38825:12;;;38164:692;;;;;;:::o;59488:404::-;59582:1;59568:16;;:2;:16;;;;59560:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59641:16;59649:7;59641;:16::i;:::-;59640:17;59632:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59703:45;59732:1;59736:2;59740:7;59703:20;:45::i;:::-;59761:30;59783:7;59761:13;:17;59775:2;59761:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59804:29;59821:7;59830:2;59804:12;:16;;:29;;;;;:::i;:::-;;59876:7;59872:2;59851:33;;59868:1;59851:33;;;;;;;;;;;;59488:404;;:::o;19265:422::-;19325:4;19533:12;19644:7;19632:20;19624:28;;19678:1;19671:4;:8;19664:15;;;19265:422;;;:::o;22183:195::-;22286:12;22318:52;22340:6;22348:4;22354:1;22357:12;22318:21;:52::i;:::-;22311:59;;22183:195;;;;;:::o;30466:129::-;30539:4;30586:1;30563:3;:12;;:19;30576:5;30563:19;;;;;;;;;;;;:24;;30556:31;;30466:129;;;;:::o;23235:530::-;23362:12;23420:5;23395:21;:30;;23387:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23487:18;23498:6;23487:10;:18::i;:::-;23479:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23613:12;23627:23;23654:6;:11;;23674:5;23682:4;23654:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23612:75;;;;23705:52;23723:7;23732:10;23744:12;23705:17;:52::i;:::-;23698:59;;;;23235:530;;;;;;:::o;25775:742::-;25890:12;25919:7;25915:595;;;25950:10;25943:17;;;;25915:595;26084:1;26064:10;:17;:21;26060:439;;;26327:10;26321:17;26388:15;26375:10;26371:2;26367:19;26360:44;26275:148;26470:12;26463:20;;;;;;;;;;;:::i;:::-;;;;;;;;25775:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1495:143::-;;1583:6;1577:13;1568:22;;1599:33;1626:5;1599:33;:::i;:::-;1558:80;;;;:::o;1661:303::-;;1781:3;1774:4;1766:6;1762:17;1758:27;1748:2;;1799:1;1796;1789:12;1748:2;1839:6;1826:20;1864:94;1954:3;1946:6;1939:4;1931:6;1927:17;1864:94;:::i;:::-;1855:103;;1738:226;;;;;:::o;1970:133::-;;2051:6;2038:20;2029:29;;2067:30;2091:5;2067:30;:::i;:::-;2019:84;;;;:::o;2109:137::-;;2192:6;2179:20;2170:29;;2208:32;2234:5;2208:32;:::i;:::-;2160:86;;;;:::o;2252:141::-;;2339:6;2333:13;2324:22;;2355:32;2381:5;2355:32;:::i;:::-;2314:79;;;;:::o;2412:271::-;;2516:3;2509:4;2501:6;2497:17;2493:27;2483:2;;2534:1;2531;2524:12;2483:2;2574:6;2561:20;2599:78;2673:3;2665:6;2658:4;2650:6;2646:17;2599:78;:::i;:::-;2590:87;;2473:210;;;;;:::o;2703:273::-;;2808:3;2801:4;2793:6;2789:17;2785:27;2775:2;;2826:1;2823;2816:12;2775:2;2866:6;2853:20;2891:79;2966:3;2958:6;2951:4;2943:6;2939:17;2891:79;:::i;:::-;2882:88;;2765:211;;;;;:::o;2982:139::-;;3066:6;3053:20;3044:29;;3082:33;3109:5;3082:33;:::i;:::-;3034:87;;;;:::o;3127:262::-;;3235:2;3223:9;3214:7;3210:23;3206:32;3203:2;;;3251:1;3248;3241:12;3203:2;3294:1;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3265:117;3193:196;;;;:::o;3395:284::-;;3514:2;3502:9;3493:7;3489:23;3485:32;3482:2;;;3530:1;3527;3520:12;3482:2;3573:1;3598:64;3654:7;3645:6;3634:9;3630:22;3598:64;:::i;:::-;3588:74;;3544:128;3472:207;;;;:::o;3685:407::-;;;3810:2;3798:9;3789:7;3785:23;3781:32;3778:2;;;3826:1;3823;3816:12;3778:2;3869:1;3894:53;3939:7;3930:6;3919:9;3915:22;3894:53;:::i;:::-;3884:63;;3840:117;3996:2;4022:53;4067:7;4058:6;4047:9;4043:22;4022:53;:::i;:::-;4012:63;;3967:118;3768:324;;;;;:::o;4098:552::-;;;;4240:2;4228:9;4219:7;4215:23;4211:32;4208:2;;;4256:1;4253;4246:12;4208:2;4299:1;4324:53;4369:7;4360:6;4349:9;4345:22;4324:53;:::i;:::-;4314:63;;4270:117;4426:2;4452:53;4497:7;4488:6;4477:9;4473:22;4452:53;:::i;:::-;4442:63;;4397:118;4554:2;4580:53;4625:7;4616:6;4605:9;4601:22;4580:53;:::i;:::-;4570:63;;4525:118;4198:452;;;;;:::o;4656:809::-;;;;;4824:3;4812:9;4803:7;4799:23;4795:33;4792:2;;;4841:1;4838;4831:12;4792:2;4884:1;4909:53;4954:7;4945:6;4934:9;4930:22;4909:53;:::i;:::-;4899:63;;4855:117;5011:2;5037:53;5082:7;5073:6;5062:9;5058:22;5037:53;:::i;:::-;5027:63;;4982:118;5139:2;5165:53;5210:7;5201:6;5190:9;5186:22;5165:53;:::i;:::-;5155:63;;5110:118;5295:2;5284:9;5280:18;5267:32;5326:18;5318:6;5315:30;5312:2;;;5358:1;5355;5348:12;5312:2;5386:62;5440:7;5431:6;5420:9;5416:22;5386:62;:::i;:::-;5376:72;;5238:220;4782:683;;;;;;;:::o;5471:401::-;;;5593:2;5581:9;5572:7;5568:23;5564:32;5561:2;;;5609:1;5606;5599:12;5561:2;5652:1;5677:53;5722:7;5713:6;5702:9;5698:22;5677:53;:::i;:::-;5667:63;;5623:117;5779:2;5805:50;5847:7;5838:6;5827:9;5823:22;5805:50;:::i;:::-;5795:60;;5750:115;5551:321;;;;;:::o;5878:407::-;;;6003:2;5991:9;5982:7;5978:23;5974:32;5971:2;;;6019:1;6016;6009:12;5971:2;6062:1;6087:53;6132:7;6123:6;6112:9;6108:22;6087:53;:::i;:::-;6077:63;;6033:117;6189:2;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6160:118;5961:324;;;;;:::o;6291:698::-;;;;;6450:3;6438:9;6429:7;6425:23;6421:33;6418:2;;;6467:1;6464;6457:12;6418:2;6510:1;6535:53;6580:7;6571:6;6560:9;6556:22;6535:53;:::i;:::-;6525:63;;6481:117;6637:2;6663:53;6708:7;6699:6;6688:9;6684:22;6663:53;:::i;:::-;6653:63;;6608:118;6765:2;6791:53;6836:7;6827:6;6816:9;6812:22;6791:53;:::i;:::-;6781:63;;6736:118;6893:2;6919:53;6964:7;6955:6;6944:9;6940:22;6919:53;:::i;:::-;6909:63;;6864:118;6408:581;;;;;;;:::o;6995:405::-;;7128:2;7116:9;7107:7;7103:23;7099:32;7096:2;;;7144:1;7141;7134:12;7096:2;7215:1;7204:9;7200:17;7187:31;7245:18;7237:6;7234:30;7231:2;;;7277:1;7274;7267:12;7231:2;7305:78;7375:7;7366:6;7355:9;7351:22;7305:78;:::i;:::-;7295:88;;7158:235;7086:314;;;;:::o;7406:260::-;;7513:2;7501:9;7492:7;7488:23;7484:32;7481:2;;;7529:1;7526;7519:12;7481:2;7572:1;7597:52;7641:7;7632:6;7621:9;7617:22;7597:52;:::i;:::-;7587:62;;7543:116;7471:195;;;;:::o;7672:282::-;;7790:2;7778:9;7769:7;7765:23;7761:32;7758:2;;;7806:1;7803;7796:12;7758:2;7849:1;7874:63;7929:7;7920:6;7909:9;7905:22;7874:63;:::i;:::-;7864:73;;7820:127;7748:206;;;;:::o;7960:375::-;;8078:2;8066:9;8057:7;8053:23;8049:32;8046:2;;;8094:1;8091;8084:12;8046:2;8165:1;8154:9;8150:17;8137:31;8195:18;8187:6;8184:30;8181:2;;;8227:1;8224;8217:12;8181:2;8255:63;8310:7;8301:6;8290:9;8286:22;8255:63;:::i;:::-;8245:73;;8108:220;8036:299;;;;:::o;8341:262::-;;8449:2;8437:9;8428:7;8424:23;8420:32;8417:2;;;8465:1;8462;8455:12;8417:2;8508:1;8533:53;8578:7;8569:6;8558:9;8554:22;8533:53;:::i;:::-;8523:63;;8479:117;8407:196;;;;:::o;8609:179::-;;8699:46;8741:3;8733:6;8699:46;:::i;:::-;8777:4;8772:3;8768:14;8754:28;;8689:99;;;;:::o;8794:147::-;8889:45;8928:5;8889:45;:::i;:::-;8884:3;8877:58;8867:74;;:::o;8947:142::-;9050:32;9076:5;9050:32;:::i;:::-;9045:3;9038:45;9028:61;;:::o;9095:118::-;9182:24;9200:5;9182:24;:::i;:::-;9177:3;9170:37;9160:53;;:::o;9249:732::-;;9397:54;9445:5;9397:54;:::i;:::-;9467:86;9546:6;9541:3;9467:86;:::i;:::-;9460:93;;9577:56;9627:5;9577:56;:::i;:::-;9656:7;9687:1;9672:284;9697:6;9694:1;9691:13;9672:284;;;9773:6;9767:13;9800:63;9859:3;9844:13;9800:63;:::i;:::-;9793:70;;9886:60;9939:6;9886:60;:::i;:::-;9876:70;;9732:224;9719:1;9716;9712:9;9707:14;;9672:284;;;9676:14;9972:3;9965:10;;9373:608;;;;;;;:::o;9987:109::-;10068:21;10083:5;10068:21;:::i;:::-;10063:3;10056:34;10046:50;;:::o;10102:360::-;;10216:38;10248:5;10216:38;:::i;:::-;10270:70;10333:6;10328:3;10270:70;:::i;:::-;10263:77;;10349:52;10394:6;10389:3;10382:4;10375:5;10371:16;10349:52;:::i;:::-;10426:29;10448:6;10426:29;:::i;:::-;10421:3;10417:39;10410:46;;10192:270;;;;;:::o;10468:373::-;;10600:38;10632:5;10600:38;:::i;:::-;10654:88;10735:6;10730:3;10654:88;:::i;:::-;10647:95;;10751:52;10796:6;10791:3;10784:4;10777:5;10773:16;10751:52;:::i;:::-;10828:6;10823:3;10819:16;10812:23;;10576:265;;;;;:::o;10847:364::-;;10963:39;10996:5;10963:39;:::i;:::-;11018:71;11082:6;11077:3;11018:71;:::i;:::-;11011:78;;11098:52;11143:6;11138:3;11131:4;11124:5;11120:16;11098:52;:::i;:::-;11175:29;11197:6;11175:29;:::i;:::-;11170:3;11166:39;11159:46;;10939:272;;;;;:::o;11217:377::-;;11351:39;11384:5;11351:39;:::i;:::-;11406:89;11488:6;11483:3;11406:89;:::i;:::-;11399:96;;11504:52;11549:6;11544:3;11537:4;11530:5;11526:16;11504:52;:::i;:::-;11581:6;11576:3;11572:16;11565:23;;11327:267;;;;;:::o;11600:368::-;;11763:67;11827:2;11822:3;11763:67;:::i;:::-;11756:74;;11860:34;11856:1;11851:3;11847:11;11840:55;11926:6;11921:2;11916:3;11912:12;11905:28;11959:2;11954:3;11950:12;11943:19;;11746:222;;;:::o;11974:366::-;;12137:67;12201:2;12196:3;12137:67;:::i;:::-;12130:74;;12234:34;12230:1;12225:3;12221:11;12214:55;12300:4;12295:2;12290:3;12286:12;12279:26;12331:2;12326:3;12322:12;12315:19;;12120:220;;;:::o;12346:330::-;;12509:67;12573:2;12568:3;12509:67;:::i;:::-;12502:74;;12606:34;12602:1;12597:3;12593:11;12586:55;12667:2;12662:3;12658:12;12651:19;;12492:184;;;:::o;12682:373::-;;12845:67;12909:2;12904:3;12845:67;:::i;:::-;12838:74;;12942:34;12938:1;12933:3;12929:11;12922:55;13008:11;13003:2;12998:3;12994:12;12987:33;13046:2;13041:3;13037:12;13030:19;;12828:227;;;:::o;13061:382::-;;13224:67;13288:2;13283:3;13224:67;:::i;:::-;13217:74;;13321:34;13317:1;13312:3;13308:11;13301:55;13387:20;13382:2;13377:3;13373:12;13366:42;13434:2;13429:3;13425:12;13418:19;;13207:236;;;:::o;13449:370::-;;13612:67;13676:2;13671:3;13612:67;:::i;:::-;13605:74;;13709:34;13705:1;13700:3;13696:11;13689:55;13775:8;13770:2;13765:3;13761:12;13754:30;13810:2;13805:3;13801:12;13794:19;;13595:224;;;:::o;13825:326::-;;13988:67;14052:2;14047:3;13988:67;:::i;:::-;13981:74;;14085:30;14081:1;14076:3;14072:11;14065:51;14142:2;14137:3;14133:12;14126:19;;13971:180;;;:::o;14157:325::-;;14320:67;14384:2;14379:3;14320:67;:::i;:::-;14313:74;;14417:29;14413:1;14408:3;14404:11;14397:50;14473:2;14468:3;14464:12;14457:19;;14303:179;;;:::o;14488:329::-;;14651:67;14715:2;14710:3;14651:67;:::i;:::-;14644:74;;14748:33;14744:1;14739:3;14735:11;14728:54;14808:2;14803:3;14799:12;14792:19;;14634:183;;;:::o;14823:367::-;;14986:67;15050:2;15045:3;14986:67;:::i;:::-;14979:74;;15083:34;15079:1;15074:3;15070:11;15063:55;15149:5;15144:2;15139:3;15135:12;15128:27;15181:2;15176:3;15172:12;15165:19;;14969:221;;;:::o;15196:325::-;;15359:67;15423:2;15418:3;15359:67;:::i;:::-;15352:74;;15456:29;15452:1;15447:3;15443:11;15436:50;15512:2;15507:3;15503:12;15496:19;;15342:179;;;:::o;15527:368::-;;15690:67;15754:2;15749:3;15690:67;:::i;:::-;15683:74;;15787:34;15783:1;15778:3;15774:11;15767:55;15853:6;15848:2;15843:3;15839:12;15832:28;15886:2;15881:3;15877:12;15870:19;;15673:222;;;:::o;15901:323::-;;16064:67;16128:2;16123:3;16064:67;:::i;:::-;16057:74;;16161:27;16157:1;16152:3;16148:11;16141:48;16215:2;16210:3;16206:12;16199:19;;16047:177;;;:::o;16230:329::-;;16393:67;16457:2;16452:3;16393:67;:::i;:::-;16386:74;;16490:33;16486:1;16481:3;16477:11;16470:54;16550:2;16545:3;16541:12;16534:19;;16376:183;;;:::o;16565:328::-;;16728:67;16792:2;16787:3;16728:67;:::i;:::-;16721:74;;16825:32;16821:1;16816:3;16812:11;16805:53;16884:2;16879:3;16875:12;16868:19;;16711:182;;;:::o;16899:322::-;;17062:67;17126:2;17121:3;17062:67;:::i;:::-;17055:74;;17159:26;17155:1;17150:3;17146:11;17139:47;17212:2;17207:3;17203:12;17196:19;;17045:176;;;:::o;17227:370::-;;17390:67;17454:2;17449:3;17390:67;:::i;:::-;17383:74;;17487:34;17483:1;17478:3;17474:11;17467:55;17553:8;17548:2;17543:3;17539:12;17532:30;17588:2;17583:3;17579:12;17572:19;;17373:224;;;:::o;17603:376::-;;17766:67;17830:2;17825:3;17766:67;:::i;:::-;17759:74;;17863:34;17859:1;17854:3;17850:11;17843:55;17929:14;17924:2;17919:3;17915:12;17908:36;17970:2;17965:3;17961:12;17954:19;;17749:230;;;:::o;17985:366::-;;18148:67;18212:2;18207:3;18148:67;:::i;:::-;18141:74;;18245:34;18241:1;18236:3;18232:11;18225:55;18311:4;18306:2;18301:3;18297:12;18290:26;18342:2;18337:3;18333:12;18326:19;;18131:220;;;:::o;18357:388::-;;18520:67;18584:2;18579:3;18520:67;:::i;:::-;18513:74;;18617:34;18613:1;18608:3;18604:11;18597:55;18683:26;18678:2;18673:3;18669:12;18662:48;18736:2;18731:3;18727:12;18720:19;;18503:242;;;:::o;18751:374::-;;18914:67;18978:2;18973:3;18914:67;:::i;:::-;18907:74;;19011:34;19007:1;19002:3;18998:11;18991:55;19077:12;19072:2;19067:3;19063:12;19056:34;19116:2;19111:3;19107:12;19100:19;;18897:228;;;:::o;19131:366::-;;19294:67;19358:2;19353:3;19294:67;:::i;:::-;19287:74;;19391:34;19387:1;19382:3;19378:11;19371:55;19457:4;19452:2;19447:3;19443:12;19436:26;19488:2;19483:3;19479:12;19472:19;;19277:220;;;:::o;19503:330::-;;19666:67;19730:2;19725:3;19666:67;:::i;:::-;19659:74;;19763:34;19759:1;19754:3;19750:11;19743:55;19824:2;19819:3;19815:12;19808:19;;19649:184;;;:::o;19839:365::-;;20002:67;20066:2;20061:3;20002:67;:::i;:::-;19995:74;;20099:34;20095:1;20090:3;20086:11;20079:55;20165:3;20160:2;20155:3;20151:12;20144:25;20195:2;20190:3;20186:12;20179:19;;19985:219;;;:::o;20210:376::-;;20373:67;20437:2;20432:3;20373:67;:::i;:::-;20366:74;;20470:34;20466:1;20461:3;20457:11;20450:55;20536:14;20531:2;20526:3;20522:12;20515:36;20577:2;20572:3;20568:12;20561:19;;20356:230;;;:::o;20592:330::-;;20755:67;20819:2;20814:3;20755:67;:::i;:::-;20748:74;;20852:34;20848:1;20843:3;20839:11;20832:55;20913:2;20908:3;20904:12;20897:19;;20738:184;;;:::o;20928:373::-;;21091:67;21155:2;21150:3;21091:67;:::i;:::-;21084:74;;21188:34;21184:1;21179:3;21175:11;21168:55;21254:11;21249:2;21244:3;21240:12;21233:33;21292:2;21287:3;21283:12;21276:19;;21074:227;;;:::o;21307:379::-;;21470:67;21534:2;21529:3;21470:67;:::i;:::-;21463:74;;21567:34;21563:1;21558:3;21554:11;21547:55;21633:17;21628:2;21623:3;21619:12;21612:39;21677:2;21672:3;21668:12;21661:19;;21453:233;;;:::o;21692:321::-;;21855:67;21919:2;21914:3;21855:67;:::i;:::-;21848:74;;21952:25;21948:1;21943:3;21939:11;21932:46;22004:2;21999:3;21995:12;21988:19;;21838:175;;;:::o;22019:365::-;;22182:67;22246:2;22241:3;22182:67;:::i;:::-;22175:74;;22279:34;22275:1;22270:3;22266:11;22259:55;22345:3;22340:2;22335:3;22331:12;22324:25;22375:2;22370:3;22366:12;22359:19;;22165:219;;;:::o;22390:316::-;;22553:67;22617:2;22612:3;22553:67;:::i;:::-;22546:74;;22650:20;22646:1;22641:3;22637:11;22630:41;22697:2;22692:3;22688:12;22681:19;;22536:170;;;:::o;22712:381::-;;22875:67;22939:2;22934:3;22875:67;:::i;:::-;22868:74;;22972:34;22968:1;22963:3;22959:11;22952:55;23038:19;23033:2;23028:3;23024:12;23017:41;23084:2;23079:3;23075:12;23068:19;;22858:235;;;:::o;23099:327::-;;23262:67;23326:2;23321:3;23262:67;:::i;:::-;23255:74;;23359:31;23355:1;23350:3;23346:11;23339:52;23417:2;23412:3;23408:12;23401:19;;23245:181;;;:::o;23432:367::-;;23595:67;23659:2;23654:3;23595:67;:::i;:::-;23588:74;;23692:34;23688:1;23683:3;23679:11;23672:55;23758:5;23753:2;23748:3;23744:12;23737:27;23790:2;23785:3;23781:12;23774:19;;23578:221;;;:::o;23805:323::-;;23968:67;24032:2;24027:3;23968:67;:::i;:::-;23961:74;;24065:27;24061:1;24056:3;24052:11;24045:48;24119:2;24114:3;24110:12;24103:19;;23951:177;;;:::o;24134:108::-;24211:24;24229:5;24211:24;:::i;:::-;24206:3;24199:37;24189:53;;:::o;24248:118::-;24335:24;24353:5;24335:24;:::i;:::-;24330:3;24323:37;24313:53;;:::o;24372:271::-;;24524:93;24613:3;24604:6;24524:93;:::i;:::-;24517:100;;24634:3;24627:10;;24506:137;;;;:::o;24649:435::-;;24851:95;24942:3;24933:6;24851:95;:::i;:::-;24844:102;;24963:95;25054:3;25045:6;24963:95;:::i;:::-;24956:102;;25075:3;25068:10;;24833:251;;;;;:::o;25090:222::-;;25221:2;25210:9;25206:18;25198:26;;25234:71;25302:1;25291:9;25287:17;25278:6;25234:71;:::i;:::-;25188:124;;;;:::o;25318:672::-;;25567:3;25556:9;25552:19;25544:27;;25581:87;25665:1;25654:9;25650:17;25641:6;25581:87;:::i;:::-;25678:72;25746:2;25735:9;25731:18;25722:6;25678:72;:::i;:::-;25760;25828:2;25817:9;25813:18;25804:6;25760:72;:::i;:::-;25879:9;25873:4;25869:20;25864:2;25853:9;25849:18;25842:48;25907:76;25978:4;25969:6;25907:76;:::i;:::-;25899:84;;25534:456;;;;;;;:::o;25996:458::-;;26191:2;26180:9;26176:18;26168:26;;26204:79;26280:1;26269:9;26265:17;26256:6;26204:79;:::i;:::-;26293:72;26361:2;26350:9;26346:18;26337:6;26293:72;:::i;:::-;26375;26443:2;26432:9;26428:18;26419:6;26375:72;:::i;:::-;26158:296;;;;;;:::o;26460:373::-;;26641:2;26630:9;26626:18;26618:26;;26690:9;26684:4;26680:20;26676:1;26665:9;26661:17;26654:47;26718:108;26821:4;26812:6;26718:108;:::i;:::-;26710:116;;26608:225;;;;:::o;26839:210::-;;26964:2;26953:9;26949:18;26941:26;;26977:65;27039:1;27028:9;27024:17;27015:6;26977:65;:::i;:::-;26931:118;;;;:::o;27055:313::-;;27206:2;27195:9;27191:18;27183:26;;27255:9;27249:4;27245:20;27241:1;27230:9;27226:17;27219:47;27283:78;27356:4;27347:6;27283:78;:::i;:::-;27275:86;;27173:195;;;;:::o;27374:419::-;;27578:2;27567:9;27563:18;27555:26;;27627:9;27621:4;27617:20;27613:1;27602:9;27598:17;27591:47;27655:131;27781:4;27655:131;:::i;:::-;27647:139;;27545:248;;;:::o;27799:419::-;;28003:2;27992:9;27988:18;27980:26;;28052:9;28046:4;28042:20;28038:1;28027:9;28023:17;28016:47;28080:131;28206:4;28080:131;:::i;:::-;28072:139;;27970:248;;;:::o;28224:419::-;;28428:2;28417:9;28413:18;28405:26;;28477:9;28471:4;28467:20;28463:1;28452:9;28448:17;28441:47;28505:131;28631:4;28505:131;:::i;:::-;28497:139;;28395:248;;;:::o;28649:419::-;;28853:2;28842:9;28838:18;28830:26;;28902:9;28896:4;28892:20;28888:1;28877:9;28873:17;28866:47;28930:131;29056:4;28930:131;:::i;:::-;28922:139;;28820:248;;;:::o;29074:419::-;;29278:2;29267:9;29263:18;29255:26;;29327:9;29321:4;29317:20;29313:1;29302:9;29298:17;29291:47;29355:131;29481:4;29355:131;:::i;:::-;29347:139;;29245:248;;;:::o;29499:419::-;;29703:2;29692:9;29688:18;29680:26;;29752:9;29746:4;29742:20;29738:1;29727:9;29723:17;29716:47;29780:131;29906:4;29780:131;:::i;:::-;29772:139;;29670:248;;;:::o;29924:419::-;;30128:2;30117:9;30113:18;30105:26;;30177:9;30171:4;30167:20;30163:1;30152:9;30148:17;30141:47;30205:131;30331:4;30205:131;:::i;:::-;30197:139;;30095:248;;;:::o;30349:419::-;;30553:2;30542:9;30538:18;30530:26;;30602:9;30596:4;30592:20;30588:1;30577:9;30573:17;30566:47;30630:131;30756:4;30630:131;:::i;:::-;30622:139;;30520:248;;;:::o;30774:419::-;;30978:2;30967:9;30963:18;30955:26;;31027:9;31021:4;31017:20;31013:1;31002:9;30998:17;30991:47;31055:131;31181:4;31055:131;:::i;:::-;31047:139;;30945:248;;;:::o;31199:419::-;;31403:2;31392:9;31388:18;31380:26;;31452:9;31446:4;31442:20;31438:1;31427:9;31423:17;31416:47;31480:131;31606:4;31480:131;:::i;:::-;31472:139;;31370:248;;;:::o;31624:419::-;;31828:2;31817:9;31813:18;31805:26;;31877:9;31871:4;31867:20;31863:1;31852:9;31848:17;31841:47;31905:131;32031:4;31905:131;:::i;:::-;31897:139;;31795:248;;;:::o;32049:419::-;;32253:2;32242:9;32238:18;32230:26;;32302:9;32296:4;32292:20;32288:1;32277:9;32273:17;32266:47;32330:131;32456:4;32330:131;:::i;:::-;32322:139;;32220:248;;;:::o;32474:419::-;;32678:2;32667:9;32663:18;32655:26;;32727:9;32721:4;32717:20;32713:1;32702:9;32698:17;32691:47;32755:131;32881:4;32755:131;:::i;:::-;32747:139;;32645:248;;;:::o;32899:419::-;;33103:2;33092:9;33088:18;33080:26;;33152:9;33146:4;33142:20;33138:1;33127:9;33123:17;33116:47;33180:131;33306:4;33180:131;:::i;:::-;33172:139;;33070:248;;;:::o;33324:419::-;;33528:2;33517:9;33513:18;33505:26;;33577:9;33571:4;33567:20;33563:1;33552:9;33548:17;33541:47;33605:131;33731:4;33605:131;:::i;:::-;33597:139;;33495:248;;;:::o;33749:419::-;;33953:2;33942:9;33938:18;33930:26;;34002:9;33996:4;33992:20;33988:1;33977:9;33973:17;33966:47;34030:131;34156:4;34030:131;:::i;:::-;34022:139;;33920:248;;;:::o;34174:419::-;;34378:2;34367:9;34363:18;34355:26;;34427:9;34421:4;34417:20;34413:1;34402:9;34398:17;34391:47;34455:131;34581:4;34455:131;:::i;:::-;34447:139;;34345:248;;;:::o;34599:419::-;;34803:2;34792:9;34788:18;34780:26;;34852:9;34846:4;34842:20;34838:1;34827:9;34823:17;34816:47;34880:131;35006:4;34880:131;:::i;:::-;34872:139;;34770:248;;;:::o;35024:419::-;;35228:2;35217:9;35213:18;35205:26;;35277:9;35271:4;35267:20;35263:1;35252:9;35248:17;35241:47;35305:131;35431:4;35305:131;:::i;:::-;35297:139;;35195:248;;;:::o;35449:419::-;;35653:2;35642:9;35638:18;35630:26;;35702:9;35696:4;35692:20;35688:1;35677:9;35673:17;35666:47;35730:131;35856:4;35730:131;:::i;:::-;35722:139;;35620:248;;;:::o;35874:419::-;;36078:2;36067:9;36063:18;36055:26;;36127:9;36121:4;36117:20;36113:1;36102:9;36098:17;36091:47;36155:131;36281:4;36155:131;:::i;:::-;36147:139;;36045:248;;;:::o;36299:419::-;;36503:2;36492:9;36488:18;36480:26;;36552:9;36546:4;36542:20;36538:1;36527:9;36523:17;36516:47;36580:131;36706:4;36580:131;:::i;:::-;36572:139;;36470:248;;;:::o;36724:419::-;;36928:2;36917:9;36913:18;36905:26;;36977:9;36971:4;36967:20;36963:1;36952:9;36948:17;36941:47;37005:131;37131:4;37005:131;:::i;:::-;36997:139;;36895:248;;;:::o;37149:419::-;;37353:2;37342:9;37338:18;37330:26;;37402:9;37396:4;37392:20;37388:1;37377:9;37373:17;37366:47;37430:131;37556:4;37430:131;:::i;:::-;37422:139;;37320:248;;;:::o;37574:419::-;;37778:2;37767:9;37763:18;37755:26;;37827:9;37821:4;37817:20;37813:1;37802:9;37798:17;37791:47;37855:131;37981:4;37855:131;:::i;:::-;37847:139;;37745:248;;;:::o;37999:419::-;;38203:2;38192:9;38188:18;38180:26;;38252:9;38246:4;38242:20;38238:1;38227:9;38223:17;38216:47;38280:131;38406:4;38280:131;:::i;:::-;38272:139;;38170:248;;;:::o;38424:419::-;;38628:2;38617:9;38613:18;38605:26;;38677:9;38671:4;38667:20;38663:1;38652:9;38648:17;38641:47;38705:131;38831:4;38705:131;:::i;:::-;38697:139;;38595:248;;;:::o;38849:419::-;;39053:2;39042:9;39038:18;39030:26;;39102:9;39096:4;39092:20;39088:1;39077:9;39073:17;39066:47;39130:131;39256:4;39130:131;:::i;:::-;39122:139;;39020:248;;;:::o;39274:419::-;;39478:2;39467:9;39463:18;39455:26;;39527:9;39521:4;39517:20;39513:1;39502:9;39498:17;39491:47;39555:131;39681:4;39555:131;:::i;:::-;39547:139;;39445:248;;;:::o;39699:419::-;;39903:2;39892:9;39888:18;39880:26;;39952:9;39946:4;39942:20;39938:1;39927:9;39923:17;39916:47;39980:131;40106:4;39980:131;:::i;:::-;39972:139;;39870:248;;;:::o;40124:419::-;;40328:2;40317:9;40313:18;40305:26;;40377:9;40371:4;40367:20;40363:1;40352:9;40348:17;40341:47;40405:131;40531:4;40405:131;:::i;:::-;40397:139;;40295:248;;;:::o;40549:419::-;;40753:2;40742:9;40738:18;40730:26;;40802:9;40796:4;40792:20;40788:1;40777:9;40773:17;40766:47;40830:131;40956:4;40830:131;:::i;:::-;40822:139;;40720:248;;;:::o;40974:419::-;;41178:2;41167:9;41163:18;41155:26;;41227:9;41221:4;41217:20;41213:1;41202:9;41198:17;41191:47;41255:131;41381:4;41255:131;:::i;:::-;41247:139;;41145:248;;;:::o;41399:419::-;;41603:2;41592:9;41588:18;41580:26;;41652:9;41646:4;41642:20;41638:1;41627:9;41623:17;41616:47;41680:131;41806:4;41680:131;:::i;:::-;41672:139;;41570:248;;;:::o;41824:419::-;;42028:2;42017:9;42013:18;42005:26;;42077:9;42071:4;42067:20;42063:1;42052:9;42048:17;42041:47;42105:131;42231:4;42105:131;:::i;:::-;42097:139;;41995:248;;;:::o;42249:222::-;;42380:2;42369:9;42365:18;42357:26;;42393:71;42461:1;42450:9;42446:17;42437:6;42393:71;:::i;:::-;42347:124;;;;:::o;42477:278::-;;42543:2;42537:9;42527:19;;42585:4;42577:6;42573:17;42692:6;42680:10;42677:22;42656:18;42644:10;42641:34;42638:62;42635:2;;;42703:13;;:::i;:::-;42635:2;42738:10;42734:2;42727:22;42517:238;;;;:::o;42761:306::-;;42928:18;42920:6;42917:30;42914:2;;;42950:13;;:::i;:::-;42914:2;42995:4;42987:6;42983:17;42975:25;;43055:4;43049;43045:15;43037:23;;42843:224;;;:::o;43073:326::-;;43224:18;43216:6;43213:30;43210:2;;;43246:13;;:::i;:::-;43210:2;43326:4;43322:9;43315:4;43307:6;43303:17;43299:33;43291:41;;43387:4;43381;43377:15;43369:23;;43139:260;;;:::o;43405:327::-;;43557:18;43549:6;43546:30;43543:2;;;43579:13;;:::i;:::-;43543:2;43659:4;43655:9;43648:4;43640:6;43636:17;43632:33;43624:41;;43720:4;43714;43710:15;43702:23;;43472:260;;;:::o;43738:132::-;;43828:3;43820:11;;43858:4;43853:3;43849:14;43841:22;;43810:60;;;:::o;43876:114::-;;43977:5;43971:12;43961:22;;43950:40;;;:::o;43996:98::-;;44081:5;44075:12;44065:22;;44054:40;;;:::o;44100:99::-;;44186:5;44180:12;44170:22;;44159:40;;;:::o;44205:113::-;;44307:4;44302:3;44298:14;44290:22;;44280:38;;;:::o;44324:184::-;;44457:6;44452:3;44445:19;44497:4;44492:3;44488:14;44473:29;;44435:73;;;;:::o;44514:168::-;;44631:6;44626:3;44619:19;44671:4;44666:3;44662:14;44647:29;;44609:73;;;;:::o;44688:147::-;;44826:3;44811:18;;44801:34;;;;:::o;44841:169::-;;44959:6;44954:3;44947:19;44999:4;44994:3;44990:14;44975:29;;44937:73;;;;:::o;45016:148::-;;45155:3;45140:18;;45130:34;;;;:::o;45170:96::-;;45236:24;45254:5;45236:24;:::i;:::-;45225:35;;45215:51;;;:::o;45272:104::-;;45346:24;45364:5;45346:24;:::i;:::-;45335:35;;45325:51;;;:::o;45382:90::-;;45459:5;45452:13;45445:21;45434:32;;45424:48;;;:::o;45478:149::-;;45554:66;45547:5;45543:78;45532:89;;45522:105;;;:::o;45633:126::-;;45710:42;45703:5;45699:54;45688:65;;45678:81;;;:::o;45765:77::-;;45831:5;45820:16;;45810:32;;;:::o;45848:134::-;;45939:37;45970:5;45939:37;:::i;:::-;45926:50;;45916:66;;;:::o;45988:126::-;;46071:37;46102:5;46071:37;:::i;:::-;46058:50;;46048:66;;;:::o;46120:113::-;;46203:24;46221:5;46203:24;:::i;:::-;46190:37;;46180:53;;;:::o;46239:154::-;46323:6;46318:3;46313;46300:30;46385:1;46376:6;46371:3;46367:16;46360:27;46290:103;;;:::o;46399:307::-;46467:1;46477:113;46491:6;46488:1;46485:13;46477:113;;;46576:1;46571:3;46567:11;46561:18;46557:1;46552:3;46548:11;46541:39;46513:2;46510:1;46506:10;46501:15;;46477:113;;;46608:6;46605:1;46602:13;46599:2;;;46688:1;46679:6;46674:3;46670:16;46663:27;46599:2;46448:258;;;;:::o;46712:48::-;46745:9;46766:102;;46858:2;46854:7;46849:2;46842:5;46838:14;46834:28;46824:38;;46814:54;;;:::o;46874:122::-;46947:24;46965:5;46947:24;:::i;:::-;46940:5;46937:35;46927:2;;46986:1;46983;46976:12;46927:2;46917:79;:::o;47002:116::-;47072:21;47087:5;47072:21;:::i;:::-;47065:5;47062:32;47052:2;;47108:1;47105;47098:12;47052:2;47042:76;:::o;47124:120::-;47196:23;47213:5;47196:23;:::i;:::-;47189:5;47186:34;47176:2;;47234:1;47231;47224:12;47176:2;47166:78;:::o;47250:122::-;47323:24;47341:5;47323:24;:::i;:::-;47316:5;47313:35;47303:2;;47362:1;47359;47352:12;47303:2;47293:79;:::o

Swarm Source

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