ETH Price: $3,311.90 (-2.91%)
Gas: 13 Gwei

Token

MonkeyBrix Awards (MKBXA)
 

Overview

Max Total Supply

540 MKBXA

Holders

139

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MKBXA
0x19bd0ac8d147dfd963b069d06c7d272069495231
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:
MonkeyBrixAwards

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2021-06-27
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

}

pragma solidity ^0.8.0;

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

        uint256 size;
        // 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);
            }
        }
    }
}

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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




pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        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;
    }
}


pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` 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 { }
}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


contract MonkeyBrixAwards is ERC721Enumerable, Ownable{
    using SafeMath for uint256;
    using Address for address;
    using Strings for uint256;
    uint16 public CURRENT_METAL = 0;
    uint16 public METAL_END = 529;
    uint16 public CURRENT_CRYSTAL = 530;
    uint16 public CRYSTAL_END = 549;
    
    
    uint256 public MAX_SUPPLY = 550;

    string private _baseURIExtended;
    mapping (uint256 => string) _tokenURIs;

    constructor() ERC721("MonkeyBrix Awards","MKBXA"){
    }
    function airdrop(address[] memory receivers, uint8[] memory metalCounts, uint8[] memory crystalCounts) public onlyOwner{
        require(receivers.length == metalCounts.length, "mismatched length");
        require(metalCounts.length == crystalCounts.length, "mismatched length");
        uint8 metalCount;
        uint8 crystalCount;
        address receiver;
        uint8 i;
        for (i=0; i<receivers.length; i++){
            receiver = receivers[i];
            metalCount = metalCounts[i];
            mintMetal(receiver , metalCount);
            crystalCount = crystalCounts[i];
            mintCrystal(receiver, crystalCount);
        }
    }

    function mintMetal(address receiver, uint8 count) public onlyOwner {
        uint8 i;
        uint16 tokenId;
        for (i = 0 ; i < count; i++){
            require(CURRENT_METAL <= METAL_END, "reached end of METAL");
            tokenId = CURRENT_METAL;
            CURRENT_METAL = CURRENT_METAL + 1;
            _safeMint(receiver, tokenId);
        }
    }
    function mintCrystal(address receiver, uint8 count) public onlyOwner{
        uint8 i;
        uint16 tokenId;
        for (i = 0 ; i < count; i++){
            require(CURRENT_CRYSTAL <= CRYSTAL_END, "reached end of crystal");
            tokenId = CURRENT_CRYSTAL;
            CURRENT_CRYSTAL = CURRENT_CRYSTAL + 1;
            _safeMint(receiver, tokenId);
        }
    }


    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function reserveTokens(address receiver, uint8 metalCount, uint8 crystalCount) public onlyOwner {
        mintCrystal(receiver, crystalCount);
        mintMetal(receiver, metalCount);
    } 
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIExtended;
    }

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIExtended = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory base = _baseURI();
        return string(abi.encodePacked(base, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CRYSTAL_END","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURRENT_CRYSTAL","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURRENT_METAL","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METAL_END","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint8[]","name":"metalCounts","type":"uint8[]"},{"internalType":"uint8[]","name":"crystalCounts","type":"uint8[]"}],"name":"airdrop","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint8","name":"count","type":"uint8"}],"name":"mintCrystal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint8","name":"count","type":"uint8"}],"name":"mintMetal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint8","name":"metalCount","type":"uint8"},{"internalType":"uint8","name":"crystalCount","type":"uint8"}],"name":"reserveTokens","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":"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":[],"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"}]

60806040526000600a60146101000a81548161ffff021916908361ffff160217905550610211600a60166101000a81548161ffff021916908361ffff160217905550610212600a60186101000a81548161ffff021916908361ffff160217905550610225600a601a6101000a81548161ffff021916908361ffff160217905550610226600b553480156200009257600080fd5b506040518060400160405280601181526020017f4d6f6e6b657942726978204177617264730000000000000000000000000000008152506040518060400160405280600581526020017f4d4b425841000000000000000000000000000000000000000000000000000000815250816000908051906020019062000117929190620001f2565b50806001908051906020019062000130929190620001f2565b505050600062000145620001ea60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000307565b600033905090565b8280546200020090620002a2565b90600052602060002090601f01602090048101928262000224576000855562000270565b82601f106200023f57805160ff191683800117855562000270565b8280016001018555821562000270579182015b828111156200026f57825182559160200191906001019062000252565b5b5090506200027f919062000283565b5090565b5b808211156200029e57600081600090555060010162000284565b5090565b60006002820490506001821680620002bb57607f821691505b60208210811415620002d257620002d1620002d8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6141fd80620003176000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063626d067c1161010457806395d89b41116100a2578063c87b56dd11610071578063c87b56dd1461051d578063e8f096db1461054d578063e985e9c514610569578063f2fde38b14610599576101da565b806395d89b41146104a9578063a22cb465146104c7578063b88d4fde146104e3578063c39c20e6146104ff576101da565b8063715018a6116100de578063715018a6146104475780638cab77f7146104515780638da5cb5b1461046d57806392bb79f51461048b576101da565b8063626d067c146103cb5780636352211e146103e757806370a0823114610417576101da565b806332cb6b0c1161017c5780634f6ccce71161014b5780634f6ccce71461034557806355f804b3146103755780635a4eca3014610391578063601c0a46146103ad576101da565b806332cb6b0c146102e35780633ccfd60b1461030157806342842e0e1461030b57806345a38bcd14610327576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190613034565b6105b5565b60405161020691906139ae565b60405180910390f35b61021761062f565b60405161022491906139c9565b60405180910390f35b610247600480360381019061024291906130c7565b6106c1565b6040516102549190613947565b60405180910390f35b61027760048036038101906102729190612ed6565b610746565b005b61028161085e565b60405161028e9190613ca6565b60405180910390f35b6102b160048036038101906102ac9190612dd0565b61086b565b005b6102cd60048036038101906102c89190612ed6565b6108cb565b6040516102da9190613ca6565b60405180910390f35b6102eb610970565b6040516102f89190613ca6565b60405180910390f35b610309610976565b005b61032560048036038101906103209190612dd0565b610a41565b005b61032f610a61565b60405161033c9190613c8b565b60405180910390f35b61035f600480360381019061035a91906130c7565b610a75565b60405161036c9190613ca6565b60405180910390f35b61038f600480360381019061038a9190613086565b610b0c565b005b6103ab60048036038101906103a69190612f12565b610ba2565b005b6103b5610d12565b6040516103c29190613c8b565b60405180910390f35b6103e560048036038101906103e09190612f4e565b610d26565b005b61040160048036038101906103fc91906130c7565b610dbb565b60405161040e9190613947565b60405180910390f35b610431600480360381019061042c9190612d6b565b610e6d565b60405161043e9190613ca6565b60405180910390f35b61044f610f25565b005b61046b60048036038101906104669190612f9d565b611062565b005b61047561127f565b6040516104829190613947565b60405180910390f35b6104936112a9565b6040516104a09190613c8b565b60405180910390f35b6104b16112bd565b6040516104be91906139c9565b60405180910390f35b6104e160048036038101906104dc9190612e9a565b61134f565b005b6104fd60048036038101906104f89190612e1f565b6114d0565b005b610507611532565b6040516105149190613c8b565b60405180910390f35b610537600480360381019061053291906130c7565b611546565b60405161054491906139c9565b60405180910390f35b61056760048036038101906105629190612f12565b6115ce565b005b610583600480360381019061057e9190612d94565b61173e565b60405161059091906139ae565b60405180910390f35b6105b360048036038101906105ae9190612d6b565b6117d2565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062857506106278261197e565b5b9050919050565b60606000805461063e90613fb1565b80601f016020809104026020016040519081016040528092919081815260200182805461066a90613fb1565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b60006106cc82611a60565b61070b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070290613b8b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075182610dbb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b990613c0b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107e1611acc565b73ffffffffffffffffffffffffffffffffffffffff161480610810575061080f8161080a611acc565b61173e565b5b61084f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084690613b0b565b60405180910390fd5b6108598383611ad4565b505050565b6000600880549050905090565b61087c610876611acc565b82611b8d565b6108bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b290613c2b565b60405180910390fd5b6108c6838383611c6b565b505050565b60006108d683610e6d565b8210610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906139eb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b61097e611acc565b73ffffffffffffffffffffffffffffffffffffffff1661099c61127f565b73ffffffffffffffffffffffffffffffffffffffff16146109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e990613bab565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a3d573d6000803e3d6000fd5b5050565b610a5c838383604051806020016040528060008152506114d0565b505050565b600a60189054906101000a900461ffff1681565b6000610a7f61085e565b8210610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790613c4b565b60405180910390fd5b60088281548110610afa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610b14611acc565b73ffffffffffffffffffffffffffffffffffffffff16610b3261127f565b73ffffffffffffffffffffffffffffffffffffffff1614610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90613bab565b60405180910390fd5b80600c9080519060200190610b9e929190612a4e565b5050565b610baa611acc565b73ffffffffffffffffffffffffffffffffffffffff16610bc861127f565b73ffffffffffffffffffffffffffffffffffffffff1614610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590613bab565b60405180910390fd5b600080600091505b8260ff168260ff161015610d0c57600a601a9054906101000a900461ffff1661ffff16600a60189054906101000a900461ffff1661ffff161115610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613aeb565b60405180910390fd5b600a60189054906101000a900461ffff1690506001600a60189054906101000a900461ffff16610ccf9190613ded565b600a60186101000a81548161ffff021916908361ffff160217905550610cf9848261ffff16611ec7565b8180610d049061402c565b925050610c26565b50505050565b600a601a9054906101000a900461ffff1681565b610d2e611acc565b73ffffffffffffffffffffffffffffffffffffffff16610d4c61127f565b73ffffffffffffffffffffffffffffffffffffffff1614610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990613bab565b60405180910390fd5b610dac8382610ba2565b610db683836115ce565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90613b4b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590613b2b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f2d611acc565b73ffffffffffffffffffffffffffffffffffffffff16610f4b61127f565b73ffffffffffffffffffffffffffffffffffffffff1614610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9890613bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61106a611acc565b73ffffffffffffffffffffffffffffffffffffffff1661108861127f565b73ffffffffffffffffffffffffffffffffffffffff16146110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d590613bab565b60405180910390fd5b8151835114611122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111990613c6b565b60405180910390fd5b8051825114611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90613c6b565b60405180910390fd5b600080600080600090505b86518160ff16101561127657868160ff16815181106111b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150858160ff16815181106111ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151935061121382856115ce565b848160ff168151811061124f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015192506112638284610ba2565b808061126e9061402c565b915050611171565b50505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60169054906101000a900461ffff1681565b6060600180546112cc90613fb1565b80601f01602080910402602001604051908101604052809291908181526020018280546112f890613fb1565b80156113455780601f1061131a57610100808354040283529160200191611345565b820191906000526020600020905b81548152906001019060200180831161132857829003601f168201915b5050505050905090565b611357611acc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc90613aab565b60405180910390fd5b80600560006113d2611acc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661147f611acc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114c491906139ae565b60405180910390a35050565b6114e16114db611acc565b83611b8d565b611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790613c2b565b60405180910390fd5b61152c84848484611ee5565b50505050565b600a60149054906101000a900461ffff1681565b606061155182611a60565b611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613beb565b60405180910390fd5b600061159a611f41565b9050806115a684611fd3565b6040516020016115b7929190613923565b604051602081830303815290604052915050919050565b6115d6611acc565b73ffffffffffffffffffffffffffffffffffffffff166115f461127f565b73ffffffffffffffffffffffffffffffffffffffff161461164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190613bab565b60405180910390fd5b600080600091505b8260ff168260ff16101561173857600a60169054906101000a900461ffff1661ffff16600a60149054906101000a900461ffff1661ffff1611156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290613a4b565b60405180910390fd5b600a60149054906101000a900461ffff1690506001600a60149054906101000a900461ffff166116fb9190613ded565b600a60146101000a81548161ffff021916908361ffff160217905550611725848261ffff16611ec7565b81806117309061402c565b925050611652565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117da611acc565b73ffffffffffffffffffffffffffffffffffffffff166117f861127f565b73ffffffffffffffffffffffffffffffffffffffff161461184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590613bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b590613a2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a595750611a5882612180565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b4783610dbb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b9882611a60565b611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90613acb565b60405180910390fd5b6000611be283610dbb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c5157508373ffffffffffffffffffffffffffffffffffffffff16611c39846106c1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c625750611c61818561173e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c8b82610dbb565b73ffffffffffffffffffffffffffffffffffffffff1614611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd890613bcb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613a8b565b60405180910390fd5b611d5c8383836121ea565b611d67600082611ad4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611db79190613eac565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0e9190613e25565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ee18282604051806020016040528060008152506122fe565b5050565b611ef0848484611c6b565b611efc84848484612359565b611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3290613a0b565b60405180910390fd5b50505050565b6060600c8054611f5090613fb1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7c90613fb1565b8015611fc95780601f10611f9e57610100808354040283529160200191611fc9565b820191906000526020600020905b815481529060010190602001808311611fac57829003601f168201915b5050505050905090565b6060600082141561201b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061217b565b600082905060005b6000821461204d57808061203690613fe3565b915050600a826120469190613e7b565b9150612023565b60008167ffffffffffffffff81111561208f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120c15781602001600182028036833780820191505090505b5090505b60008514612174576001826120da9190613eac565b9150600a856120e99190614056565b60306120f59190613e25565b60f81b818381518110612131577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561216d9190613e7b565b94506120c5565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121f58383836124f0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561223857612233816124f5565b612277565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461227657612275838261253e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122ba576122b5816126ab565b6122f9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122f8576122f782826127ee565b5b5b505050565b612308838361286d565b6123156000848484612359565b612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b90613a0b565b60405180910390fd5b505050565b600061237a8473ffffffffffffffffffffffffffffffffffffffff16612a3b565b156124e3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a3611acc565b8786866040518563ffffffff1660e01b81526004016123c59493929190613962565b602060405180830381600087803b1580156123df57600080fd5b505af192505050801561241057506040513d601f19601f8201168201806040525081019061240d919061305d565b60015b612493573d8060008114612440576040519150601f19603f3d011682016040523d82523d6000602084013e612445565b606091505b5060008151141561248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248290613a0b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124e8565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161254b84610e6d565b6125559190613eac565b905060006007600084815260200190815260200160002054905081811461263a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126bf9190613eac565b9050600060096000848152602001908152602001600020549050600060088381548110612715577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061275d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127f983610e6d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d490613b6b565b60405180910390fd5b6128e681611a60565b15612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291d90613a6b565b60405180910390fd5b612932600083836121ea565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129829190613e25565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5a90613fb1565b90600052602060002090601f016020900481019282612a7c5760008555612ac3565b82601f10612a9557805160ff1916838001178555612ac3565b82800160010185558215612ac3579182015b82811115612ac2578251825591602001919060010190612aa7565b5b509050612ad09190612ad4565b5090565b5b80821115612aed576000816000905550600101612ad5565b5090565b6000612b04612aff84613cf2565b613cc1565b90508083825260208201905082856020860282011115612b2357600080fd5b60005b85811015612b535781612b398882612c45565b845260208401935060208301925050600181019050612b26565b5050509392505050565b6000612b70612b6b84613d1e565b613cc1565b90508083825260208201905082856020860282011115612b8f57600080fd5b60005b85811015612bbf5781612ba58882612d56565b845260208401935060208301925050600181019050612b92565b5050509392505050565b6000612bdc612bd784613d4a565b613cc1565b905082815260208101848484011115612bf457600080fd5b612bff848285613f6f565b509392505050565b6000612c1a612c1584613d7a565b613cc1565b905082815260208101848484011115612c3257600080fd5b612c3d848285613f6f565b509392505050565b600081359050612c5481614154565b92915050565b600082601f830112612c6b57600080fd5b8135612c7b848260208601612af1565b91505092915050565b600082601f830112612c9557600080fd5b8135612ca5848260208601612b5d565b91505092915050565b600081359050612cbd8161416b565b92915050565b600081359050612cd281614182565b92915050565b600081519050612ce781614182565b92915050565b600082601f830112612cfe57600080fd5b8135612d0e848260208601612bc9565b91505092915050565b600082601f830112612d2857600080fd5b8135612d38848260208601612c07565b91505092915050565b600081359050612d5081614199565b92915050565b600081359050612d65816141b0565b92915050565b600060208284031215612d7d57600080fd5b6000612d8b84828501612c45565b91505092915050565b60008060408385031215612da757600080fd5b6000612db585828601612c45565b9250506020612dc685828601612c45565b9150509250929050565b600080600060608486031215612de557600080fd5b6000612df386828701612c45565b9350506020612e0486828701612c45565b9250506040612e1586828701612d41565b9150509250925092565b60008060008060808587031215612e3557600080fd5b6000612e4387828801612c45565b9450506020612e5487828801612c45565b9350506040612e6587828801612d41565b925050606085013567ffffffffffffffff811115612e8257600080fd5b612e8e87828801612ced565b91505092959194509250565b60008060408385031215612ead57600080fd5b6000612ebb85828601612c45565b9250506020612ecc85828601612cae565b9150509250929050565b60008060408385031215612ee957600080fd5b6000612ef785828601612c45565b9250506020612f0885828601612d41565b9150509250929050565b60008060408385031215612f2557600080fd5b6000612f3385828601612c45565b9250506020612f4485828601612d56565b9150509250929050565b600080600060608486031215612f6357600080fd5b6000612f7186828701612c45565b9350506020612f8286828701612d56565b9250506040612f9386828701612d56565b9150509250925092565b600080600060608486031215612fb257600080fd5b600084013567ffffffffffffffff811115612fcc57600080fd5b612fd886828701612c5a565b935050602084013567ffffffffffffffff811115612ff557600080fd5b61300186828701612c84565b925050604084013567ffffffffffffffff81111561301e57600080fd5b61302a86828701612c84565b9150509250925092565b60006020828403121561304657600080fd5b600061305484828501612cc3565b91505092915050565b60006020828403121561306f57600080fd5b600061307d84828501612cd8565b91505092915050565b60006020828403121561309857600080fd5b600082013567ffffffffffffffff8111156130b257600080fd5b6130be84828501612d17565b91505092915050565b6000602082840312156130d957600080fd5b60006130e784828501612d41565b91505092915050565b6130f981613ee0565b82525050565b61310881613ef2565b82525050565b600061311982613daa565b6131238185613dc0565b9350613133818560208601613f7e565b61313c81614143565b840191505092915050565b600061315282613db5565b61315c8185613dd1565b935061316c818560208601613f7e565b61317581614143565b840191505092915050565b600061318b82613db5565b6131958185613de2565b93506131a5818560208601613f7e565b80840191505092915050565b60006131be602b83613dd1565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613224603283613dd1565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061328a602683613dd1565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132f0601483613dd1565b91507f7265616368656420656e64206f66204d4554414c0000000000000000000000006000830152602082019050919050565b6000613330601c83613dd1565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613370602483613dd1565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133d6601983613dd1565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613416602c83613dd1565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061347c601683613dd1565b91507f7265616368656420656e64206f66206372797374616c000000000000000000006000830152602082019050919050565b60006134bc603883613dd1565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613522602a83613dd1565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613588602983613dd1565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ee602083613dd1565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061362e602c83613dd1565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613694602083613dd1565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006136d4602983613dd1565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061373a602f83613dd1565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006137a0602183613dd1565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613806603183613dd1565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061386c602c83613dd1565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006138d2601183613dd1565b91507f6d69736d617463686564206c656e6774680000000000000000000000000000006000830152602082019050919050565b61390e81613f2a565b82525050565b61391d81613f58565b82525050565b600061392f8285613180565b915061393b8284613180565b91508190509392505050565b600060208201905061395c60008301846130f0565b92915050565b600060808201905061397760008301876130f0565b61398460208301866130f0565b6139916040830185613914565b81810360608301526139a3818461310e565b905095945050505050565b60006020820190506139c360008301846130ff565b92915050565b600060208201905081810360008301526139e38184613147565b905092915050565b60006020820190508181036000830152613a04816131b1565b9050919050565b60006020820190508181036000830152613a2481613217565b9050919050565b60006020820190508181036000830152613a448161327d565b9050919050565b60006020820190508181036000830152613a64816132e3565b9050919050565b60006020820190508181036000830152613a8481613323565b9050919050565b60006020820190508181036000830152613aa481613363565b9050919050565b60006020820190508181036000830152613ac4816133c9565b9050919050565b60006020820190508181036000830152613ae481613409565b9050919050565b60006020820190508181036000830152613b048161346f565b9050919050565b60006020820190508181036000830152613b24816134af565b9050919050565b60006020820190508181036000830152613b4481613515565b9050919050565b60006020820190508181036000830152613b648161357b565b9050919050565b60006020820190508181036000830152613b84816135e1565b9050919050565b60006020820190508181036000830152613ba481613621565b9050919050565b60006020820190508181036000830152613bc481613687565b9050919050565b60006020820190508181036000830152613be4816136c7565b9050919050565b60006020820190508181036000830152613c048161372d565b9050919050565b60006020820190508181036000830152613c2481613793565b9050919050565b60006020820190508181036000830152613c44816137f9565b9050919050565b60006020820190508181036000830152613c648161385f565b9050919050565b60006020820190508181036000830152613c84816138c5565b9050919050565b6000602082019050613ca06000830184613905565b92915050565b6000602082019050613cbb6000830184613914565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613ce857613ce7614114565b5b8060405250919050565b600067ffffffffffffffff821115613d0d57613d0c614114565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d3957613d38614114565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d6557613d64614114565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613d9557613d94614114565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613df882613f2a565b9150613e0383613f2a565b92508261ffff03821115613e1a57613e19614087565b5b828201905092915050565b6000613e3082613f58565b9150613e3b83613f58565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e7057613e6f614087565b5b828201905092915050565b6000613e8682613f58565b9150613e9183613f58565b925082613ea157613ea06140b6565b5b828204905092915050565b6000613eb782613f58565b9150613ec283613f58565b925082821015613ed557613ed4614087565b5b828203905092915050565b6000613eeb82613f38565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613f9c578082015181840152602081019050613f81565b83811115613fab576000848401525b50505050565b60006002820490506001821680613fc957607f821691505b60208210811415613fdd57613fdc6140e5565b5b50919050565b6000613fee82613f58565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561402157614020614087565b5b600182019050919050565b600061403782613f62565b915060ff82141561404b5761404a614087565b5b600182019050919050565b600061406182613f58565b915061406c83613f58565b92508261407c5761407b6140b6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61415d81613ee0565b811461416857600080fd5b50565b61417481613ef2565b811461417f57600080fd5b50565b61418b81613efe565b811461419657600080fd5b50565b6141a281613f58565b81146141ad57600080fd5b50565b6141b981613f62565b81146141c457600080fd5b5056fea2646970667358221220d4456595591c5f234c8b86de20c992e8777dabcea4a3b2336a29bbfa42127ddc64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063626d067c1161010457806395d89b41116100a2578063c87b56dd11610071578063c87b56dd1461051d578063e8f096db1461054d578063e985e9c514610569578063f2fde38b14610599576101da565b806395d89b41146104a9578063a22cb465146104c7578063b88d4fde146104e3578063c39c20e6146104ff576101da565b8063715018a6116100de578063715018a6146104475780638cab77f7146104515780638da5cb5b1461046d57806392bb79f51461048b576101da565b8063626d067c146103cb5780636352211e146103e757806370a0823114610417576101da565b806332cb6b0c1161017c5780634f6ccce71161014b5780634f6ccce71461034557806355f804b3146103755780635a4eca3014610391578063601c0a46146103ad576101da565b806332cb6b0c146102e35780633ccfd60b1461030157806342842e0e1461030b57806345a38bcd14610327576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190613034565b6105b5565b60405161020691906139ae565b60405180910390f35b61021761062f565b60405161022491906139c9565b60405180910390f35b610247600480360381019061024291906130c7565b6106c1565b6040516102549190613947565b60405180910390f35b61027760048036038101906102729190612ed6565b610746565b005b61028161085e565b60405161028e9190613ca6565b60405180910390f35b6102b160048036038101906102ac9190612dd0565b61086b565b005b6102cd60048036038101906102c89190612ed6565b6108cb565b6040516102da9190613ca6565b60405180910390f35b6102eb610970565b6040516102f89190613ca6565b60405180910390f35b610309610976565b005b61032560048036038101906103209190612dd0565b610a41565b005b61032f610a61565b60405161033c9190613c8b565b60405180910390f35b61035f600480360381019061035a91906130c7565b610a75565b60405161036c9190613ca6565b60405180910390f35b61038f600480360381019061038a9190613086565b610b0c565b005b6103ab60048036038101906103a69190612f12565b610ba2565b005b6103b5610d12565b6040516103c29190613c8b565b60405180910390f35b6103e560048036038101906103e09190612f4e565b610d26565b005b61040160048036038101906103fc91906130c7565b610dbb565b60405161040e9190613947565b60405180910390f35b610431600480360381019061042c9190612d6b565b610e6d565b60405161043e9190613ca6565b60405180910390f35b61044f610f25565b005b61046b60048036038101906104669190612f9d565b611062565b005b61047561127f565b6040516104829190613947565b60405180910390f35b6104936112a9565b6040516104a09190613c8b565b60405180910390f35b6104b16112bd565b6040516104be91906139c9565b60405180910390f35b6104e160048036038101906104dc9190612e9a565b61134f565b005b6104fd60048036038101906104f89190612e1f565b6114d0565b005b610507611532565b6040516105149190613c8b565b60405180910390f35b610537600480360381019061053291906130c7565b611546565b60405161054491906139c9565b60405180910390f35b61056760048036038101906105629190612f12565b6115ce565b005b610583600480360381019061057e9190612d94565b61173e565b60405161059091906139ae565b60405180910390f35b6105b360048036038101906105ae9190612d6b565b6117d2565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062857506106278261197e565b5b9050919050565b60606000805461063e90613fb1565b80601f016020809104026020016040519081016040528092919081815260200182805461066a90613fb1565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b60006106cc82611a60565b61070b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070290613b8b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075182610dbb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b990613c0b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107e1611acc565b73ffffffffffffffffffffffffffffffffffffffff161480610810575061080f8161080a611acc565b61173e565b5b61084f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084690613b0b565b60405180910390fd5b6108598383611ad4565b505050565b6000600880549050905090565b61087c610876611acc565b82611b8d565b6108bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b290613c2b565b60405180910390fd5b6108c6838383611c6b565b505050565b60006108d683610e6d565b8210610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906139eb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b61097e611acc565b73ffffffffffffffffffffffffffffffffffffffff1661099c61127f565b73ffffffffffffffffffffffffffffffffffffffff16146109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e990613bab565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a3d573d6000803e3d6000fd5b5050565b610a5c838383604051806020016040528060008152506114d0565b505050565b600a60189054906101000a900461ffff1681565b6000610a7f61085e565b8210610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790613c4b565b60405180910390fd5b60088281548110610afa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610b14611acc565b73ffffffffffffffffffffffffffffffffffffffff16610b3261127f565b73ffffffffffffffffffffffffffffffffffffffff1614610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90613bab565b60405180910390fd5b80600c9080519060200190610b9e929190612a4e565b5050565b610baa611acc565b73ffffffffffffffffffffffffffffffffffffffff16610bc861127f565b73ffffffffffffffffffffffffffffffffffffffff1614610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590613bab565b60405180910390fd5b600080600091505b8260ff168260ff161015610d0c57600a601a9054906101000a900461ffff1661ffff16600a60189054906101000a900461ffff1661ffff161115610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613aeb565b60405180910390fd5b600a60189054906101000a900461ffff1690506001600a60189054906101000a900461ffff16610ccf9190613ded565b600a60186101000a81548161ffff021916908361ffff160217905550610cf9848261ffff16611ec7565b8180610d049061402c565b925050610c26565b50505050565b600a601a9054906101000a900461ffff1681565b610d2e611acc565b73ffffffffffffffffffffffffffffffffffffffff16610d4c61127f565b73ffffffffffffffffffffffffffffffffffffffff1614610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990613bab565b60405180910390fd5b610dac8382610ba2565b610db683836115ce565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90613b4b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590613b2b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f2d611acc565b73ffffffffffffffffffffffffffffffffffffffff16610f4b61127f565b73ffffffffffffffffffffffffffffffffffffffff1614610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9890613bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61106a611acc565b73ffffffffffffffffffffffffffffffffffffffff1661108861127f565b73ffffffffffffffffffffffffffffffffffffffff16146110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d590613bab565b60405180910390fd5b8151835114611122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111990613c6b565b60405180910390fd5b8051825114611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90613c6b565b60405180910390fd5b600080600080600090505b86518160ff16101561127657868160ff16815181106111b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150858160ff16815181106111ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151935061121382856115ce565b848160ff168151811061124f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015192506112638284610ba2565b808061126e9061402c565b915050611171565b50505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60169054906101000a900461ffff1681565b6060600180546112cc90613fb1565b80601f01602080910402602001604051908101604052809291908181526020018280546112f890613fb1565b80156113455780601f1061131a57610100808354040283529160200191611345565b820191906000526020600020905b81548152906001019060200180831161132857829003601f168201915b5050505050905090565b611357611acc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc90613aab565b60405180910390fd5b80600560006113d2611acc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661147f611acc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114c491906139ae565b60405180910390a35050565b6114e16114db611acc565b83611b8d565b611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790613c2b565b60405180910390fd5b61152c84848484611ee5565b50505050565b600a60149054906101000a900461ffff1681565b606061155182611a60565b611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613beb565b60405180910390fd5b600061159a611f41565b9050806115a684611fd3565b6040516020016115b7929190613923565b604051602081830303815290604052915050919050565b6115d6611acc565b73ffffffffffffffffffffffffffffffffffffffff166115f461127f565b73ffffffffffffffffffffffffffffffffffffffff161461164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190613bab565b60405180910390fd5b600080600091505b8260ff168260ff16101561173857600a60169054906101000a900461ffff1661ffff16600a60149054906101000a900461ffff1661ffff1611156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290613a4b565b60405180910390fd5b600a60149054906101000a900461ffff1690506001600a60149054906101000a900461ffff166116fb9190613ded565b600a60146101000a81548161ffff021916908361ffff160217905550611725848261ffff16611ec7565b81806117309061402c565b925050611652565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117da611acc565b73ffffffffffffffffffffffffffffffffffffffff166117f861127f565b73ffffffffffffffffffffffffffffffffffffffff161461184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590613bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b590613a2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a595750611a5882612180565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b4783610dbb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b9882611a60565b611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90613acb565b60405180910390fd5b6000611be283610dbb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c5157508373ffffffffffffffffffffffffffffffffffffffff16611c39846106c1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c625750611c61818561173e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c8b82610dbb565b73ffffffffffffffffffffffffffffffffffffffff1614611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd890613bcb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613a8b565b60405180910390fd5b611d5c8383836121ea565b611d67600082611ad4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611db79190613eac565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0e9190613e25565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ee18282604051806020016040528060008152506122fe565b5050565b611ef0848484611c6b565b611efc84848484612359565b611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3290613a0b565b60405180910390fd5b50505050565b6060600c8054611f5090613fb1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7c90613fb1565b8015611fc95780601f10611f9e57610100808354040283529160200191611fc9565b820191906000526020600020905b815481529060010190602001808311611fac57829003601f168201915b5050505050905090565b6060600082141561201b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061217b565b600082905060005b6000821461204d57808061203690613fe3565b915050600a826120469190613e7b565b9150612023565b60008167ffffffffffffffff81111561208f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120c15781602001600182028036833780820191505090505b5090505b60008514612174576001826120da9190613eac565b9150600a856120e99190614056565b60306120f59190613e25565b60f81b818381518110612131577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561216d9190613e7b565b94506120c5565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121f58383836124f0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561223857612233816124f5565b612277565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461227657612275838261253e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122ba576122b5816126ab565b6122f9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122f8576122f782826127ee565b5b5b505050565b612308838361286d565b6123156000848484612359565b612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b90613a0b565b60405180910390fd5b505050565b600061237a8473ffffffffffffffffffffffffffffffffffffffff16612a3b565b156124e3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a3611acc565b8786866040518563ffffffff1660e01b81526004016123c59493929190613962565b602060405180830381600087803b1580156123df57600080fd5b505af192505050801561241057506040513d601f19601f8201168201806040525081019061240d919061305d565b60015b612493573d8060008114612440576040519150601f19603f3d011682016040523d82523d6000602084013e612445565b606091505b5060008151141561248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248290613a0b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124e8565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161254b84610e6d565b6125559190613eac565b905060006007600084815260200190815260200160002054905081811461263a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126bf9190613eac565b9050600060096000848152602001908152602001600020549050600060088381548110612715577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061275d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127f983610e6d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d490613b6b565b60405180910390fd5b6128e681611a60565b15612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291d90613a6b565b60405180910390fd5b612932600083836121ea565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129829190613e25565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5a90613fb1565b90600052602060002090601f016020900481019282612a7c5760008555612ac3565b82601f10612a9557805160ff1916838001178555612ac3565b82800160010185558215612ac3579182015b82811115612ac2578251825591602001919060010190612aa7565b5b509050612ad09190612ad4565b5090565b5b80821115612aed576000816000905550600101612ad5565b5090565b6000612b04612aff84613cf2565b613cc1565b90508083825260208201905082856020860282011115612b2357600080fd5b60005b85811015612b535781612b398882612c45565b845260208401935060208301925050600181019050612b26565b5050509392505050565b6000612b70612b6b84613d1e565b613cc1565b90508083825260208201905082856020860282011115612b8f57600080fd5b60005b85811015612bbf5781612ba58882612d56565b845260208401935060208301925050600181019050612b92565b5050509392505050565b6000612bdc612bd784613d4a565b613cc1565b905082815260208101848484011115612bf457600080fd5b612bff848285613f6f565b509392505050565b6000612c1a612c1584613d7a565b613cc1565b905082815260208101848484011115612c3257600080fd5b612c3d848285613f6f565b509392505050565b600081359050612c5481614154565b92915050565b600082601f830112612c6b57600080fd5b8135612c7b848260208601612af1565b91505092915050565b600082601f830112612c9557600080fd5b8135612ca5848260208601612b5d565b91505092915050565b600081359050612cbd8161416b565b92915050565b600081359050612cd281614182565b92915050565b600081519050612ce781614182565b92915050565b600082601f830112612cfe57600080fd5b8135612d0e848260208601612bc9565b91505092915050565b600082601f830112612d2857600080fd5b8135612d38848260208601612c07565b91505092915050565b600081359050612d5081614199565b92915050565b600081359050612d65816141b0565b92915050565b600060208284031215612d7d57600080fd5b6000612d8b84828501612c45565b91505092915050565b60008060408385031215612da757600080fd5b6000612db585828601612c45565b9250506020612dc685828601612c45565b9150509250929050565b600080600060608486031215612de557600080fd5b6000612df386828701612c45565b9350506020612e0486828701612c45565b9250506040612e1586828701612d41565b9150509250925092565b60008060008060808587031215612e3557600080fd5b6000612e4387828801612c45565b9450506020612e5487828801612c45565b9350506040612e6587828801612d41565b925050606085013567ffffffffffffffff811115612e8257600080fd5b612e8e87828801612ced565b91505092959194509250565b60008060408385031215612ead57600080fd5b6000612ebb85828601612c45565b9250506020612ecc85828601612cae565b9150509250929050565b60008060408385031215612ee957600080fd5b6000612ef785828601612c45565b9250506020612f0885828601612d41565b9150509250929050565b60008060408385031215612f2557600080fd5b6000612f3385828601612c45565b9250506020612f4485828601612d56565b9150509250929050565b600080600060608486031215612f6357600080fd5b6000612f7186828701612c45565b9350506020612f8286828701612d56565b9250506040612f9386828701612d56565b9150509250925092565b600080600060608486031215612fb257600080fd5b600084013567ffffffffffffffff811115612fcc57600080fd5b612fd886828701612c5a565b935050602084013567ffffffffffffffff811115612ff557600080fd5b61300186828701612c84565b925050604084013567ffffffffffffffff81111561301e57600080fd5b61302a86828701612c84565b9150509250925092565b60006020828403121561304657600080fd5b600061305484828501612cc3565b91505092915050565b60006020828403121561306f57600080fd5b600061307d84828501612cd8565b91505092915050565b60006020828403121561309857600080fd5b600082013567ffffffffffffffff8111156130b257600080fd5b6130be84828501612d17565b91505092915050565b6000602082840312156130d957600080fd5b60006130e784828501612d41565b91505092915050565b6130f981613ee0565b82525050565b61310881613ef2565b82525050565b600061311982613daa565b6131238185613dc0565b9350613133818560208601613f7e565b61313c81614143565b840191505092915050565b600061315282613db5565b61315c8185613dd1565b935061316c818560208601613f7e565b61317581614143565b840191505092915050565b600061318b82613db5565b6131958185613de2565b93506131a5818560208601613f7e565b80840191505092915050565b60006131be602b83613dd1565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613224603283613dd1565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061328a602683613dd1565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132f0601483613dd1565b91507f7265616368656420656e64206f66204d4554414c0000000000000000000000006000830152602082019050919050565b6000613330601c83613dd1565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613370602483613dd1565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133d6601983613dd1565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613416602c83613dd1565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061347c601683613dd1565b91507f7265616368656420656e64206f66206372797374616c000000000000000000006000830152602082019050919050565b60006134bc603883613dd1565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613522602a83613dd1565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613588602983613dd1565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ee602083613dd1565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061362e602c83613dd1565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613694602083613dd1565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006136d4602983613dd1565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061373a602f83613dd1565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006137a0602183613dd1565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613806603183613dd1565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061386c602c83613dd1565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006138d2601183613dd1565b91507f6d69736d617463686564206c656e6774680000000000000000000000000000006000830152602082019050919050565b61390e81613f2a565b82525050565b61391d81613f58565b82525050565b600061392f8285613180565b915061393b8284613180565b91508190509392505050565b600060208201905061395c60008301846130f0565b92915050565b600060808201905061397760008301876130f0565b61398460208301866130f0565b6139916040830185613914565b81810360608301526139a3818461310e565b905095945050505050565b60006020820190506139c360008301846130ff565b92915050565b600060208201905081810360008301526139e38184613147565b905092915050565b60006020820190508181036000830152613a04816131b1565b9050919050565b60006020820190508181036000830152613a2481613217565b9050919050565b60006020820190508181036000830152613a448161327d565b9050919050565b60006020820190508181036000830152613a64816132e3565b9050919050565b60006020820190508181036000830152613a8481613323565b9050919050565b60006020820190508181036000830152613aa481613363565b9050919050565b60006020820190508181036000830152613ac4816133c9565b9050919050565b60006020820190508181036000830152613ae481613409565b9050919050565b60006020820190508181036000830152613b048161346f565b9050919050565b60006020820190508181036000830152613b24816134af565b9050919050565b60006020820190508181036000830152613b4481613515565b9050919050565b60006020820190508181036000830152613b648161357b565b9050919050565b60006020820190508181036000830152613b84816135e1565b9050919050565b60006020820190508181036000830152613ba481613621565b9050919050565b60006020820190508181036000830152613bc481613687565b9050919050565b60006020820190508181036000830152613be4816136c7565b9050919050565b60006020820190508181036000830152613c048161372d565b9050919050565b60006020820190508181036000830152613c2481613793565b9050919050565b60006020820190508181036000830152613c44816137f9565b9050919050565b60006020820190508181036000830152613c648161385f565b9050919050565b60006020820190508181036000830152613c84816138c5565b9050919050565b6000602082019050613ca06000830184613905565b92915050565b6000602082019050613cbb6000830184613914565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613ce857613ce7614114565b5b8060405250919050565b600067ffffffffffffffff821115613d0d57613d0c614114565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d3957613d38614114565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d6557613d64614114565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613d9557613d94614114565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613df882613f2a565b9150613e0383613f2a565b92508261ffff03821115613e1a57613e19614087565b5b828201905092915050565b6000613e3082613f58565b9150613e3b83613f58565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e7057613e6f614087565b5b828201905092915050565b6000613e8682613f58565b9150613e9183613f58565b925082613ea157613ea06140b6565b5b828204905092915050565b6000613eb782613f58565b9150613ec283613f58565b925082821015613ed557613ed4614087565b5b828203905092915050565b6000613eeb82613f38565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613f9c578082015181840152602081019050613f81565b83811115613fab576000848401525b50505050565b60006002820490506001821680613fc957607f821691505b60208210811415613fdd57613fdc6140e5565b5b50919050565b6000613fee82613f58565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561402157614020614087565b5b600182019050919050565b600061403782613f62565b915060ff82141561404b5761404a614087565b5b600182019050919050565b600061406182613f58565b915061406c83613f58565b92508261407c5761407b6140b6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61415d81613ee0565b811461416857600080fd5b50565b61417481613ef2565b811461417f57600080fd5b50565b61418b81613efe565b811461419657600080fd5b50565b6141a281613f58565b81146141ad57600080fd5b50565b6141b981613f62565b81146141c457600080fd5b5056fea2646970667358221220d4456595591c5f234c8b86de20c992e8777dabcea4a3b2336a29bbfa42127ddc64736f6c63430008000033

Deployed Bytecode Sourcemap

49027:2924:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42871:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31158:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32618:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32155:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43524:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33508:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43192:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49351:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50987:140;;;:::i;:::-;;33884:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49259:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43714:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51538:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50593:384;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49301:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51135:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30852:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30582:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28410:148;;;:::i;:::-;;49539:669;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27759:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49223:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31327:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32911:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34106:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49185:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51655:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50216:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33277:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28713:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42871:237;42973:4;43012:35;42997:50;;;:11;:50;;;;:103;;;;43064:36;43088:11;43064:23;:36::i;:::-;42997:103;42990:110;;42871:237;;;:::o;31158:100::-;31212:13;31245:5;31238:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31158:100;:::o;32618:221::-;32694:7;32722:16;32730:7;32722;:16::i;:::-;32714:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32807:15;:24;32823:7;32807:24;;;;;;;;;;;;;;;;;;;;;32800:31;;32618:221;;;:::o;32155:397::-;32236:13;32252:23;32267:7;32252:14;:23::i;:::-;32236:39;;32300:5;32294:11;;:2;:11;;;;32286:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32380:5;32364:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32389:37;32406:5;32413:12;:10;:12::i;:::-;32389:16;:37::i;:::-;32364:62;32356:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32523:21;32532:2;32536:7;32523:8;:21::i;:::-;32155:397;;;:::o;43524:113::-;43585:7;43612:10;:17;;;;43605:24;;43524:113;:::o;33508:305::-;33669:41;33688:12;:10;:12::i;:::-;33702:7;33669:18;:41::i;:::-;33661:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33777:28;33787:4;33793:2;33797:7;33777:9;:28::i;:::-;33508:305;;;:::o;43192:256::-;43289:7;43325:23;43342:5;43325:16;:23::i;:::-;43317:5;:31;43309:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43414:12;:19;43427:5;43414:19;;;;;;;;;;;;;;;:26;43434:5;43414:26;;;;;;;;;;;;43407:33;;43192:256;;;;:::o;49351:31::-;;;;:::o;50987:140::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51035:12:::1;51050:21;51035:36;;51090:10;51082:28;;:37;51111:7;51082:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28050:1;50987:140::o:0;33884:151::-;33988:39;34005:4;34011:2;34015:7;33988:39;;;;;;;;;;;;:16;:39::i;:::-;33884:151;;;:::o;49259:35::-;;;;;;;;;;;;;:::o;43714:233::-;43789:7;43825:30;:28;:30::i;:::-;43817:5;:38;43809:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43922:10;43933:5;43922:17;;;;;;;;;;;;;;;;;;;;;;;;43915:24;;43714:233;;;:::o;51538:109::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51631:8:::1;51612:16;:27;;;;;;;;;;;;:::i;:::-;;51538:109:::0;:::o;50593:384::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50672:7:::1;50690:14:::0;50724:1:::1;50720:5;;50715:255;50732:5;50728:9;;:1;:9;;;50715:255;;;50785:11;;;;;;;;;;;50766:30;;:15;;;;;;;;;;;:30;;;;50758:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50848:15;;;;;;;;;;;50838:25;;50914:1;50896:15;;;;;;;;;;;:19;;;;:::i;:::-;50878:15;;:37;;;;;;;;;;;;;;;;;;50930:28;50940:8;50950:7;50930:28;;:9;:28::i;:::-;50739:3;;;;;:::i;:::-;;;;50715:255;;;28050:1;;50593:384:::0;;:::o;49301:31::-;;;;;;;;;;;;;:::o;51135:192::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51242:35:::1;51254:8;51264:12;51242:11;:35::i;:::-;51288:31;51298:8;51308:10;51288:9;:31::i;:::-;51135:192:::0;;;:::o;30852:239::-;30924:7;30944:13;30960:7;:16;30968:7;30960:16;;;;;;;;;;;;;;;;;;;;;30944:32;;31012:1;30995:19;;:5;:19;;;;30987:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31078:5;31071:12;;;30852:239;;;:::o;30582:208::-;30654:7;30699:1;30682:19;;:5;:19;;;;30674:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30766:9;:16;30776:5;30766:16;;;;;;;;;;;;;;;;30759:23;;30582:208;;;:::o;28410:148::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28517:1:::1;28480:40;;28501:6;;;;;;;;;;;28480:40;;;;;;;;;;;;28548:1;28531:6;;:19;;;;;;;;;;;;;;;;;;28410:148::o:0;49539:669::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49697:11:::1;:18;49677:9;:16;:38;49669:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49778:13;:20;49756:11;:18;:42;49748:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49831:16;49858:18:::0;49887:16:::1;49914:7:::0;49939:1:::1;49937:3;;49932:269;49944:9;:16;49942:1;:18;;;49932:269;;;49992:9;50002:1;49992:12;;;;;;;;;;;;;;;;;;;;;;;;49981:23;;50032:11;50044:1;50032:14;;;;;;;;;;;;;;;;;;;;;;;;50019:27;;50061:32;50071:8;50082:10;50061:9;:32::i;:::-;50123:13;50137:1;50123:16;;;;;;;;;;;;;;;;;;;;;;;;50108:31;;50154:35;50166:8;50176:12;50154:11;:35::i;:::-;49962:3;;;;;:::i;:::-;;;;49932:269;;;28050:1;;;;49539:669:::0;;;:::o;27759:87::-;27805:7;27832:6;;;;;;;;;;;27825:13;;27759:87;:::o;49223:29::-;;;;;;;;;;;;;:::o;31327:104::-;31383:13;31416:7;31409:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31327:104;:::o;32911:295::-;33026:12;:10;:12::i;:::-;33014:24;;:8;:24;;;;33006:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33126:8;33081:18;:32;33100:12;:10;:12::i;:::-;33081:32;;;;;;;;;;;;;;;:42;33114:8;33081:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33179:8;33150:48;;33165:12;:10;:12::i;:::-;33150:48;;;33189:8;33150:48;;;;;;:::i;:::-;;;;;;;;32911:295;;:::o;34106:285::-;34238:41;34257:12;:10;:12::i;:::-;34271:7;34238:18;:41::i;:::-;34230:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34344:39;34358:4;34364:2;34368:7;34377:5;34344:13;:39::i;:::-;34106:285;;;;:::o;49185:31::-;;;;;;;;;;;;;:::o;51655:293::-;51728:13;51762:16;51770:7;51762;:16::i;:::-;51754:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51841:18;51862:10;:8;:10::i;:::-;51841:31;;51914:4;51920:18;:7;:16;:18::i;:::-;51897:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51883:57;;;51655:293;;;:::o;50216:371::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50294:7:::1;50312:14:::0;50346:1:::1;50342:5;;50337:243;50354:5;50350:9;;:1;:9;;;50337:243;;;50405:9;;;;;;;;;;;50388:26;;:13;;;;;;;;;;;:26;;;;50380:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;50464:13;;;;;;;;;;;50454:23;;50524:1;50508:13;;;;;;;;;;;:17;;;;:::i;:::-;50492:13;;:33;;;;;;;;;;;;;;;;;;50540:28;50550:8;50560:7;50540:28;;:9;:28::i;:::-;50361:3;;;;;:::i;:::-;;;;50337:243;;;28050:1;;50216:371:::0;;:::o;33277:164::-;33374:4;33398:18;:25;33417:5;33398:25;;;;;;;;;;;;;;;:35;33424:8;33398:35;;;;;;;;;;;;;;;;;;;;;;;;;33391:42;;33277:164;;;;:::o;28713:244::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28822:1:::1;28802:22;;:8;:22;;;;28794:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28912:8;28883:38;;28904:6;;;;;;;;;;;28883:38;;;;;;;;;;;;28941:8;28932:6;;:17;;;;;;;;;;;;;;;;;;28713:244:::0;:::o;30226:292::-;30328:4;30367:25;30352:40;;;:11;:40;;;;:105;;;;30424:33;30409:48;;;:11;:48;;;;30352:105;:158;;;;30474:36;30498:11;30474:23;:36::i;:::-;30352:158;30345:165;;30226:292;;;:::o;35858:127::-;35923:4;35975:1;35947:30;;:7;:16;35955:7;35947:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35940:37;;35858:127;;;:::o;26376:98::-;26429:7;26456:10;26449:17;;26376:98;:::o;39735:174::-;39837:2;39810:15;:24;39826:7;39810:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39893:7;39889:2;39855:46;;39864:23;39879:7;39864:14;:23::i;:::-;39855:46;;;;;;;;;;;;39735:174;;:::o;36152:348::-;36245:4;36270:16;36278:7;36270;:16::i;:::-;36262:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36346:13;36362:23;36377:7;36362:14;:23::i;:::-;36346:39;;36415:5;36404:16;;:7;:16;;;:51;;;;36448:7;36424:31;;:20;36436:7;36424:11;:20::i;:::-;:31;;;36404:51;:87;;;;36459:32;36476:5;36483:7;36459:16;:32::i;:::-;36404:87;36396:96;;;36152:348;;;;:::o;39073:544::-;39198:4;39171:31;;:23;39186:7;39171:14;:23::i;:::-;:31;;;39163:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39281:1;39267:16;;:2;:16;;;;39259:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39337:39;39358:4;39364:2;39368:7;39337:20;:39::i;:::-;39441:29;39458:1;39462:7;39441:8;:29::i;:::-;39502:1;39483:9;:15;39493:4;39483:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39531:1;39514:9;:13;39524:2;39514:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39562:2;39543:7;:16;39551:7;39543:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39601:7;39597:2;39582:27;;39591:4;39582:27;;;;;;;;;;;;39073:544;;;:::o;36842:110::-;36918:26;36928:2;36932:7;36918:26;;;;;;;;;;;;:9;:26::i;:::-;36842:110;;:::o;35273:272::-;35387:28;35397:4;35403:2;35407:7;35387:9;:28::i;:::-;35434:48;35457:4;35463:2;35467:7;35476:5;35434:22;:48::i;:::-;35426:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35273:272;;;;:::o;51334:117::-;51394:13;51427:16;51420:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51334:117;:::o;7375:723::-;7431:13;7661:1;7652:5;:10;7648:53;;;7679:10;;;;;;;;;;;;;;;;;;;;;7648:53;7711:12;7726:5;7711:20;;7742:14;7767:78;7782:1;7774:4;:9;7767:78;;7800:8;;;;;:::i;:::-;;;;7831:2;7823:10;;;;;:::i;:::-;;;7767:78;;;7855:19;7887:6;7877:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7855:39;;7905:154;7921:1;7912:5;:10;7905:154;;7949:1;7939:11;;;;;:::i;:::-;;;8016:2;8008:5;:10;;;;:::i;:::-;7995:2;:24;;;;:::i;:::-;7982:39;;7965:6;7972;7965:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;8045:2;8036:11;;;;;:::i;:::-;;;7905:154;;;8083:6;8069:21;;;;;7375:723;;;;:::o;19449:157::-;19534:4;19573:25;19558:40;;;:11;:40;;;;19551:47;;19449:157;;;:::o;44560:555::-;44670:45;44697:4;44703:2;44707:7;44670:26;:45::i;:::-;44748:1;44732:18;;:4;:18;;;44728:187;;;44767:40;44799:7;44767:31;:40::i;:::-;44728:187;;;44837:2;44829:10;;:4;:10;;;44825:90;;44856:47;44889:4;44895:7;44856:32;:47::i;:::-;44825:90;44728:187;44943:1;44929:16;;:2;:16;;;44925:183;;;44962:45;44999:7;44962:36;:45::i;:::-;44925:183;;;45035:4;45029:10;;:2;:10;;;45025:83;;45056:40;45084:2;45088:7;45056:27;:40::i;:::-;45025:83;44925:183;44560:555;;;:::o;37179:250::-;37275:18;37281:2;37285:7;37275:5;:18::i;:::-;37312:54;37343:1;37347:2;37351:7;37360:5;37312:22;:54::i;:::-;37304:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37179:250;;;:::o;40474:843::-;40595:4;40621:15;:2;:13;;;:15::i;:::-;40617:693;;;40673:2;40657:36;;;40694:12;:10;:12::i;:::-;40708:4;40714:7;40723:5;40657:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40653:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40920:1;40903:6;:13;:18;40899:341;;;40946:60;;;;;;;;;;:::i;:::-;;;;;;;;40899:341;41190:6;41184:13;41175:6;41171:2;41167:15;41160:38;40653:602;40790:45;;;40780:55;;;:6;:55;;;;40773:62;;;;;40617:693;41294:4;41287:11;;40474:843;;;;;;;:::o;41930:93::-;;;;:::o;45838:164::-;45942:10;:17;;;;45915:15;:24;45931:7;45915:24;;;;;;;;;;;:44;;;;45970:10;45986:7;45970:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45838:164;:::o;46629:988::-;46895:22;46945:1;46920:22;46937:4;46920:16;:22::i;:::-;:26;;;;:::i;:::-;46895:51;;46957:18;46978:17;:26;46996:7;46978:26;;;;;;;;;;;;46957:47;;47125:14;47111:10;:28;47107:328;;47156:19;47178:12;:18;47191:4;47178:18;;;;;;;;;;;;;;;:34;47197:14;47178:34;;;;;;;;;;;;47156:56;;47262:11;47229:12;:18;47242:4;47229:18;;;;;;;;;;;;;;;:30;47248:10;47229:30;;;;;;;;;;;:44;;;;47379:10;47346:17;:30;47364:11;47346:30;;;;;;;;;;;:43;;;;47107:328;;47531:17;:26;47549:7;47531:26;;;;;;;;;;;47524:33;;;47575:12;:18;47588:4;47575:18;;;;;;;;;;;;;;;:34;47594:14;47575:34;;;;;;;;;;;47568:41;;;46629:988;;;;:::o;47912:1079::-;48165:22;48210:1;48190:10;:17;;;;:21;;;;:::i;:::-;48165:46;;48222:18;48243:15;:24;48259:7;48243:24;;;;;;;;;;;;48222:45;;48594:19;48616:10;48627:14;48616:26;;;;;;;;;;;;;;;;;;;;;;;;48594:48;;48680:11;48655:10;48666;48655:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48791:10;48760:15;:28;48776:11;48760:28;;;;;;;;;;;:41;;;;48932:15;:24;48948:7;48932:24;;;;;;;;;;;48925:31;;;48967:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47912:1079;;;;:::o;45416:221::-;45501:14;45518:20;45535:2;45518:16;:20::i;:::-;45501:37;;45576:7;45549:12;:16;45562:2;45549:16;;;;;;;;;;;;;;;:24;45566:6;45549:24;;;;;;;;;;;:34;;;;45623:6;45594:17;:26;45612:7;45594:26;;;;;;;;;;;:35;;;;45416:221;;;:::o;37765:382::-;37859:1;37845:16;;:2;:16;;;;37837:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37918:16;37926:7;37918;:16::i;:::-;37917:17;37909:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37980:45;38009:1;38013:2;38017:7;37980:20;:45::i;:::-;38055:1;38038:9;:13;38048:2;38038:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38086:2;38067:7;:16;38075:7;38067:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38131:7;38127:2;38106:33;;38123:1;38106:33;;;;;;;;;;;;37765:382;;:::o;9840:422::-;9900:4;10108:12;10219:7;10207:20;10199:28;;10253:1;10246:4;:8;10239:15;;;9840:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;667:616::-;;786:78;801:62;856:6;801:62;:::i;:::-;786:78;:::i;:::-;777:87;;884:5;912:6;905:5;898:21;938:4;931:5;927:16;920:23;;963:6;1013:3;1005:4;997:6;993:17;988:3;984:27;981:36;978:2;;;1030:1;1027;1020:12;978:2;1058:1;1043:234;1068:6;1065:1;1062:13;1043:234;;;1135:3;1163:35;1194:3;1182:10;1163:35;:::i;:::-;1158:3;1151:48;1228:4;1223:3;1219:14;1212:21;;1262:4;1257:3;1253:14;1246:21;;1103:174;1090:1;1087;1083:9;1078:14;;1043:234;;;1047:14;767:516;;;;;;;:::o;1289:342::-;;1391:64;1406:48;1447:6;1406:48;:::i;:::-;1391:64;:::i;:::-;1382:73;;1478:6;1471:5;1464:21;1516:4;1509:5;1505:16;1554:3;1545:6;1540:3;1536:16;1533:25;1530:2;;;1571:1;1568;1561:12;1530:2;1584:41;1618:6;1613:3;1608;1584:41;:::i;:::-;1372:259;;;;;;:::o;1637:344::-;;1740:65;1755:49;1797:6;1755:49;:::i;:::-;1740:65;:::i;:::-;1731:74;;1828:6;1821:5;1814:21;1866:4;1859:5;1855:16;1904:3;1895:6;1890:3;1886:16;1883:25;1880:2;;;1921:1;1918;1911:12;1880:2;1934:41;1968:6;1963:3;1958;1934:41;:::i;:::-;1721:260;;;;;;:::o;1987:139::-;;2071:6;2058:20;2049:29;;2087:33;2114:5;2087:33;:::i;:::-;2039:87;;;;:::o;2149:303::-;;2269:3;2262:4;2254:6;2250:17;2246:27;2236:2;;2287:1;2284;2277:12;2236:2;2327:6;2314:20;2352:94;2442:3;2434:6;2427:4;2419:6;2415:17;2352:94;:::i;:::-;2343:103;;2226:226;;;;;:::o;2473:299::-;;2591:3;2584:4;2576:6;2572:17;2568:27;2558:2;;2609:1;2606;2599:12;2558:2;2649:6;2636:20;2674:92;2762:3;2754:6;2747:4;2739:6;2735:17;2674:92;:::i;:::-;2665:101;;2548:224;;;;;:::o;2778:133::-;;2859:6;2846:20;2837:29;;2875:30;2899:5;2875:30;:::i;:::-;2827:84;;;;:::o;2917:137::-;;3000:6;2987:20;2978:29;;3016:32;3042:5;3016:32;:::i;:::-;2968:86;;;;:::o;3060:141::-;;3147:6;3141:13;3132:22;;3163:32;3189:5;3163:32;:::i;:::-;3122:79;;;;:::o;3220:271::-;;3324:3;3317:4;3309:6;3305:17;3301:27;3291:2;;3342:1;3339;3332:12;3291:2;3382:6;3369:20;3407:78;3481:3;3473:6;3466:4;3458:6;3454:17;3407:78;:::i;:::-;3398:87;;3281:210;;;;;:::o;3511:273::-;;3616:3;3609:4;3601:6;3597:17;3593:27;3583:2;;3634:1;3631;3624:12;3583:2;3674:6;3661:20;3699:79;3774:3;3766:6;3759:4;3751:6;3747:17;3699:79;:::i;:::-;3690:88;;3573:211;;;;;:::o;3790:139::-;;3874:6;3861:20;3852:29;;3890:33;3917:5;3890:33;:::i;:::-;3842:87;;;;:::o;3935:135::-;;4017:6;4004:20;3995:29;;4033:31;4058:5;4033:31;:::i;:::-;3985:85;;;;:::o;4076:262::-;;4184:2;4172:9;4163:7;4159:23;4155:32;4152:2;;;4200:1;4197;4190:12;4152:2;4243:1;4268:53;4313:7;4304:6;4293:9;4289:22;4268:53;:::i;:::-;4258:63;;4214:117;4142:196;;;;:::o;4344:407::-;;;4469:2;4457:9;4448:7;4444:23;4440:32;4437:2;;;4485:1;4482;4475:12;4437:2;4528:1;4553:53;4598:7;4589:6;4578:9;4574:22;4553:53;:::i;:::-;4543:63;;4499:117;4655:2;4681:53;4726:7;4717:6;4706:9;4702:22;4681:53;:::i;:::-;4671:63;;4626:118;4427:324;;;;;:::o;4757:552::-;;;;4899:2;4887:9;4878:7;4874:23;4870:32;4867:2;;;4915:1;4912;4905:12;4867:2;4958:1;4983:53;5028:7;5019:6;5008:9;5004:22;4983:53;:::i;:::-;4973:63;;4929:117;5085:2;5111:53;5156:7;5147:6;5136:9;5132:22;5111:53;:::i;:::-;5101:63;;5056:118;5213:2;5239:53;5284:7;5275:6;5264:9;5260:22;5239:53;:::i;:::-;5229:63;;5184:118;4857:452;;;;;:::o;5315:809::-;;;;;5483:3;5471:9;5462:7;5458:23;5454:33;5451:2;;;5500:1;5497;5490:12;5451:2;5543:1;5568:53;5613:7;5604:6;5593:9;5589:22;5568:53;:::i;:::-;5558:63;;5514:117;5670:2;5696:53;5741:7;5732:6;5721:9;5717:22;5696:53;:::i;:::-;5686:63;;5641:118;5798:2;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;:::i;:::-;5814:63;;5769:118;5954:2;5943:9;5939:18;5926:32;5985:18;5977:6;5974:30;5971:2;;;6017:1;6014;6007:12;5971:2;6045:62;6099:7;6090:6;6079:9;6075:22;6045:62;:::i;:::-;6035:72;;5897:220;5441:683;;;;;;;:::o;6130:401::-;;;6252:2;6240:9;6231:7;6227:23;6223:32;6220:2;;;6268:1;6265;6258:12;6220:2;6311:1;6336:53;6381:7;6372:6;6361:9;6357:22;6336:53;:::i;:::-;6326:63;;6282:117;6438:2;6464:50;6506:7;6497:6;6486:9;6482:22;6464:50;:::i;:::-;6454:60;;6409:115;6210:321;;;;;:::o;6537:407::-;;;6662:2;6650:9;6641:7;6637:23;6633:32;6630:2;;;6678:1;6675;6668:12;6630:2;6721:1;6746:53;6791:7;6782:6;6771:9;6767:22;6746:53;:::i;:::-;6736:63;;6692:117;6848:2;6874:53;6919:7;6910:6;6899:9;6895:22;6874:53;:::i;:::-;6864:63;;6819:118;6620:324;;;;;:::o;6950:403::-;;;7073:2;7061:9;7052:7;7048:23;7044:32;7041:2;;;7089:1;7086;7079:12;7041:2;7132:1;7157:53;7202:7;7193:6;7182:9;7178:22;7157:53;:::i;:::-;7147:63;;7103:117;7259:2;7285:51;7328:7;7319:6;7308:9;7304:22;7285:51;:::i;:::-;7275:61;;7230:116;7031:322;;;;;:::o;7359:544::-;;;;7497:2;7485:9;7476:7;7472:23;7468:32;7465:2;;;7513:1;7510;7503:12;7465:2;7556:1;7581:53;7626:7;7617:6;7606:9;7602:22;7581:53;:::i;:::-;7571:63;;7527:117;7683:2;7709:51;7752:7;7743:6;7732:9;7728:22;7709:51;:::i;:::-;7699:61;;7654:116;7809:2;7835:51;7878:7;7869:6;7858:9;7854:22;7835:51;:::i;:::-;7825:61;;7780:116;7455:448;;;;;:::o;7909:973::-;;;;8122:2;8110:9;8101:7;8097:23;8093:32;8090:2;;;8138:1;8135;8128:12;8090:2;8209:1;8198:9;8194:17;8181:31;8239:18;8231:6;8228:30;8225:2;;;8271:1;8268;8261:12;8225:2;8299:78;8369:7;8360:6;8349:9;8345:22;8299:78;:::i;:::-;8289:88;;8152:235;8454:2;8443:9;8439:18;8426:32;8485:18;8477:6;8474:30;8471:2;;;8517:1;8514;8507:12;8471:2;8545:76;8613:7;8604:6;8593:9;8589:22;8545:76;:::i;:::-;8535:86;;8397:234;8698:2;8687:9;8683:18;8670:32;8729:18;8721:6;8718:30;8715:2;;;8761:1;8758;8751:12;8715:2;8789:76;8857:7;8848:6;8837:9;8833:22;8789:76;:::i;:::-;8779:86;;8641:234;8080:802;;;;;:::o;8888:260::-;;8995:2;8983:9;8974:7;8970:23;8966:32;8963:2;;;9011:1;9008;9001:12;8963:2;9054:1;9079:52;9123:7;9114:6;9103:9;9099:22;9079:52;:::i;:::-;9069:62;;9025:116;8953:195;;;;:::o;9154:282::-;;9272:2;9260:9;9251:7;9247:23;9243:32;9240:2;;;9288:1;9285;9278:12;9240:2;9331:1;9356:63;9411:7;9402:6;9391:9;9387:22;9356:63;:::i;:::-;9346:73;;9302:127;9230:206;;;;:::o;9442:375::-;;9560:2;9548:9;9539:7;9535:23;9531:32;9528:2;;;9576:1;9573;9566:12;9528:2;9647:1;9636:9;9632:17;9619:31;9677:18;9669:6;9666:30;9663:2;;;9709:1;9706;9699:12;9663:2;9737:63;9792:7;9783:6;9772:9;9768:22;9737:63;:::i;:::-;9727:73;;9590:220;9518:299;;;;:::o;9823:262::-;;9931:2;9919:9;9910:7;9906:23;9902:32;9899:2;;;9947:1;9944;9937:12;9899:2;9990:1;10015:53;10060:7;10051:6;10040:9;10036:22;10015:53;:::i;:::-;10005:63;;9961:117;9889:196;;;;:::o;10091:118::-;10178:24;10196:5;10178:24;:::i;:::-;10173:3;10166:37;10156:53;;:::o;10215:109::-;10296:21;10311:5;10296:21;:::i;:::-;10291:3;10284:34;10274:50;;:::o;10330:360::-;;10444:38;10476:5;10444:38;:::i;:::-;10498:70;10561:6;10556:3;10498:70;:::i;:::-;10491:77;;10577:52;10622:6;10617:3;10610:4;10603:5;10599:16;10577:52;:::i;:::-;10654:29;10676:6;10654:29;:::i;:::-;10649:3;10645:39;10638:46;;10420:270;;;;;:::o;10696:364::-;;10812:39;10845:5;10812:39;:::i;:::-;10867:71;10931:6;10926:3;10867:71;:::i;:::-;10860:78;;10947:52;10992:6;10987:3;10980:4;10973:5;10969:16;10947:52;:::i;:::-;11024:29;11046:6;11024:29;:::i;:::-;11019:3;11015:39;11008:46;;10788:272;;;;;:::o;11066:377::-;;11200:39;11233:5;11200:39;:::i;:::-;11255:89;11337:6;11332:3;11255:89;:::i;:::-;11248:96;;11353:52;11398:6;11393:3;11386:4;11379:5;11375:16;11353:52;:::i;:::-;11430:6;11425:3;11421:16;11414:23;;11176:267;;;;;:::o;11449:375::-;;11612:67;11676:2;11671:3;11612:67;:::i;:::-;11605:74;;11709:34;11705:1;11700:3;11696:11;11689:55;11775:13;11770:2;11765:3;11761:12;11754:35;11815:2;11810:3;11806:12;11799:19;;11595:229;;;:::o;11830:382::-;;11993:67;12057:2;12052:3;11993:67;:::i;:::-;11986:74;;12090:34;12086:1;12081:3;12077:11;12070:55;12156:20;12151:2;12146:3;12142:12;12135:42;12203:2;12198:3;12194:12;12187:19;;11976:236;;;:::o;12218:370::-;;12381:67;12445:2;12440:3;12381:67;:::i;:::-;12374:74;;12478:34;12474:1;12469:3;12465:11;12458:55;12544:8;12539:2;12534:3;12530:12;12523:30;12579:2;12574:3;12570:12;12563:19;;12364:224;;;:::o;12594:318::-;;12757:67;12821:2;12816:3;12757:67;:::i;:::-;12750:74;;12854:22;12850:1;12845:3;12841:11;12834:43;12903:2;12898:3;12894:12;12887:19;;12740:172;;;:::o;12918:326::-;;13081:67;13145:2;13140:3;13081:67;:::i;:::-;13074:74;;13178:30;13174:1;13169:3;13165:11;13158:51;13235:2;13230:3;13226:12;13219:19;;13064:180;;;:::o;13250:368::-;;13413:67;13477:2;13472:3;13413:67;:::i;:::-;13406:74;;13510:34;13506:1;13501:3;13497:11;13490:55;13576:6;13571:2;13566:3;13562:12;13555:28;13609:2;13604:3;13600:12;13593:19;;13396:222;;;:::o;13624:323::-;;13787:67;13851:2;13846:3;13787:67;:::i;:::-;13780:74;;13884:27;13880:1;13875:3;13871:11;13864:48;13938:2;13933:3;13929:12;13922:19;;13770:177;;;:::o;13953:376::-;;14116:67;14180:2;14175:3;14116:67;:::i;:::-;14109:74;;14213:34;14209:1;14204:3;14200:11;14193:55;14279:14;14274:2;14269:3;14265:12;14258:36;14320:2;14315:3;14311:12;14304:19;;14099:230;;;:::o;14335:320::-;;14498:67;14562:2;14557:3;14498:67;:::i;:::-;14491:74;;14595:24;14591:1;14586:3;14582:11;14575:45;14646:2;14641:3;14637:12;14630:19;;14481:174;;;:::o;14661:388::-;;14824:67;14888:2;14883:3;14824:67;:::i;:::-;14817:74;;14921:34;14917:1;14912:3;14908:11;14901:55;14987:26;14982:2;14977:3;14973:12;14966:48;15040:2;15035:3;15031:12;15024:19;;14807:242;;;:::o;15055:374::-;;15218:67;15282:2;15277:3;15218:67;:::i;:::-;15211:74;;15315:34;15311:1;15306:3;15302:11;15295:55;15381:12;15376:2;15371:3;15367:12;15360:34;15420:2;15415:3;15411:12;15404:19;;15201:228;;;:::o;15435:373::-;;15598:67;15662:2;15657:3;15598:67;:::i;:::-;15591:74;;15695:34;15691:1;15686:3;15682:11;15675:55;15761:11;15756:2;15751:3;15747:12;15740:33;15799:2;15794:3;15790:12;15783:19;;15581:227;;;:::o;15814:330::-;;15977:67;16041:2;16036:3;15977:67;:::i;:::-;15970:74;;16074:34;16070:1;16065:3;16061:11;16054:55;16135:2;16130:3;16126:12;16119:19;;15960:184;;;:::o;16150:376::-;;16313:67;16377:2;16372:3;16313:67;:::i;:::-;16306:74;;16410:34;16406:1;16401:3;16397:11;16390:55;16476:14;16471:2;16466:3;16462:12;16455:36;16517:2;16512:3;16508:12;16501:19;;16296:230;;;:::o;16532:330::-;;16695:67;16759:2;16754:3;16695:67;:::i;:::-;16688:74;;16792:34;16788:1;16783:3;16779:11;16772:55;16853:2;16848:3;16844:12;16837:19;;16678:184;;;:::o;16868:373::-;;17031:67;17095:2;17090:3;17031:67;:::i;:::-;17024:74;;17128:34;17124:1;17119:3;17115:11;17108:55;17194:11;17189:2;17184:3;17180:12;17173:33;17232:2;17227:3;17223:12;17216:19;;17014:227;;;:::o;17247:379::-;;17410:67;17474:2;17469:3;17410:67;:::i;:::-;17403:74;;17507:34;17503:1;17498:3;17494:11;17487:55;17573:17;17568:2;17563:3;17559:12;17552:39;17617:2;17612:3;17608:12;17601:19;;17393:233;;;:::o;17632:365::-;;17795:67;17859:2;17854:3;17795:67;:::i;:::-;17788:74;;17892:34;17888:1;17883:3;17879:11;17872:55;17958:3;17953:2;17948:3;17944:12;17937:25;17988:2;17983:3;17979:12;17972:19;;17778:219;;;:::o;18003:381::-;;18166:67;18230:2;18225:3;18166:67;:::i;:::-;18159:74;;18263:34;18259:1;18254:3;18250:11;18243:55;18329:19;18324:2;18319:3;18315:12;18308:41;18375:2;18370:3;18366:12;18359:19;;18149:235;;;:::o;18390:376::-;;18553:67;18617:2;18612:3;18553:67;:::i;:::-;18546:74;;18650:34;18646:1;18641:3;18637:11;18630:55;18716:14;18711:2;18706:3;18702:12;18695:36;18757:2;18752:3;18748:12;18741:19;;18536:230;;;:::o;18772:315::-;;18935:67;18999:2;18994:3;18935:67;:::i;:::-;18928:74;;19032:19;19028:1;19023:3;19019:11;19012:40;19078:2;19073:3;19069:12;19062:19;;18918:169;;;:::o;19093:115::-;19178:23;19195:5;19178:23;:::i;:::-;19173:3;19166:36;19156:52;;:::o;19214:118::-;19301:24;19319:5;19301:24;:::i;:::-;19296:3;19289:37;19279:53;;:::o;19338:435::-;;19540:95;19631:3;19622:6;19540:95;:::i;:::-;19533:102;;19652:95;19743:3;19734:6;19652:95;:::i;:::-;19645:102;;19764:3;19757:10;;19522:251;;;;;:::o;19779:222::-;;19910:2;19899:9;19895:18;19887:26;;19923:71;19991:1;19980:9;19976:17;19967:6;19923:71;:::i;:::-;19877:124;;;;:::o;20007:640::-;;20240:3;20229:9;20225:19;20217:27;;20254:71;20322:1;20311:9;20307:17;20298:6;20254:71;:::i;:::-;20335:72;20403:2;20392:9;20388:18;20379:6;20335:72;:::i;:::-;20417;20485:2;20474:9;20470:18;20461:6;20417:72;:::i;:::-;20536:9;20530:4;20526:20;20521:2;20510:9;20506:18;20499:48;20564:76;20635:4;20626:6;20564:76;:::i;:::-;20556:84;;20207:440;;;;;;;:::o;20653:210::-;;20778:2;20767:9;20763:18;20755:26;;20791:65;20853:1;20842:9;20838:17;20829:6;20791:65;:::i;:::-;20745:118;;;;:::o;20869:313::-;;21020:2;21009:9;21005:18;20997:26;;21069:9;21063:4;21059:20;21055:1;21044:9;21040:17;21033:47;21097:78;21170:4;21161:6;21097:78;:::i;:::-;21089:86;;20987:195;;;;:::o;21188:419::-;;21392:2;21381:9;21377:18;21369:26;;21441:9;21435:4;21431:20;21427:1;21416:9;21412:17;21405:47;21469:131;21595:4;21469:131;:::i;:::-;21461:139;;21359:248;;;:::o;21613:419::-;;21817:2;21806:9;21802:18;21794:26;;21866:9;21860:4;21856:20;21852:1;21841:9;21837:17;21830:47;21894:131;22020:4;21894:131;:::i;:::-;21886:139;;21784:248;;;:::o;22038:419::-;;22242:2;22231:9;22227:18;22219:26;;22291:9;22285:4;22281:20;22277:1;22266:9;22262:17;22255:47;22319:131;22445:4;22319:131;:::i;:::-;22311:139;;22209:248;;;:::o;22463:419::-;;22667:2;22656:9;22652:18;22644:26;;22716:9;22710:4;22706:20;22702:1;22691:9;22687:17;22680:47;22744:131;22870:4;22744:131;:::i;:::-;22736:139;;22634:248;;;:::o;22888:419::-;;23092:2;23081:9;23077:18;23069:26;;23141:9;23135:4;23131:20;23127:1;23116:9;23112:17;23105:47;23169:131;23295:4;23169:131;:::i;:::-;23161:139;;23059:248;;;:::o;23313:419::-;;23517:2;23506:9;23502:18;23494:26;;23566:9;23560:4;23556:20;23552:1;23541:9;23537:17;23530:47;23594:131;23720:4;23594:131;:::i;:::-;23586:139;;23484:248;;;:::o;23738:419::-;;23942:2;23931:9;23927:18;23919:26;;23991:9;23985:4;23981:20;23977:1;23966:9;23962:17;23955:47;24019:131;24145:4;24019:131;:::i;:::-;24011:139;;23909:248;;;:::o;24163:419::-;;24367:2;24356:9;24352:18;24344:26;;24416:9;24410:4;24406:20;24402:1;24391:9;24387:17;24380:47;24444:131;24570:4;24444:131;:::i;:::-;24436:139;;24334:248;;;:::o;24588:419::-;;24792:2;24781:9;24777:18;24769:26;;24841:9;24835:4;24831:20;24827:1;24816:9;24812:17;24805:47;24869:131;24995:4;24869:131;:::i;:::-;24861:139;;24759:248;;;:::o;25013:419::-;;25217:2;25206:9;25202:18;25194:26;;25266:9;25260:4;25256:20;25252:1;25241:9;25237:17;25230:47;25294:131;25420:4;25294:131;:::i;:::-;25286:139;;25184:248;;;:::o;25438:419::-;;25642:2;25631:9;25627:18;25619:26;;25691:9;25685:4;25681:20;25677:1;25666:9;25662:17;25655:47;25719:131;25845:4;25719:131;:::i;:::-;25711:139;;25609:248;;;:::o;25863:419::-;;26067:2;26056:9;26052:18;26044:26;;26116:9;26110:4;26106:20;26102:1;26091:9;26087:17;26080:47;26144:131;26270:4;26144:131;:::i;:::-;26136:139;;26034:248;;;:::o;26288:419::-;;26492:2;26481:9;26477:18;26469:26;;26541:9;26535:4;26531:20;26527:1;26516:9;26512:17;26505:47;26569:131;26695:4;26569:131;:::i;:::-;26561:139;;26459:248;;;:::o;26713:419::-;;26917:2;26906:9;26902:18;26894:26;;26966:9;26960:4;26956:20;26952:1;26941:9;26937:17;26930:47;26994:131;27120:4;26994:131;:::i;:::-;26986:139;;26884:248;;;:::o;27138:419::-;;27342:2;27331:9;27327:18;27319:26;;27391:9;27385:4;27381:20;27377:1;27366:9;27362:17;27355:47;27419:131;27545:4;27419:131;:::i;:::-;27411:139;;27309:248;;;:::o;27563:419::-;;27767:2;27756:9;27752:18;27744:26;;27816:9;27810:4;27806:20;27802:1;27791:9;27787:17;27780:47;27844:131;27970:4;27844:131;:::i;:::-;27836:139;;27734:248;;;:::o;27988:419::-;;28192:2;28181:9;28177:18;28169:26;;28241:9;28235:4;28231:20;28227:1;28216:9;28212:17;28205:47;28269:131;28395:4;28269:131;:::i;:::-;28261:139;;28159:248;;;:::o;28413:419::-;;28617:2;28606:9;28602:18;28594:26;;28666:9;28660:4;28656:20;28652:1;28641:9;28637:17;28630:47;28694:131;28820:4;28694:131;:::i;:::-;28686:139;;28584:248;;;:::o;28838:419::-;;29042:2;29031:9;29027:18;29019:26;;29091:9;29085:4;29081:20;29077:1;29066:9;29062:17;29055:47;29119:131;29245:4;29119:131;:::i;:::-;29111:139;;29009:248;;;:::o;29263:419::-;;29467:2;29456:9;29452:18;29444:26;;29516:9;29510:4;29506:20;29502:1;29491:9;29487:17;29480:47;29544:131;29670:4;29544:131;:::i;:::-;29536:139;;29434:248;;;:::o;29688:419::-;;29892:2;29881:9;29877:18;29869:26;;29941:9;29935:4;29931:20;29927:1;29916:9;29912:17;29905:47;29969:131;30095:4;29969:131;:::i;:::-;29961:139;;29859:248;;;:::o;30113:218::-;;30242:2;30231:9;30227:18;30219:26;;30255:69;30321:1;30310:9;30306:17;30297:6;30255:69;:::i;:::-;30209:122;;;;:::o;30337:222::-;;30468:2;30457:9;30453:18;30445:26;;30481:71;30549:1;30538:9;30534:17;30525:6;30481:71;:::i;:::-;30435:124;;;;:::o;30565:283::-;;30631:2;30625:9;30615:19;;30673:4;30665:6;30661:17;30780:6;30768:10;30765:22;30744:18;30732:10;30729:34;30726:62;30723:2;;;30791:18;;:::i;:::-;30723:2;30831:10;30827:2;30820:22;30605:243;;;;:::o;30854:311::-;;31021:18;31013:6;31010:30;31007:2;;;31043:18;;:::i;:::-;31007:2;31093:4;31085:6;31081:17;31073:25;;31153:4;31147;31143:15;31135:23;;30936:229;;;:::o;31171:309::-;;31336:18;31328:6;31325:30;31322:2;;;31358:18;;:::i;:::-;31322:2;31408:4;31400:6;31396:17;31388:25;;31468:4;31462;31458:15;31450:23;;31251:229;;;:::o;31486:331::-;;31637:18;31629:6;31626:30;31623:2;;;31659:18;;:::i;:::-;31623:2;31744:4;31740:9;31733:4;31725:6;31721:17;31717:33;31709:41;;31805:4;31799;31795:15;31787:23;;31552:265;;;:::o;31823:332::-;;31975:18;31967:6;31964:30;31961:2;;;31997:18;;:::i;:::-;31961:2;32082:4;32078:9;32071:4;32063:6;32059:17;32055:33;32047:41;;32143:4;32137;32133:15;32125:23;;31890:265;;;:::o;32161:98::-;;32246:5;32240:12;32230:22;;32219:40;;;:::o;32265:99::-;;32351:5;32345:12;32335:22;;32324:40;;;:::o;32370:168::-;;32487:6;32482:3;32475:19;32527:4;32522:3;32518:14;32503:29;;32465:73;;;;:::o;32544:169::-;;32662:6;32657:3;32650:19;32702:4;32697:3;32693:14;32678:29;;32640:73;;;;:::o;32719:148::-;;32858:3;32843:18;;32833:34;;;;:::o;32873:242::-;;32931:19;32948:1;32931:19;:::i;:::-;32926:24;;32964:19;32981:1;32964:19;:::i;:::-;32959:24;;33057:1;33049:6;33045:14;33042:1;33039:21;33036:2;;;33063:18;;:::i;:::-;33036:2;33107:1;33104;33100:9;33093:16;;32916:199;;;;:::o;33121:305::-;;33180:20;33198:1;33180:20;:::i;:::-;33175:25;;33214:20;33232:1;33214:20;:::i;:::-;33209:25;;33368:1;33300:66;33296:74;33293:1;33290:81;33287:2;;;33374:18;;:::i;:::-;33287:2;33418:1;33415;33411:9;33404:16;;33165:261;;;;:::o;33432:185::-;;33489:20;33507:1;33489:20;:::i;:::-;33484:25;;33523:20;33541:1;33523:20;:::i;:::-;33518:25;;33562:1;33552:2;;33567:18;;:::i;:::-;33552:2;33609:1;33606;33602:9;33597:14;;33474:143;;;;:::o;33623:191::-;;33683:20;33701:1;33683:20;:::i;:::-;33678:25;;33717:20;33735:1;33717:20;:::i;:::-;33712:25;;33756:1;33753;33750:8;33747:2;;;33761:18;;:::i;:::-;33747:2;33806:1;33803;33799:9;33791:17;;33668:146;;;;:::o;33820:96::-;;33886:24;33904:5;33886:24;:::i;:::-;33875:35;;33865:51;;;:::o;33922:90::-;;33999:5;33992:13;33985:21;33974:32;;33964:48;;;:::o;34018:149::-;;34094:66;34087:5;34083:78;34072:89;;34062:105;;;:::o;34173:89::-;;34249:6;34242:5;34238:18;34227:29;;34217:45;;;:::o;34268:126::-;;34345:42;34338:5;34334:54;34323:65;;34313:81;;;:::o;34400:77::-;;34466:5;34455:16;;34445:32;;;:::o;34483:86::-;;34558:4;34551:5;34547:16;34536:27;;34526:43;;;:::o;34575:154::-;34659:6;34654:3;34649;34636:30;34721:1;34712:6;34707:3;34703:16;34696:27;34626:103;;;:::o;34735:307::-;34803:1;34813:113;34827:6;34824:1;34821:13;34813:113;;;34912:1;34907:3;34903:11;34897:18;34893:1;34888:3;34884:11;34877:39;34849:2;34846:1;34842:10;34837:15;;34813:113;;;34944:6;34941:1;34938:13;34935:2;;;35024:1;35015:6;35010:3;35006:16;34999:27;34935:2;34784:258;;;;:::o;35048:320::-;;35129:1;35123:4;35119:12;35109:22;;35176:1;35170:4;35166:12;35197:18;35187:2;;35253:4;35245:6;35241:17;35231:27;;35187:2;35315;35307:6;35304:14;35284:18;35281:38;35278:2;;;35334:18;;:::i;:::-;35278:2;35099:269;;;;:::o;35374:233::-;;35436:24;35454:5;35436:24;:::i;:::-;35427:33;;35482:66;35475:5;35472:77;35469:2;;;35552:18;;:::i;:::-;35469:2;35599:1;35592:5;35588:13;35581:20;;35417:190;;;:::o;35613:167::-;;35673:22;35689:5;35673:22;:::i;:::-;35664:31;;35717:4;35710:5;35707:15;35704:2;;;35725:18;;:::i;:::-;35704:2;35772:1;35765:5;35761:13;35754:20;;35654:126;;;:::o;35786:176::-;;35835:20;35853:1;35835:20;:::i;:::-;35830:25;;35869:20;35887:1;35869:20;:::i;:::-;35864:25;;35908:1;35898:2;;35913:18;;:::i;:::-;35898:2;35954:1;35951;35947:9;35942:14;;35820:142;;;;:::o;35968:180::-;36016:77;36013:1;36006:88;36113:4;36110:1;36103:15;36137:4;36134:1;36127:15;36154:180;36202:77;36199:1;36192:88;36299:4;36296:1;36289:15;36323:4;36320:1;36313:15;36340:180;36388:77;36385:1;36378:88;36485:4;36482:1;36475:15;36509:4;36506:1;36499:15;36526:180;36574:77;36571:1;36564:88;36671:4;36668:1;36661:15;36695:4;36692:1;36685:15;36712:102;;36804:2;36800:7;36795:2;36788:5;36784:14;36780:28;36770:38;;36760:54;;;:::o;36820:122::-;36893:24;36911:5;36893:24;:::i;:::-;36886:5;36883:35;36873:2;;36932:1;36929;36922:12;36873:2;36863:79;:::o;36948:116::-;37018:21;37033:5;37018:21;:::i;:::-;37011:5;37008:32;36998:2;;37054:1;37051;37044:12;36998:2;36988:76;:::o;37070:120::-;37142:23;37159:5;37142:23;:::i;:::-;37135:5;37132:34;37122:2;;37180:1;37177;37170:12;37122:2;37112:78;:::o;37196:122::-;37269:24;37287:5;37269:24;:::i;:::-;37262:5;37259:35;37249:2;;37308:1;37305;37298:12;37249:2;37239:79;:::o;37324:118::-;37395:22;37411:5;37395:22;:::i;:::-;37388:5;37385:33;37375:2;;37432:1;37429;37422:12;37375:2;37365:77;:::o

Swarm Source

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