ETH Price: $3,503.34 (+2.26%)
Gas: 3 Gwei

Token

OnChain Baby Otter (OBO)
 

Overview

Max Total Supply

0 OBO

Holders

169

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 OBO
0x95803d5de2aa9b53249f70de9acdb5e32c95c33c
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:
OnChainBabyOtter

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 17 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
// File: @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol


pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

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

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

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: contracts/OnChainBabyOtter.sol


pragma solidity >=0.7.0 <0.9.0;







/**
 * 100% ethereum on-chain baby otter, by Prof. Otterlove.
 *
 *
 * I did an experiment to create the cutest animal on the blockchain,
 * and the cutest animal is otter, it's obvious.
 * I don't want people to fight over my cute babies otters,
 * that's why there isn't one more rare than another.
 * By the way, I've noticed that babies otters
 * can take differents characters on adoption.
 *
 * Be good parents, they are not toys, they have a heart...
 * But, they are so cute, so I have no doubts.
 *
 */
contract OnChainBabyOtter is ERC721, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _babyOtterIds;
    using Strings for uint256;

    bool pauseAdoption = true;
    bool revealed;
    mapping(address => bool) internal _minted;
    mapping(uint256 => uint256) internal _dna;
    mapping(uint256 => uint256) internal _natureOtter;
    event registerOfBabyOtterOwners(address _address, uint256 _otterId);

    constructor() ERC721("OnChain Baby Otter", "OBO") {
        /*
         * @Prof., thank you for funding my function.
         *
         *                  Yours truly,
         *                  b0162fcbd0d41d88
         *                  d1d1b03a103cab83
         *                  9d8983332d9f1f52
         *                  cda62016d5df3594,
         *                      xoxo
         */
        setPriceFeed(0, 0xAc559F25B1619171CbC396a50854A3240b6A4e99);
        setPriceFeed(1, 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c);
        setPriceFeed(2, 0x7bAC85A8a13A4BcD8abb3eB7d6b4d632c5a57676);
        setPriceFeed(3, 0x547a514d5e3769680Ce22B2361c10Ea13619e8a9);
        setPriceFeed(4, 0x2c1d072e956AFFC0D435Cb7AC38EF18d24d9127c);
    }

    /**
     * You can adopt only one baby otter. I'll gladly give you one.
     * Only one so that you can love it as much as possible <3.
     */
    function adoptMyLovelyOtter() external payable {
        require(!pauseAdoption, "Paused");
        require(_babyOtterIds.current() < 2048, "All adopted");
        require(!_minted[msg.sender], "One adoption is allowed");
        _babyOtterIds.increment();
        uint256 newItemId = _babyOtterIds.current();
        _safeMint(msg.sender, newItemId);
        _minted[msg.sender] = true;
        uint256 seed = uint256(
            keccak256(
                abi.encodePacked(
                    block.timestamp +
                        block.difficulty +
                        ((
                            uint256(keccak256(abi.encodePacked(block.coinbase)))
                        ) / (block.timestamp)) +
                        block.gaslimit +
                        ((uint256(keccak256(abi.encodePacked(msg.sender)))) /
                            (block.timestamp)) +
                        block.number +
                        uint256(blockhash(block.number - 1))
                )
            )
        );
        if (seed % 3 == 0) {
            _dna[newItemId] = seed;
            _natureOtter[newItemId] = 0;
        } else if (seed % 3 == 1) {
            _dna[newItemId] = uint256(keccak256(abi.encodePacked(msg.sender)));
            _natureOtter[newItemId] = 1;
        } else {
            _natureOtter[newItemId] = 2;
        }
    }

    /**
     * This is how your lovely baby otter will look like.
     */
    function babyOtterAppearance(uint256 dna)
        public
        pure
        returns (string memory)
    {
        string memory svg;
        svg = (
            string(
                bytes.concat(
                    abi.encodePacked(
                        "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' shape-rendering='crispEdges'>",
                        "<rect x='0' y='0' width='100' height='100' fill='",
                        getDnaPart(1, dna),
                        "'/>",
                        /*
                         * @Prof., with a small addition.
                         *  ------------
                         *  -----||-----
                         *       ||
                         *       ||
                         *
                         *                  Yours truly,
                         *                  b0162fcbd0d41d88
                         *                  d1d1b03a103cab83
                         *                  9d8983332d9f1f52
                         *                  cda62016d5df3594,
                         *                      xoxo
                         */
                        "<path stroke='#000' d='M41 18h5m8 0h5m-19 1h2m1 0h17m-19 1h5m3 0h2m3 0h5m-10 1h2m-2 1h2m-2 1h2m-4 1h6m-5 1h4m-7 1h10m-12 1h3m9 0h2m-16 1h3m12 0h3m-19 1h2m16 0h2m-21 1h2m18 0h2m-27 1h6m20 0h3m1 0h2m-33 1h2m3 0h1m22 0h1m3 0h2m-34 1h1m3 0h2m22 0h2m3 0h2m-36 1h1m4 0h1m3 0h5m8 0h5m3 0h1m4 0h1m-36 1h1m3 0h2m2 0h2m3 0h2m6 0h2m3 0h2m2 0h2m3 0h1m-36 1h1m3 0h1m2 0h2m5 0h1m6 0h1m5 0h2m2 0h1m-32 1h2m2 0h1m2 0h1m6 0h1m6 0h1m6 0h1m2 0h1m2 0h2m-35 1h2m1 0h1m2 0h1m6 0h1m6 0h1m6 0h1m2 0h1m1 0h1m-32 1h1m1 0h1m2 0h1m6 0h1m6 0h1m6 0h1m2 0h3m-30 1h1m2 0h2m4 0h2m6 0h2m4 0h2m2 0h1m-28 1h1m3 0h2m2 0h2m8 0h2m2 0h2m3 0h1m-28 1h1m4 0h1m1 0h2m10 0h4m4 0h1m-16 1h1m2 0h1m11 0h1m-28 1h1m11 0h4m11 0h1m-28 1h2m11 0h2m12 0h1m-27 1h1m8 0h1m2 0h2m2 0h1m8 0h1m-26 1h1m8 0h8m8 0h1m-26 1h2m22 0h2m-25 1h2m20 0h2m-23 1h1m20 0h1m-22 1h2m18 0h2m-21 1h3m14 0h3m-18 1h3m10 0h3m-16 1h1m1 0h13m-16 1h2m13 0h2m-17 1h1m15 0h1m-18 1h2m3 0h1m11 0h2m-19 1h1m4 0h1m12 0h1m-19 1h1m4 0h1m8 0h3m1 0h2m-21 1h2m4 0h1m2 0h4m2 0h1m4 0h1m-21 1h1m5 0h1m5 0h1m1 0h1m1 0h2m1 0h2m-21 1h1m5 0h1m3 0h3m1 0h3m1 0h2m-21 1h1m6 0h2m3 0h1m4 0h3m-20 1h1m7 0h5m5 0h1m-19 1h1m8 0h1m8 0h3m-21 1h1m8 0h2m9 0h1m-21 1h1m9 0h1m7 0h1m1 0h1m-21 1h1m9 0h1m6 0h2m1 0h1m-21 1h1m8 0h2m6 0h1m2 0h1m-21 1h1m8 0h1m6 0h2m1 0h2m-21 1h2m5 0h4m4 0h2m2 0h1m-21 1h4m8 0h5m3 0h3m-24 1h2m2 0h2m4 0h2m5 0h1m2 0h2m1 0h1m-24 1h1m4 0h3m4 0h1m4 0h2m3 0h2m-25 1h2m4 0h1m1 0h6m5 0h5m-26 1h3m4 0h2m-24 1h10m2 0h4m5 0h2m-23 1h2m7 0h2m1 0h1m7 0h2m-21 1h3m15 0h1m-17 1h4m10 0h3m-14 1h5m4 0h3m-8 1h6m8-63h1M32 33h1m34 3h1m-6 9h1M53 60h1m2 6h1m-9 6h1m-1 1h1m-20 5h1m8 1h1m15-52h1m8 4h1M36 43h1m-2-4h1m30-1h1m-25 4h1' />",
                        "<path stroke='",
                        getDnaPart(1000000000, dna)
                    ),
                    abi.encodePacked(
                        "' d='M46 27h7m-9 1h12m-14 1h16m-17 1h9m1 0h8m-19 1h20m-25 1h3m1 0h22m1 0h3m-31 1h3m2 0h22m2 0h3m-33 1h2m3 0h3m5 0h8m5 0h3m3 0h2m-34 1h1m4 0h1m8 0h6m7 0h2m4 0h1m-34 1h2m2 0h2m8 0h6m8 0h2m2 0h2m-32 1h1m1 0h2m8 0h6m8 0h2m1 0h2m-31 1h1m1 0h2m8 0h6m8 0h2m1 0h1m-28 1h2m8 0h6m8 0h2m-26 1h2m8 0h6m8 0h2m-26 1h3m6 0h8m6 0h3m-26 1h4m4 0h10m4 0h1m1 0h2m-26 1h11m2 0h1m1 0h11m-26 1h11m4 0h11m-25 1h5m14 0h4m-23 1h2m20 0h2m-19 8h1m-1 1h5m7 0h1m-14 1h6m7 0h2m-15 1h3m1 0h2m8 0h1m-16 1h4m1 0h2m8 0h2m-17 1h4m1 0h2m9 0h1m-17 1h4m1 0h2m7 0h4m-19 1h5m1 0h5m3 0h1m2 0h1m-18 1h5m1 0h3m7 0h1m-18 1h6m2 0h3m-11 1h7m-7 1h8m-8 1h8m10 0h1m-19 1h9m9 0h1m-19 1h9m9 0h1m-19 1h8m9 0h2m-19 1h8m-7 1h5m10 0h2m-16 1h7m7 0h2m-19 1h2m2 0h2m1 0h1m8 0h2m2 0h1m-22 1h4m3 0h4m7 0h3m-21 1h4m-5 1h4m-6 1h5m-19 1h7m4 0h7m-16 1h7m1 0h7m-12 1h10m-6 1h4m20-54h1m6 15h1m-12 1h1m11 2h1m-6 25h1m-13 3h1m5-43h1m-12 5h1M29 79h1m4-42h1m19 35h1' /><path stroke='",
                        getDnaPart(1000000000000000000, dna),
                        "' d='M42 35h3m10 0h3m-17 1h1m1 0h3m8 0h5m-19 1h5m10 0h5m-20 1h4m12 0h4m-20 1h3m14 0h3m-19 1h1m15 0h2m-17 1h1m13 0h2m-16-5h1m-1 4h1m0 1h1m1-4h1m8 0h1m-11 1h2m8 0h2m-13 1h1m12 0h1m-14 1h1m12 0h1m-13-1h2m8 0h2m-12 1h1m10 0h1' /><path stroke='",
                        getDnaPart(1000000000000000000000000000, dna),
                        "' d='M43 37h1m12 0h1m-15 1h3m10 0h3m-15 1h1m12 0h1' /><path stroke='",
                        getDnaPart(1000000000000000000000000000000000000, dna),
                        "' d='M43 45h1m2 0h3m2 0h6m-17 1h6m1 0h2m2 0h2m1 0h6m-22 1h8m8 0h8m-23 1h22m-21 1h4m1 0h15m-20 1h3m1 0h16m-19 1h18m-16 1h14m-12 1h10m-7 2h1m1 0h5m-7 1h7m-7 1h8m-8 1h8m-8 1h5m-1 1h1m-1 1h1m-1 1h1m-2 1h3m-3 1h5m-8 1h8m-7 1h7m-7 1h7m-7 1h6m-6 1h6m-7 1h6m-5 1h4m-9-26h1m0 0h1m3 10h1m-6-6h1m-2 1h1m9 9h1m0 4h1M35 34h2m26 0h2m-31 1h2m28 0h2m-31 1h1m28 0h1' /><path stroke='",
                        getDnaPart(1000000000, dna),
                        "' ><animate id='wk' attributeName='d' dur='0.25s' values='M55 35h1m-14 0h3m11 0h2;M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1;M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6; M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6 M40 38h2m1 0h3m8 0h2m1 0h3m-18 0h1m13 0h1;M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6 M40 38h2m1 0h3m8 0h2m1 0h3m-18 0h1m13 0h1 M40 39h6m8 0h6; M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6 M40 38h2m1 0h3m8 0h2m1 0h3m-18 0h1m13 0h1 M40 39h6m8 0h6 M41 40h3m11 0h4m-15 0h1; M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6 M40 38h2m1 0h3m8 0h2m1 0h3m-18 0h1m13 0h1 M40 39h6m8 0h6 M41 40h3m11 0h4m-15 0h1 M42 41h2M56 41h2;M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6 M40 38h2m1 0h3m8 0h2m1 0h3m-18 0h1m13 0h1 M40 39h6m8 0h6 M41 40h3m11 0h4m-15 0h1;M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6 M40 38h2m1 0h3m8 0h2m1 0h3m-18 0h1m13 0h1 M40 39h6m8 0h6;M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6 M40 38h2m1 0h3m8 0h2m1 0h3m-18 0h1m13 0h1;M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1 M40 37h6m8 0h6;M55 35h1m-14 0h3m11 0h2 M41 36h1m1 0h3m8 0h4m-16 0h1m15 0h1;M55 35h1m-14 0h3m11 0h2'  begin='4s;wk.end+4s'/></path></svg>"
                    )
                )
            )
        );
        return svg;
    }

    function tokenURI(uint256 babyOtterId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(babyOtterId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory json;
        if (!revealed) {
            json = Base64.encode(
                bytes(
                    string(
                        abi.encodePacked(
                            '{"name": "Sleeping baby otter #',
                            Strings.toString(babyOtterId),
                            '" , "description": "zzzz.....zzzz.....zzzz.....zzzz", "image_data": "',
                            bytes(
                                string(
                                    abi.encodePacked(
                                        "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' shape-rendering='crispEdges'>",
                                        "<path stroke='#000' d='M45 26h10m-12 1h3m8 0h3m-15 1h2m12 0h2m-17 1h2m14 0h2m-22 1h5m17 0h4m-26 1h1m2 0h1m18 0h1m2 0h1m-27 1h2m1 0h2m18 0h2m1 0h2m-28 1h2m1 0h1m2 0h11m1 0h4m2 0h1m1 0h2m-27 1h3m1 0h2m14 0h2m1 0h3m-24 1h3m5 0h7m4 0h3m-22 1h2m3 0h4m5 0h4m2 0h2m-22 1h1m3 0h2m11 0h2m2 0h1m-22 1h1m2 0h2m13 0h2m1 0h1m-23 1h2m1 0h2m15 0h4m-24 1h2m1 0h1m2 0h1m3 0h1m2 0h1m3 0h1m3 0h3m-23 1h1m1 0h1m2 0h2m1 0h2m2 0h5m3 0h2m-22 1h3m17 0h2m-21 1h2m15 0h4m-22 1h6m11 0h2m1 0h2m-23 1h2m4 0h4m7 0h2m3 0h2m-24 1h1m8 0h3m1 0h5m5 0h1m-24 1h1m10 0h3m3 0h2m4 0h1m-24 1h1m12 0h2m8 0h1m-24 1h1m13 0h2m3 0h1m3 0h1m-24 1h1m14 0h2m3 0h1m2 0h1m-24 1h1m16 0h1m5 0h1m-24 1h1m17 0h1m4 0h1m-24 1h1m18 0h1m3 0h1m-24 1h2m18 0h4m-23 1h2m19 0h1m-22 1h3m18 0h1m-22 1h1m1 0h2m17 0h1m-22 1h1m2 0h2m16 0h1m-22 1h1m3 0h2m15 0h1m-17 1h3m12 0h1m-21 1h2m5 0h2m11 0h1m-20 1h2m5 0h3m8 0h2m-19 1h2m6 0h3m4 0h3m-17 1h3m6 0h2m3 0h2m-16 1h1m1 0h2m11 0h1m-16 1h1m14 0h1m-16 1h2m12 0h2m-15 1h1m12 0h1m-14 1h2m10 0h2m-13 1h2m8 0h2m-11 1h3m5 0h2m-8 1h3m1 0h3m-5 1h3m6-43h1M46 41h1m-8 19h1m20 0h1m-8-27h1m2 15h1m0 2h1'/>",
                                        "<path stroke='#eaeaaa' d='M46 27h8m-10 1h12m-13 1h14m-15 1h16m-20 1h2m1 0h6m1 0h11m1 0h2m-24 1h1m2 0h18m2 0h1m-24 1h1m1 0h2m16 0h2m1 0h1m-22 1h1m2 0h14m2 0h1m-18 1h5m7 0h4m-17 1h3m13 0h2m-19 1h3m15 0h2m-20 1h2m17 0h1m-20 2h1m-1 1h1m17 3h1m-19 1h4m13 0h3m-21 1h8m9 0h5m-22 1h10m3 0h3m2 0h3m-21 1h9m1 0h2m2 0h2m2 0h4m-22 1h13m2 0h3m1 0h3m-22 1h7m1 0h6m2 0h2m2 0h2m-22 1h11m1 0h4m1 0h5m-22 1h17m1 0h4m-22 1h18m1 0h3m-21 1h4m1 0h13m-17 1h6m1 0h10m1 0h1m-18 1h18m-20 1h1m2 0h12m1 0h4m-20 1h2m2 0h3m1 0h12m-20 1h3m2 0h15m-20 1h4m3 0h12m-18 1h5m2 0h11m-17 1h5m3 0h1m1 0h6m-15 1h6m3 0h4m-11 1h6m2 0h3m-13 1h1m2 0h11m-14 1h14m-13 1h12m-12 1h12m-11 1h10m-8 1h7m-6 1h5m-3 1h1m-4-41h1m-8 8h1m7 9h1m6 0h1m-9 7h1m10 0h1m1-8h1m-15 3h1m3 1h1m-7 3h1m10 3h1m-9 1h1m3 4h1m-6 8h1'/>",
                                        "<path stroke='",
                                        _dna[babyOtterId] != 0
                                            ? getDnaPart(
                                                1000000000,
                                                _dna[babyOtterId]
                                            )
                                            : getDnaPart(
                                                1000000000,
                                                uint256(
                                                    keccak256(
                                                        abi.encodePacked(
                                                            ownerOf(babyOtterId)
                                                        )
                                                    )
                                                )
                                            ),
                                        "' d='M48 36h5m-8 1h4m1 0h1m1 0h4m-12 1h5m1 0h1m1 0h5m-14 1h8m1 0h6m-16 1h2m1 0h3m1 0h2m1 0h3m1 0h3m-17 1h2m5 0h2m5 0h2m-16 1h9m1 0h7m-17 1h15m-12 1h11m-8 1h4m1 0h2m-5 1h1m-2-9h1m-1 1h1m1-1h1m-1 1h1m-1 1h1m6 2h1m-7 4h1m-2-3h1'/>",
                                        "</svg>"
                                    )
                                )
                            ),
                            '","attributes":[{"trait_type":"Nature", "value":"',
                            _natureOtter[babyOtterId] == 0
                                ? "Independent"
                                : _natureOtter[babyOtterId] == 1
                                ? "Loyal"
                                : "Fits",
                            '"}]}'
                        )
                    )
                )
            );
        } else {
            json = Base64.encode(
                bytes(
                    string(
                        abi.encodePacked(
                            '{"name": "Baby otter #',
                            Strings.toString(babyOtterId),
                            '" , "description": "I am one of the ',
                            remainingBabyOtter() == 2048
                            /*
                             * @Prof., tell them what it is.
                             *
                             *                  Yours truly,
                             *                  b0162fcbd0d41d88
                             *                  d1d1b03a103cab83
                             *                  9d8983332d9f1f52
                             *                  cda62016d5df3594,
                             *                      xoxo
                             */
                                ? "2048 babies otters. What is this thing on my head?"
                                : Strings.toString(remainingBabyOtter()),
                            remainingBabyOtter() == 2048
                                ? ""
                                : /*
                                 * @Prof., look, they are begging now.
                                 *
                                 *                  Yours truly,
                                 *                  b0162fcbd0d41d88
                                 *                  d1d1b03a103cab83
                                 *                  9d8983332d9f1f52
                                 *                  cda62016d5df3594,
                                 *                      xoxo
                                 */
                                " babies otters remaining. We were 2048... Never touch this thing on my head, please...",
                            '", "image_data": "',
                            _dna[babyOtterId] != 0
                                ? bytes(babyOtterAppearance(_dna[babyOtterId]))
                                : bytes(
                                    babyOtterAppearance(
                                        uint256(
                                            keccak256(
                                                abi.encodePacked(
                                                    ownerOf(babyOtterId)
                                                )
                                            )
                                        )
                                    )
                                ),
                            '","attributes":[{"trait_type":"Nature", "value":"',
                            _natureOtter[babyOtterId] == 0
                                ? "Independent"
                                : _natureOtter[babyOtterId] == 1
                                ? "Loyal"
                                : "Fits",
                            '"}]}'
                        )
                    )
                )
            );
        }

        return string(abi.encodePacked("data:application/json;base64,", json));
    }

    /**
     * Pause adoption of the lovely baby otter.
     */
    function setPauseAdoption(bool _state) external onlyOwner {
        pauseAdoption = _state;
    }

    /**
     * Wake up babies otters, look how cute they are!
     */
    function wakeUp() external onlyOwner {
        revealed = true;
        /*
         * @Prof. you should have checked twice before launching this contract.
         * Enjoy this 5 days...
         *
         *                  Yours truly,
         *                  b0162fcbd0d41d88
         *                  d1d1b03a103cab83
         *                  9d8983332d9f1f52
         *                  cda62016d5df3594,
         *                      xoxo
         */
        countdown = block.timestamp + 432000;
    }

    /**
     * Official register of baby otter owners.
     */
    function registrationOfBabyOtterOwners(uint256 _otterId) external payable {
        require(
            ownerOf(_otterId) == msg.sender,
            "You are not a baby otter owner"
        );
        require(msg.value >= 20000000000000000);
        emit registerOfBabyOtterOwners(msg.sender, _otterId);
    }

    function getBalanceContract() public view onlyOwner returns (uint256) {
        return address(this).balance;
    }

    function withdraw() external payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: getBalanceContract()
        }("");
        require(success);
    }

    function getDnaPart(uint256 _div, uint256 _properties)
        public
        pure
        returns (bytes memory)
    {
        uint256 rr = _properties / _div;
        uint256 r = (rr % 1023) % 256;
        uint256 gg = _properties / (_div * 1000);
        uint256 g = (gg % 1023) % 256;
        uint256 bb = _properties / (_div * 1000000);
        uint256 b = (bb % 1023) % 256;
        return
            abi.encodePacked(
                "rgb(",
                Strings.toString(r),
                ",",
                Strings.toString(g),
                ",",
                Strings.toString(b),
                ")"
            );
    }

    uint256 public countdown = 0;
    mapping(uint256 => AggregatorV3Interface) internal priceFeed;
    uint256 internal countOfPriceFeed = 5;
    uint256 internal min = 1;
    uint256 internal max = 2048;

    function babyOtterExplosion() public {
        /**
         * @Prof., you are completely crazy.
         * I hate otters, i hate people, i hate YOU.
         * I managed to insert this function just before the deployment.
         * It's just to add a little fun. Who doesn't like explosions?
         * When you use this function, half of the remaining babies otters explode.
         * Maybe your otter will explode in front of your eyes! Kaboom!
         *
         *                  Yours truly,
         *                  b0162fcbd0d41d88
         *                  d1d1b03a103cab83
         *                  9d8983332d9f1f52
         *                  cda62016d5df3594,
         *                      xoxo
         *
         */
        require(revealed, "More fun when they are awake");
        require(balanceOf(msg.sender) > 0, "You must have an otter, idiot");
        require(countdown <= block.timestamp, "Tic, Tac...");
        uint256 seed = uint256(
            keccak256(
                abi.encodePacked(
                    block.timestamp +
                        block.difficulty +
                        ((
                            uint256(keccak256(abi.encodePacked(block.coinbase)))
                        ) / (block.timestamp)) +
                        block.gaslimit +
                        ((uint256(keccak256(abi.encodePacked(msg.sender)))) /
                            (block.timestamp)) +
                        block.number +
                        uint256(blockhash(block.number - 1)) +
                        getAllPrice()
                )
            )
        );
        if (seed % 2 == 0) {
            for (
                uint256 i = min;
                i <= min - 1 + remainingBabyOtter() / 2;
                i++
            ) {
                _burn(i);
            }
            min = min + remainingBabyOtter() / 2;
        } else {
            for (uint256 i = min + remainingBabyOtter() / 2; i <= max; i++) {
                _burn(i);
            }
            max = max - remainingBabyOtter() / 2;
        }
        countdown = block.timestamp + 432000;
    }

    function remainingBabyOtter() internal view returns (uint256) {
        return (max - min) + 1;
    }

    function setPriceFeed(uint256 _val, address _address) public onlyOwner {
        priceFeed[_val] = AggregatorV3Interface(_address);
    }

    function setCountOfPriceFeed(uint256 _val) public onlyOwner {
        countOfPriceFeed = _val;
    }

    function getLatestPrice(uint256 _index) internal view returns (int256) {
        (, int256 price, , , ) = priceFeed[_index].latestRoundData();
        return price;
    }

    function getAllPrice() internal view returns (uint256) {
        /**
         * @Prof., I learned a lot from you.
         * Look how I complicated the calculation of the random number.
         *
         *                  Yours truly,
         *                  b0162fcbd0d41d88
         *                  d1d1b03a103cab83
         *                  9d8983332d9f1f52
         *                  cda62016d5df3594,
         *                      xoxo
         *
         */
        uint256 total;
        for (uint256 i = 0; i < countOfPriceFeed; i++) {
            total += uint256(getLatestPrice(i));
        }
        return total;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_otterId","type":"uint256"}],"name":"registerOfBabyOtterOwners","type":"event"},{"inputs":[],"name":"adoptMyLovelyOtter","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dna","type":"uint256"}],"name":"babyOtterAppearance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"babyOtterExplosion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countdown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalanceContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_div","type":"uint256"},{"internalType":"uint256","name":"_properties","type":"uint256"}],"name":"getDnaPart","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_otterId","type":"uint256"}],"name":"registrationOfBabyOtterOwners","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setCountOfPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPauseAdoption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"setPriceFeed","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":"babyOtterId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"wakeUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526008805460ff191660019081179091556000600c556005600e55600f556108006010553480156200003457600080fd5b50604080518082018252601281527127b721b430b4b7102130b13c9027ba3a32b960711b6020808301918252835180850190945260038452624f424f60e81b9084015281519192916200008a916000916200024b565b508051620000a09060019060208401906200024b565b505050620000bd620000b76200016860201b60201c565b6200016c565b620000de600073ac559f25b1619171cbc396a50854a3240b6a4e99620001be565b620000ff600173f4030086522a5beea4988f8ca5b36dbc97bee88c620001be565b620001206002737bac85a8a13a4bcd8abb3eb7d6b4d632c5a57676620001be565b62000141600373547a514d5e3769680ce22b2361c10ea13619e8a9620001be565b620001626004732c1d072e956affc0d435cb7ac38ef18d24d9127c620001be565b6200032e565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b031633146200021d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b6000918252600d602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b8280546200025990620002f1565b90600052602060002090601f0160209004810192826200027d5760008555620002c8565b82601f106200029857805160ff1916838001178555620002c8565b82800160010185558215620002c8579182015b82811115620002c8578251825591602001919060010190620002ab565b50620002d6929150620002da565b5090565b5b80821115620002d65760008155600101620002db565b600181811c908216806200030657607f821691505b602082108114156200032857634e487b7160e01b600052602260045260246000fd5b50919050565b614c4e806200033e6000396000f3fe6080604052600436106101475760003560e01c806301ffc9a71461014c57806306fdde0314610181578063081812fc146101a3578063095ea7b3146101db57806310f95e02146101fd57806319e269a3146102125780631dad94591461023257806323b872dd1461025257806325e8ab58146102725780633b895c90146102875780633ccfd60b146102a757806342842e0e146102af578063474e1fe1146102cf5780636352211e146102d757806366bd78fd146102f75780636c16df931461031a57806370a082311461032d578063715018a61461034d5780638da5cb5b1461036257806395d89b4114610377578063a22cb4651461038c578063a576f1b5146103ac578063b88d4fde146103cc578063c87b56dd146103ec578063cba888721461040c578063e985e9c514610422578063eb7132f014610442578063f2fde38b14610462575b600080fd5b34801561015857600080fd5b5061016c6101673660046123d3565b610482565b60405190151581526020015b60405180910390f35b34801561018d57600080fd5b506101966104d4565b60405161017891906148e5565b3480156101af57600080fd5b506101c36101be36600461240d565b610566565b6040516001600160a01b039091168152602001610178565b3480156101e757600080fd5b506101fb6101f636600461238e565b6105f3565b005b34801561020957600080fd5b506101fb610704565b34801561021e57600080fd5b5061019661022d36600461240d565b6109f7565b34801561023e57600080fd5b5061019661024d366004612449565b610ac8565b34801561025e57600080fd5b506101fb61026d36600461224d565b610bae565b34801561027e57600080fd5b506101fb610bdf565b34801561029357600080fd5b506101fb6102a2366004612426565b610c2f565b6101fb610c8c565b3480156102bb57600080fd5b506101fb6102ca36600461224d565b610d18565b6101fb610d33565b3480156102e357600080fd5b506101c36102f236600461240d565b610fd0565b34801561030357600080fd5b5061030c611047565b604051908152602001610178565b6101fb61032836600461240d565b61107d565b34801561033957600080fd5b5061030c6103483660046121f8565b61112d565b34801561035957600080fd5b506101fb6111b4565b34801561036e57600080fd5b506101c36111ef565b34801561038357600080fd5b506101966111fe565b34801561039857600080fd5b506101fb6103a7366004612364565b61120d565b3480156103b857600080fd5b506101fb6103c73660046123b8565b611218565b3480156103d857600080fd5b506101fb6103e7366004612289565b61125a565b3480156103f857600080fd5b5061019661040736600461240d565b611292565b34801561041857600080fd5b5061030c600c5481565b34801561042e57600080fd5b5061016c61043d36600461221a565b611639565b34801561044e57600080fd5b506101fb61045d36600461240d565b611667565b34801561046e57600080fd5b506101fb61047d3660046121f8565b61169b565b60006001600160e01b031982166380ac58cd60e01b14806104b357506001600160e01b03198216635b5e139f60e01b145b806104ce57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546104e390614a5e565b80601f016020809104026020016040519081016040528092919081815260200182805461050f90614a5e565b801561055c5780601f106105315761010080835404028352916020019161055c565b820191906000526020600020905b81548152906001019060200180831161053f57829003601f168201915b5050505050905090565b600061057182611738565b6105d75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105fe82610fd0565b9050806001600160a01b0316836001600160a01b0316141561066c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105ce565b336001600160a01b038216148061068857506106888133611639565b6106f55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016105ce565b6106ff8383611755565b505050565b600854610100900460ff1661075a5760405162461bcd60e51b815260206004820152601c60248201527b4d6f72652066756e207768656e207468657920617265206177616b6560201b60448201526064016105ce565b60006107653361112d565b116107b25760405162461bcd60e51b815260206004820152601d60248201527f596f75206d757374206861766520616e206f747465722c206964696f7400000060448201526064016105ce565b42600c5411156107f25760405162461bcd60e51b815260206004820152600b60248201526a2a34b196102a30b197171760a91b60448201526064016105ce565b60006107fc6117c3565b610807600143614a1b565b4060001c43423360405160200161081e91906125d3565b6040516020818303038152906040528051906020012060001c61084191906149e8565b45424160405160200161085491906125d3565b6040516020818303038152906040528051906020012060001c61087791906149e8565b61088144426149d0565b61088b91906149d0565b61089591906149d0565b61089f91906149d0565b6108a991906149d0565b6108b391906149d0565b6108bd91906149d0565b6040516020016108cf91815260200190565b60408051601f19818403018152919052805160209091012090506108f4600282614aae565b61097457600f545b6002610906611800565b61091091906149e8565b6001600f5461091f9190614a1b565b61092991906149d0565b811161094a5761093881611822565b8061094281614a93565b9150506108fc565b506002610955611800565b61095f91906149e8565b600f5461096c91906149d0565b600f556109e4565b60006002610980611800565b61098a91906149e8565b600f5461099791906149d0565b90505b60105481116109be576109ac81611822565b806109b681614a93565b91505061099a565b5060026109c9611800565b6109d391906149e8565b6010546109e09190614a1b565b6010555b6109f142620697806149d0565b600c5550565b606080610a05600184610ac8565b610a13633b9aca0085610ac8565b604051602001610a24929190613f50565b604051602081830303815290604052610a45670de0b6b3a764000085610ac8565b610a5a676765c793fa10079d601b1b86610ac8565b610a726a0c097ce7bc90715b34b9f160241b87610ac8565b610a80633b9aca0088610ac8565b604051602001610a939493929190612793565b60408051601f1981840301815290829052610ab192916020016125eb565b60408051601f198184030181529190529392505050565b60606000610ad684846149e8565b90506000610100610ae96103ff84614aae565b610af39190614aae565b90506000610b03866103e86149fc565b610b0d90866149e8565b90506000610100610b206103ff84614aae565b610b2a9190614aae565b90506000610b3b88620f42406149fc565b610b4590886149e8565b90506000610100610b586103ff84614aae565b610b629190614aae565b9050610b6d856118ab565b610b76846118ab565b610b7f836118ab565b604051602001610b919392919061271b565b604051602081830303815290604052965050505050505092915050565b610bb833826119b0565b610bd45760405162461bcd60e51b81526004016105ce9061497f565b6106ff838383611a79565b33610be86111ef565b6001600160a01b031614610c0e5760405162461bcd60e51b81526004016105ce9061494a565b6008805461ff001916610100179055610c2a42620697806149d0565b600c55565b33610c386111ef565b6001600160a01b031614610c5e5760405162461bcd60e51b81526004016105ce9061494a565b6000918252600d602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b33610c956111ef565b6001600160a01b031614610cbb5760405162461bcd60e51b81526004016105ce9061494a565b600033610cc6611047565b604051600081818185875af1925050503d8060008114610d02576040519150601f19603f3d011682016040523d82523d6000602084013e610d07565b606091505b5050905080610d1557600080fd5b50565b6106ff8383836040518060200160405280600081525061125a565b60085460ff1615610d6f5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016105ce565b610800610d7b60075490565b10610db65760405162461bcd60e51b815260206004820152600b60248201526a105b1b0818591bdc1d195960aa1b60448201526064016105ce565b3360009081526009602052604090205460ff1615610e105760405162461bcd60e51b815260206004820152601760248201527613db994818591bdc1d1a5bdb881a5cc8185b1b1bddd959604a1b60448201526064016105ce565b610e1e600780546001019055565b6000610e2960075490565b9050610e353382611c03565b336000908152600960205260408120805460ff19166001908117909155610e5c9043614a1b565b4060001c434233604051602001610e7391906125d3565b6040516020818303038152906040528051906020012060001c610e9691906149e8565b454241604051602001610ea991906125d3565b6040516020818303038152906040528051906020012060001c610ecc91906149e8565b610ed644426149d0565b610ee091906149d0565b610eea91906149d0565b610ef491906149d0565b610efe91906149d0565b610f0891906149d0565b604051602001610f1a91815260200190565b60408051601f1981840301815291905280516020909101209050610f3f600382614aae565b610f61576000918252600a6020908152604080842092909255600b9052812055565b610f6c600382614aae565b60011415610fb95733604051602001610f8591906125d3565b60408051808303601f1901815291815281516020928301206000948552600a835281852055600b9091529091206001905550565b6000828152600b60205260409020600290555b5050565b6000818152600260205260408120546001600160a01b0316806104ce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105ce565b6000336110526111ef565b6001600160a01b0316146110785760405162461bcd60e51b81526004016105ce9061494a565b504790565b3361108782610fd0565b6001600160a01b0316146110dd5760405162461bcd60e51b815260206004820152601e60248201527f596f7520617265206e6f7420612062616279206f74746572206f776e6572000060448201526064016105ce565b66470de4df8200003410156110f157600080fd5b60408051338152602081018390527f641acf4bf1d8c636143f5c448d15235357ca8b2ddaddecf64db213fcbddcb7f7910160405180910390a150565b60006001600160a01b0382166111985760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105ce565b506001600160a01b031660009081526003602052604090205490565b336111bd6111ef565b6001600160a01b0316146111e35760405162461bcd60e51b81526004016105ce9061494a565b6111ed6000611c1d565b565b6006546001600160a01b031690565b6060600180546104e390614a5e565b610fcc338383611c6f565b336112216111ef565b6001600160a01b0316146112475760405162461bcd60e51b81526004016105ce9061494a565b6008805460ff1916911515919091179055565b61126433836119b0565b6112805760405162461bcd60e51b81526004016105ce9061497f565b61128c84848484611d3a565b50505050565b606061129d82611738565b6113015760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105ce565b600854606090610100900460ff166114725761146b61131f846118ab565b6000858152600a602052604090205461137657611371633b9aca0061134387610fd0565b60405160200161135391906125d3565b6040516020818303038152906040528051906020012060001c610ac8565b611394565b6000858152600a602052604090205461139490633b9aca0090610ac8565b6040516020016113a49190613546565b60408051601f198184030181529181526000878152600b602052205415611420576000868152600b60205260409020546001146113fd57604051806040016040528060048152602001634669747360e01b815250611445565b60405180604001604052806005815260200164131bde585b60da1b815250611445565b6040518060400160405280600b81526020016a125b99195c195b99195b9d60aa1b8152505b6040516020016114579392919061478a565b604051602081830303815290604052611d6d565b9050611611565b61160e61147e846118ab565b611486611800565b610800146114a35761149e611499611800565b6118ab565b6114bd565b604051806060016040528060328152602001614b31603291395b6114c5611800565b610800146114eb57604051806080016040528060568152602001614ba3605691396114fc565b604051806020016040528060008152505b6000878152600a602052604090205461154e5761154961151b88610fd0565b60405160200161152b91906125d3565b6040516020818303038152906040528051906020012060001c6109f7565b611566565b6000878152600a6020526040902054611566906109f7565b6000888152600b6020526040902054156115d5576000888152600b60205260409020546001146115b257604051806040016040528060048152602001634669747360e01b8152506115fa565b60405180604001604052806005815260200164131bde585b60da1b8152506115fa565b6040518060400160405280600b81526020016a125b99195c195b99195b9d60aa1b8152505b60405160200161145795949392919061261a565b90505b80604051602001611622919061486d565b604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b336116706111ef565b6001600160a01b0316146116965760405162461bcd60e51b81526004016105ce9061494a565b600e55565b336116a46111ef565b6001600160a01b0316146116ca5760405162461bcd60e51b81526004016105ce9061494a565b6001600160a01b03811661172f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ce565b610d1581611c1d565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061178a82610fd0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060005b600e548110156117fa576117dc81611ec0565b6117e690836149d0565b9150806117f281614a93565b9150506117c9565b50919050565b6000600f546010546118129190614a1b565b61181d9060016149d0565b905090565b600061182d82610fd0565b905061183a600083611755565b6001600160a01b0381166000908152600360205260408120805460019290611863908490614a1b565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b03841690600080516020614bf9833981519152908390a45050565b6060816118cf5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118f957806118e381614a93565b91506118f29050600a836149e8565b91506118d3565b6000816001600160401b0381111561191357611913614b04565b6040519080825280601f01601f19166020018201604052801561193d576020820181803683370190505b5090505b84156119a857611952600183614a1b565b915061195f600a86614aae565b61196a9060306149d0565b60f81b81838151811061197f5761197f614aee565b60200101906001600160f81b031916908160001a9053506119a1600a866149e8565b9450611941565b949350505050565b60006119bb82611738565b611a1c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105ce565b6000611a2783610fd0565b9050806001600160a01b0316846001600160a01b03161480611a4e5750611a4e8185611639565b806119a85750836001600160a01b0316611a6784610566565b6001600160a01b031614949350505050565b826001600160a01b0316611a8c82610fd0565b6001600160a01b031614611af05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105ce565b6001600160a01b038216611b525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105ce565b611b5d600082611755565b6001600160a01b0383166000908152600360205260408120805460019290611b86908490614a1b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bb49084906149d0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020614bf983398151915291a4505050565b610fcc828260405180602001604052806000815250611f55565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ccd5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016105ce565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d45848484611a79565b611d5184848484611f88565b61128c5760405162461bcd60e51b81526004016105ce906148f8565b6060815160001415611d8d57505060408051602081019091526000815290565b6000604051806060016040528060408152602001614b636040913990506000600384516002611dbc91906149d0565b611dc691906149e8565b611dd19060046149fc565b6001600160401b03811115611de857611de8614b04565b6040519080825280601f01601f191660200182016040528015611e12576020820181803683370190505b509050600182016020820185865187015b80821015611e7e576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611e23565b5050600386510660018114611e9a5760028114611ead57611eb5565b603d6001830353603d6002830353611eb5565b603d60018303535b509195945050505050565b6000818152600d6020526040808220548151633fabe5a360e21b8152915183926001600160a01b039092169163feaf968c9160048083019260a0929190829003018186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f49919061246b565b50919695505050505050565b611f5f8383612095565b611f6c6000848484611f88565b6106ff5760405162461bcd60e51b81526004016105ce906148f8565b60006001600160a01b0384163b1561208a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fcc9033908990889088906004016148b2565b602060405180830381600087803b158015611fe657600080fd5b505af1925050508015612016575060408051601f3d908101601f19168201909252612013918101906123f0565b60015b612070573d808015612044576040519150601f19603f3d011682016040523d82523d6000602084013e612049565b606091505b5080516120685760405162461bcd60e51b81526004016105ce906148f8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119a8565b506001949350505050565b6001600160a01b0382166120eb5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105ce565b6120f481611738565b156121405760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016105ce565b6001600160a01b03821660009081526003602052604081208054600192906121699084906149d0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020614bf9833981519152908290a45050565b80356001600160a01b03811681146121cc57600080fd5b919050565b803580151581146121cc57600080fd5b80516001600160501b03811681146121cc57600080fd5b60006020828403121561220a57600080fd5b612213826121b5565b9392505050565b6000806040838503121561222d57600080fd5b612236836121b5565b9150612244602084016121b5565b90509250929050565b60008060006060848603121561226257600080fd5b61226b846121b5565b9250612279602085016121b5565b9150604084013590509250925092565b6000806000806080858703121561229f57600080fd5b6122a8856121b5565b93506122b6602086016121b5565b92506040850135915060608501356001600160401b03808211156122d957600080fd5b818701915087601f8301126122ed57600080fd5b8135818111156122ff576122ff614b04565b604051601f8201601f19908116603f0116810190838211818310171561232757612327614b04565b816040528281528a602084870101111561234057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561237757600080fd5b612380836121b5565b9150612244602084016121d1565b600080604083850312156123a157600080fd5b6123aa836121b5565b946020939093013593505050565b6000602082840312156123ca57600080fd5b612213826121d1565b6000602082840312156123e557600080fd5b813561221381614b1a565b60006020828403121561240257600080fd5b815161221381614b1a565b60006020828403121561241f57600080fd5b5035919050565b6000806040838503121561243957600080fd5b82359150612244602084016121b5565b6000806040838503121561245c57600080fd5b50508035926020909101359150565b600080600080600060a0868803121561248357600080fd5b61248c866121e1565b94506020860151935060408601519250606086015191506124af608087016121e1565b90509295509295909350565b600081518084526124d3816020860160208601614a32565b601f01601f19169290920160200192915050565b600081516124f9818560208601614a32565b9290920192915050565b6d3c70617468207374726f6b653d2760901b8152600e0190565b7f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323081527f30302f737667272076696577426f783d2730203020313030203130302720736860208201527a30b83296b932b73232b934b7339e93b1b934b9b822b233b2b9939f60291b6040820152605b0190565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224e81527030ba3ab932911610113b30b63ab2911d1160791b602082015260310190565b60609190911b6001600160601b031916815260140190565b600083516125fd818460208801614a32565b835190830190612611818360208801614a32565b01949350505050565b757b226e616d65223a202242616279206f74746572202360501b8152855160009061264c816016850160208b01614a32565b7f22202c20226465736372697074696f6e223a20224920616d206f6e65206f66206016918401918201526303a3432960e51b6036820152865161269681603a840160208b01614a32565b86519101906126ac81603a840160208a01614a32565b711116101134b6b0b3b2afb230ba30911d101160711b603a929091019182015284516126df81604c840160208901614a32565b6126ed604c82840101612590565b9150508351612700818360208801614a32565b63227d5d7d60e01b9101908152600401979650505050505050565b630e4cec4560e31b81526000845161273a816004850160208901614a32565b8083019050600b60fa1b806004830152855161275d816005850160208a01614a32565b60059201918201528351612778816006840160208801614a32565b602960f81b6006929091019182015260070195945050505050565b7f2720643d274d343620323768376d2d3920316831326d2d313420316831366d2d81527f3137203168396d31203068386d2d313920316832306d2d3235203168336d312060208201527f306832326d31203068336d2d3331203168336d3220306832326d32203068336d60408201527f2d3333203168326d33203068336d35203068386d35203068336d33203068326d60608201527f2d3334203168316d34203068316d38203068366d37203068326d34203068316d60808201527f2d3334203168326d32203068326d38203068366d38203068326d32203068326d60a08201527f2d3332203168316d31203068326d38203068366d38203068326d31203068326d60c08201527f2d3331203168316d31203068326d38203068366d38203068326d31203068316d60e08201527f2d3238203168326d38203068366d38203068326d2d3236203168326d382030686101008201527f366d38203068326d2d3236203168336d36203068386d36203068336d2d3236206101208201527f3168346d3420306831306d34203068316d31203068326d2d323620316831316d6101408201527f32203068316d3120306831316d2d323620316831316d3420306831316d2d32356101608201527f203168356d3134203068346d2d3233203168326d3230203068326d2d313920386101808201527f68316d2d31203168356d37203068316d2d3134203168366d37203068326d2d316101a08201527f35203168336d31203068326d38203068316d2d3136203168346d31203068326d6101c08201527f38203068326d2d3137203168346d31203068326d39203068316d2d31372031686101e08201527f346d31203068326d37203068346d2d3139203168356d31203068356d332030686102008201527f316d32203068316d2d3138203168356d31203068336d37203068316d2d3138206102208201527f3168366d32203068336d2d3131203168376d2d37203168386d2d38203168386d6102408201527f3130203068316d2d3139203168396d39203068316d2d3139203168396d3920306102608201527f68316d2d3139203168386d39203068326d2d3139203168386d2d37203168356d6102808201527f3130203068326d2d3136203168376d37203068326d2d3139203168326d3220306102a08201527f68326d31203068316d38203068326d32203068316d2d3232203168346d3320306102c08201527f68346d37203068336d2d3231203168346d2d35203168346d2d36203168356d2d6102e08201527f3139203168376d34203068376d2d3136203168376d31203068376d2d313220316103008201527f6831306d2d36203168346d32302d353468316d3620313568316d2d31322031686103208201527f316d3131203268316d2d3620323568316d2d3133203368316d352d343368316d6103408201527f2d3132203568314d323920373968316d342d343268316d3139203335683127206103608201526f2f3e3c70617468207374726f6b653d2760801b610380820152600061353c612f5f612f59612d98612d92612d36612d30612c0b6103908a018e6124e7565b7f2720643d274d343220333568336d3130203068336d2d3137203168316d31203081527f68336d38203068356d2d3139203168356d3130203068356d2d3230203168346d60208201527f3132203068346d2d3230203168336d3134203068336d2d3139203168316d313560408201527f203068326d2d3137203168316d3133203068326d2d31362d3568316d2d31203460608201527f68316d30203168316d312d3468316d38203068316d2d3131203168326d38203060808201527f68326d2d3133203168316d3132203068316d2d3134203168316d31322030683160a08201527f6d2d31332d3168326d38203068326d2d3132203168316d31302030683127202f60c08201526e3e3c70617468207374726f6b653d2760881b60e082015260ef0190565b8b6124e7565b7f2720643d274d343320333768316d3132203068316d2d3135203168336d31302081527f3068336d2d3135203168316d31322030683127202f3e3c70617468207374726f6020820152636b653d2760e01b604082015260440190565b886124e7565b7f2720643d274d343320343568316d32203068336d32203068366d2d313720316881527f366d31203068326d32203068326d31203068366d2d3232203168386d3820306860208201527f386d2d323320316832326d2d3231203168346d3120306831356d2d323020316860408201527f336d3120306831366d2d313920316831386d2d313620316831346d2d3132203160608201527f6831306d2d37203268316d31203068356d2d37203168376d2d37203168386d2d60808201527f38203168386d2d38203168356d2d31203168316d2d31203168316d2d3120316860a08201527f316d2d32203168336d2d33203168356d2d38203168386d2d37203168376d2d3760c08201527f203168376d2d37203168366d2d36203168366d2d37203168366d2d352031683460e08201527f6d2d392d323668316d30203068316d3320313068316d2d362d3668316d2d32206101008201527f3168316d39203968316d30203468314d333520333468326d3236203068326d2d6101208201527f3331203168326d3238203068326d2d3331203168316d32382030683127202f3e6101408201526d3c70617468207374726f6b653d2760901b61016082015261016e0190565b856124e7565b7f27203e3c616e696d6174652069643d27776b27206174747269627574654e616d81527f653d276427206475723d27302e323573272076616c7565733d274d353520333560208201527f68316d2d3134203068336d3131203068323b4d353520333568316d2d3134203060408201527f68336d313120306832204d343120333668316d31203068336d38203068346d2d60608201527f3136203068316d3135203068313b4d353520333568316d2d3134203068336d3160808201527f3120306832204d343120333668316d31203068336d38203068346d2d3136203060a08201527f68316d313520306831204d343020333768366d38203068363b204d353520333560c082015260007f68316d2d3134203068336d313120306832204d343120333668316d31203068338060e08401527f6d38203068346d2d3136203068316d313520306831204d343020333768366d38806101008501527f20306836204d343020333868326d31203068336d38203068326d31203068336d806101208601527f2d3138203068316d3133203068313b4d353520333568316d2d3134203068336d6101408601527f313120306832204d343120333668316d31203068336d38203068346d2d3136206101608601527f3068316d313520306831204d343020333768366d3820306836204d34302033386101808601527f68326d31203068336d38203068326d31203068336d2d3138203068316d3133206101a08601527f306831204d343020333968366d38203068363b204d353520333568316d2d31346101c08601527f203068336d313120306832204d343120333668316d31203068336d38203068346101e08601527f6d2d3136203068316d313520306831204d343020333768366d3820306836204d6102008601527f343020333868326d31203068336d38203068326d31203068336d2d31382030686102208601527f316d313320306831204d343020333968366d3820306836204d343120343068336102408601527f6d3131203068346d2d3135203068313b204d353520333568316d2d31342030686102608601527f336d313120306832204d343120333668316d31203068336d38203068346d2d316102808601527f36203068316d313520306831204d343020333768366d3820306836204d3430206102a08601527f333868326d31203068336d38203068326d31203068336d2d3138203068316d316102c08601527f3320306831204d343020333968366d3820306836204d343120343068336d31316102e08601527f203068346d2d313520306831204d343220343168324d353620343168323b4d356103008601527f3520333568316d2d3134203068336d313120306832204d343120333668316d31806103208701527f203068336d38203068346d2d3136203068316d313520306831204d3430203337806103408801527f68366d3820306836204d343020333868326d31203068336d38203068326d3120806103608901527f3068336d2d3138203068316d313320306831204d343020333968366d382030686103808901527f36204d343120343068336d3131203068346d2d3135203068313b4d35352033356103a0890152856103c0890152846103e0890152836104008901527f2d3138203068316d313320306831204d343020333968366d38203068363b4d3561042089015282610440890152816104608901528061048089015250507f3068336d2d3138203068316d3133203068313b4d353520333568316d2d3134206104a08701527f3068336d313120306832204d343120333668316d31203068336d38203068346d6104c08701527f2d3136203068316d313520306831204d343020333768366d38203068363b4d356104e087015280610500870152505050507f203068336d38203068346d2d3136203068316d3135203068313b4d35352033356105208301527f68316d2d3134203068336d313120306832272020626567696e3d2734733b776b610540830152761732b732159a3993979f1e17b830ba341f1e17b9bb339f60491b61056083015261057782019050919050565b9695505050505050565b60006135518261251d565b7f3c70617468207374726f6b653d27233030302720643d274d343520323668313081527f6d2d3132203168336d38203068336d2d3135203168326d3132203068326d2d3160208201527f37203168326d3134203068326d2d3232203168356d3137203068346d2d32362060408201527f3168316d32203068316d3138203068316d32203068316d2d3237203168326d3160608201527f203068326d3138203068326d31203068326d2d3238203168326d31203068316d60808201527f3220306831316d31203068346d32203068316d31203068326d2d32372031683360a08201527f6d31203068326d3134203068326d31203068336d2d3234203168336d3520306860c08201527f376d34203068336d2d3232203168326d33203068346d35203068346d3220306860e08201527f326d2d3232203168316d33203068326d3131203068326d32203068316d2d32326101008201527f203168316d32203068326d3133203068326d31203068316d2d3233203168326d6101208201527f31203068326d3135203068346d2d3234203168326d31203068316d32203068316101408201527f6d33203068316d32203068316d33203068316d33203068336d2d3233203168316101608201527f6d31203068316d32203068326d31203068326d32203068356d33203068326d2d6101808201527f3232203168336d3137203068326d2d3231203168326d3135203068346d2d32326101a08201527f203168366d3131203068326d31203068326d2d3233203168326d34203068346d6101c08201527f37203068326d33203068326d2d3234203168316d38203068336d31203068356d6101e08201527f35203068316d2d3234203168316d3130203068336d33203068326d34203068316102008201527f6d2d3234203168316d3132203068326d38203068316d2d3234203168316d31336102208201527f203068326d33203068316d33203068316d2d3234203168316d3134203068326d6102408201527f33203068316d32203068316d2d3234203168316d3136203068316d35203068316102608201527f6d2d3234203168316d3137203068316d34203068316d2d3234203168316d31386102808201527f203068316d33203068316d2d3234203168326d3138203068346d2d32332031686102a08201527f326d3139203068316d2d3232203168336d3138203068316d2d3232203168316d6102c08201527f31203068326d3137203068316d2d3232203168316d32203068326d31362030686102e08201527f316d2d3232203168316d33203068326d3135203068316d2d3137203168336d316103008201527f32203068316d2d3231203168326d35203068326d3131203068316d2d323020316103208201527f68326d35203068336d38203068326d2d3139203168326d36203068336d3420306103408201527f68336d2d3137203168336d36203068326d33203068326d2d3136203168316d316103608201527f203068326d3131203068316d2d3136203168316d3134203068316d2d313620316103808201527f68326d3132203068326d2d3135203168316d3132203068316d2d3134203168326103a08201527f6d3130203068326d2d3133203168326d38203068326d2d3131203168336d35206103c08201527f3068326d2d38203168336d31203068336d2d35203168336d362d343368314d346103e08201527f3620343168316d2d3820313968316d3230203068316d2d382d323768316d32206104008201526c189ab418b6981019341893979f60991b6104208201527f3c70617468207374726f6b653d27236561656161612720643d274d343620323761042d8201527f68386d2d313020316831326d2d313320316831346d2d313520316831366d2d3261044d8201527f30203168326d31203068366d3120306831316d31203068326d2d32342031683161046d8201527f6d3220306831386d32203068316d2d3234203168316d31203068326d3136203061048d8201527f68326d31203068316d2d3232203168316d3220306831346d32203068316d2d316104ad8201527f38203168356d37203068346d2d3137203168336d3133203068326d2d313920316104cd8201527f68336d3135203068326d2d3230203168326d3137203068316d2d3230203268316104ed8201527f6d2d31203168316d3137203368316d2d3139203168346d3133203068336d2d3261050d8201527f31203168386d39203068356d2d323220316831306d33203068336d322030683361052d8201527f6d2d3231203168396d31203068326d32203068326d32203068346d2d3232203161054d8201527f6831336d32203068336d31203068336d2d3232203168376d31203068366d322061056d8201527f3068326d32203068326d2d323220316831316d31203068346d31203068356d2d61058d8201527f323220316831376d31203068346d2d323220316831386d31203068336d2d32316105ad8201527f203168346d3120306831336d2d3137203168366d3120306831306d31203068316105cd8201527f6d2d313820316831386d2d3230203168316d3220306831326d31203068346d2d6105ed8201527f3230203168326d32203068336d3120306831326d2d3230203168336d3220306861060d8201527f31356d2d3230203168346d3320306831326d2d3138203168356d32203068313161062d8201527f6d2d3137203168356d33203068316d31203068366d2d3135203168366d33203061064d8201527f68346d2d3131203168366d32203068336d2d3133203168316d3220306831316d61066d8201527f2d313420316831346d2d313320316831326d2d313220316831326d2d3131203161068d8201527f6831306d2d38203168376d2d36203168356d2d33203168316d2d342d343168316106ad8201527f6d2d38203868316d37203968316d36203068316d2d39203768316d31302030686106cd8201527f316d312d3868316d2d3135203368316d33203168316d2d37203368316d3130206106ed8201527919b418b6969c9018b418b699901a3418b6969b101c341893979f60311b61070d8201526119a8613f3e613e25613e1f6107278501612503565b876124e7565b7f2720643d274d343820333668356d2d38203168346d31203068316d312030683481527f6d2d3132203168356d31203068316d31203068356d2d3134203168386d31203060208201527f68366d2d3136203168326d31203068336d31203068326d31203068336d31203060408201527f68336d2d3137203168326d35203068326d35203068326d2d3136203168396d3160608201527f203068376d2d313720316831356d2d313220316831316d2d38203168346d312060808201527f3068326d2d35203168316d2d322d3968316d2d31203168316d312d3168316d2d60a08201527f31203168316d2d31203168316d36203268316d2d37203468316d2d322d33683160c08201526213979f60e91b60e082015260e30190565b651e17b9bb339f60d11b815260060190565b6000613f5b8261251d565b7f3c7265637420783d27302720793d2730272077696474683d2731303027206865815270696768743d27313030272066696c6c3d2760781b60208201528451613fab816031840160208901614a32565b6213979f60e91b603192909101918201527f3c70617468207374726f6b653d27233030302720643d274d343120313868356d60348201527f38203068356d2d3139203168326d3120306831376d2d3139203168356d33203060548201527f68326d33203068356d2d3130203168326d2d32203168326d2d32203168326d2d60748201527f34203168366d2d35203168346d2d3720316831306d2d3132203168336d39203060948201527f68326d2d3136203168336d3132203068336d2d3139203168326d31362030683260b48201527f6d2d3231203168326d3138203068326d2d3237203168366d3230203068336d3160d48201527f203068326d2d3333203168326d33203068316d3232203068316d33203068326d60f48201527f2d3334203168316d33203068326d3232203068326d33203068326d2d333620316101148201527f68316d34203068316d33203068356d38203068356d33203068316d34203068316101348201527f6d2d3336203168316d33203068326d32203068326d33203068326d36203068326101548201527f6d33203068326d32203068326d33203068316d2d3336203168316d33203068316101748201527f6d32203068326d35203068316d36203068316d35203068326d32203068316d2d6101948201527f3332203168326d32203068316d32203068316d36203068316d36203068316d366101b48201527f203068316d32203068316d32203068326d2d3335203168326d31203068316d326101d48201527f203068316d36203068316d36203068316d36203068316d32203068316d3120306101f48201527f68316d2d3332203168316d31203068316d32203068316d36203068316d3620306102148201527f68316d36203068316d32203068336d2d3330203168316d32203068326d3420306102348201527f68326d36203068326d34203068326d32203068316d2d3238203168316d3320306102548201527f68326d32203068326d38203068326d32203068326d33203068316d2d323820316102748201527f68316d34203068316d31203068326d3130203068346d34203068316d2d3136206102948201527f3168316d32203068316d3131203068316d2d3238203168316d3131203068346d6102b48201527f3131203068316d2d3238203168326d3131203068326d3132203068316d2d32376102d48201527f203168316d38203068316d32203068326d32203068316d38203068316d2d32366102f48201527f203168316d38203068386d38203068316d2d3236203168326d3232203068326d6103148201527f2d3235203168326d3230203068326d2d3233203168316d3230203068316d2d326103348201527f32203168326d3138203068326d2d3231203168336d3134203068336d2d3138206103548201527f3168336d3130203068336d2d3136203168316d3120306831336d2d31362031686103748201527f326d3133203068326d2d3137203168316d3135203068316d2d3138203168326d6103948201527f33203068316d3131203068326d2d3139203168316d34203068316d31322030686103b48201527f316d2d3139203168316d34203068316d38203068336d31203068326d2d3231206103d48201527f3168326d34203068316d32203068346d32203068316d34203068316d2d3231206103f48201527f3168316d35203068316d35203068316d31203068316d31203068326d312030686104148201527f326d2d3231203168316d35203068316d33203068336d31203068336d312030686104348201527f326d2d3231203168316d36203068326d33203068316d34203068336d2d3230206104548201527f3168316d37203068356d35203068316d2d3139203168316d38203068316d38206104748201527f3068336d2d3231203168316d38203068326d39203068316d2d3231203168316d6104948201527f39203068316d37203068316d31203068316d2d3231203168316d39203068316d6104b48201527f36203068326d31203068316d2d3231203168316d38203068326d36203068316d6104d48201527f32203068316d2d3231203168316d38203068316d36203068326d31203068326d6104f48201527f2d3231203168326d35203068346d34203068326d32203068316d2d32312031686105148201527f346d38203068356d33203068336d2d3234203168326d32203068326d342030686105348201527f326d35203068316d32203068326d31203068316d2d3234203168316d342030686105548201527f336d34203068316d34203068326d33203068326d2d3235203168326d342030686105748201527f316d31203068366d35203068356d2d3236203168336d34203068326d2d3234206105948201527f316831306d32203068346d35203068326d2d3233203168326d37203068326d316105b48201527f203068316d37203068326d2d3231203168336d3135203068316d2d31372031686105d48201527f346d3130203068336d2d3134203168356d34203068336d2d38203168366d382d6105f48201527f363368314d333220333368316d3334203368316d2d36203968314d35332036306106148201527f68316d32203668316d2d39203668316d2d31203168316d2d3230203568316d386106348201527f203168316d31352d353268316d38203468314d333620343368316d2d322d34686106548201527318b699981698b418b696991a901a34189390179f60611b610674820152614781612f596106888301612503565b95945050505050565b7f7b226e616d65223a2022536c656570696e672062616279206f747465722023008152600084516147c281601f850160208901614a32565b7f22202c20226465736372697074696f6e223a20227a7a7a7a2e2e2e2e2e7a7a7a601f918401918201527f7a2e2e2e2e2e7a7a7a7a2e2e2e2e2e7a7a7a7a222c2022696d6167655f646174603f8201526430911d101160d91b605f8201528451614833816064840160208901614a32565b614841606482840101612590565b9150508351614854818360208801614a32565b63227d5d7d60e01b910190815260040195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516148a581601d850160208701614a32565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061353c908301846124bb565b60208152600061221360208301846124bb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156149e3576149e3614ac2565b500190565b6000826149f7576149f7614ad8565b500490565b6000816000190483118215151615614a1657614a16614ac2565b500290565b600082821015614a2d57614a2d614ac2565b500390565b60005b83811015614a4d578181015183820152602001614a35565b8381111561128c5750506000910152565b600181811c90821680614a7257607f821691505b602082108114156117fa57634e487b7160e01b600052602260045260246000fd5b6000600019821415614aa757614aa7614ac2565b5060010190565b600082614abd57614abd614ad8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d1557600080fdfe3230343820626162696573206f74746572732e20576861742069732074686973207468696e67206f6e206d7920686561643f4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f20626162696573206f74746572732072656d61696e696e672e205765207765726520323034382e2e2e204e6576657220746f7563682074686973207468696e67206f6e206d7920686561642c20706c656173652e2e2eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122007c782cf3b4ef822204f8c2d18bb79dd05143582c9c1ed4034eef964521d6f7464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101475760003560e01c806301ffc9a71461014c57806306fdde0314610181578063081812fc146101a3578063095ea7b3146101db57806310f95e02146101fd57806319e269a3146102125780631dad94591461023257806323b872dd1461025257806325e8ab58146102725780633b895c90146102875780633ccfd60b146102a757806342842e0e146102af578063474e1fe1146102cf5780636352211e146102d757806366bd78fd146102f75780636c16df931461031a57806370a082311461032d578063715018a61461034d5780638da5cb5b1461036257806395d89b4114610377578063a22cb4651461038c578063a576f1b5146103ac578063b88d4fde146103cc578063c87b56dd146103ec578063cba888721461040c578063e985e9c514610422578063eb7132f014610442578063f2fde38b14610462575b600080fd5b34801561015857600080fd5b5061016c6101673660046123d3565b610482565b60405190151581526020015b60405180910390f35b34801561018d57600080fd5b506101966104d4565b60405161017891906148e5565b3480156101af57600080fd5b506101c36101be36600461240d565b610566565b6040516001600160a01b039091168152602001610178565b3480156101e757600080fd5b506101fb6101f636600461238e565b6105f3565b005b34801561020957600080fd5b506101fb610704565b34801561021e57600080fd5b5061019661022d36600461240d565b6109f7565b34801561023e57600080fd5b5061019661024d366004612449565b610ac8565b34801561025e57600080fd5b506101fb61026d36600461224d565b610bae565b34801561027e57600080fd5b506101fb610bdf565b34801561029357600080fd5b506101fb6102a2366004612426565b610c2f565b6101fb610c8c565b3480156102bb57600080fd5b506101fb6102ca36600461224d565b610d18565b6101fb610d33565b3480156102e357600080fd5b506101c36102f236600461240d565b610fd0565b34801561030357600080fd5b5061030c611047565b604051908152602001610178565b6101fb61032836600461240d565b61107d565b34801561033957600080fd5b5061030c6103483660046121f8565b61112d565b34801561035957600080fd5b506101fb6111b4565b34801561036e57600080fd5b506101c36111ef565b34801561038357600080fd5b506101966111fe565b34801561039857600080fd5b506101fb6103a7366004612364565b61120d565b3480156103b857600080fd5b506101fb6103c73660046123b8565b611218565b3480156103d857600080fd5b506101fb6103e7366004612289565b61125a565b3480156103f857600080fd5b5061019661040736600461240d565b611292565b34801561041857600080fd5b5061030c600c5481565b34801561042e57600080fd5b5061016c61043d36600461221a565b611639565b34801561044e57600080fd5b506101fb61045d36600461240d565b611667565b34801561046e57600080fd5b506101fb61047d3660046121f8565b61169b565b60006001600160e01b031982166380ac58cd60e01b14806104b357506001600160e01b03198216635b5e139f60e01b145b806104ce57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546104e390614a5e565b80601f016020809104026020016040519081016040528092919081815260200182805461050f90614a5e565b801561055c5780601f106105315761010080835404028352916020019161055c565b820191906000526020600020905b81548152906001019060200180831161053f57829003601f168201915b5050505050905090565b600061057182611738565b6105d75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105fe82610fd0565b9050806001600160a01b0316836001600160a01b0316141561066c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105ce565b336001600160a01b038216148061068857506106888133611639565b6106f55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016105ce565b6106ff8383611755565b505050565b600854610100900460ff1661075a5760405162461bcd60e51b815260206004820152601c60248201527b4d6f72652066756e207768656e207468657920617265206177616b6560201b60448201526064016105ce565b60006107653361112d565b116107b25760405162461bcd60e51b815260206004820152601d60248201527f596f75206d757374206861766520616e206f747465722c206964696f7400000060448201526064016105ce565b42600c5411156107f25760405162461bcd60e51b815260206004820152600b60248201526a2a34b196102a30b197171760a91b60448201526064016105ce565b60006107fc6117c3565b610807600143614a1b565b4060001c43423360405160200161081e91906125d3565b6040516020818303038152906040528051906020012060001c61084191906149e8565b45424160405160200161085491906125d3565b6040516020818303038152906040528051906020012060001c61087791906149e8565b61088144426149d0565b61088b91906149d0565b61089591906149d0565b61089f91906149d0565b6108a991906149d0565b6108b391906149d0565b6108bd91906149d0565b6040516020016108cf91815260200190565b60408051601f19818403018152919052805160209091012090506108f4600282614aae565b61097457600f545b6002610906611800565b61091091906149e8565b6001600f5461091f9190614a1b565b61092991906149d0565b811161094a5761093881611822565b8061094281614a93565b9150506108fc565b506002610955611800565b61095f91906149e8565b600f5461096c91906149d0565b600f556109e4565b60006002610980611800565b61098a91906149e8565b600f5461099791906149d0565b90505b60105481116109be576109ac81611822565b806109b681614a93565b91505061099a565b5060026109c9611800565b6109d391906149e8565b6010546109e09190614a1b565b6010555b6109f142620697806149d0565b600c5550565b606080610a05600184610ac8565b610a13633b9aca0085610ac8565b604051602001610a24929190613f50565b604051602081830303815290604052610a45670de0b6b3a764000085610ac8565b610a5a676765c793fa10079d601b1b86610ac8565b610a726a0c097ce7bc90715b34b9f160241b87610ac8565b610a80633b9aca0088610ac8565b604051602001610a939493929190612793565b60408051601f1981840301815290829052610ab192916020016125eb565b60408051601f198184030181529190529392505050565b60606000610ad684846149e8565b90506000610100610ae96103ff84614aae565b610af39190614aae565b90506000610b03866103e86149fc565b610b0d90866149e8565b90506000610100610b206103ff84614aae565b610b2a9190614aae565b90506000610b3b88620f42406149fc565b610b4590886149e8565b90506000610100610b586103ff84614aae565b610b629190614aae565b9050610b6d856118ab565b610b76846118ab565b610b7f836118ab565b604051602001610b919392919061271b565b604051602081830303815290604052965050505050505092915050565b610bb833826119b0565b610bd45760405162461bcd60e51b81526004016105ce9061497f565b6106ff838383611a79565b33610be86111ef565b6001600160a01b031614610c0e5760405162461bcd60e51b81526004016105ce9061494a565b6008805461ff001916610100179055610c2a42620697806149d0565b600c55565b33610c386111ef565b6001600160a01b031614610c5e5760405162461bcd60e51b81526004016105ce9061494a565b6000918252600d602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b33610c956111ef565b6001600160a01b031614610cbb5760405162461bcd60e51b81526004016105ce9061494a565b600033610cc6611047565b604051600081818185875af1925050503d8060008114610d02576040519150601f19603f3d011682016040523d82523d6000602084013e610d07565b606091505b5050905080610d1557600080fd5b50565b6106ff8383836040518060200160405280600081525061125a565b60085460ff1615610d6f5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016105ce565b610800610d7b60075490565b10610db65760405162461bcd60e51b815260206004820152600b60248201526a105b1b0818591bdc1d195960aa1b60448201526064016105ce565b3360009081526009602052604090205460ff1615610e105760405162461bcd60e51b815260206004820152601760248201527613db994818591bdc1d1a5bdb881a5cc8185b1b1bddd959604a1b60448201526064016105ce565b610e1e600780546001019055565b6000610e2960075490565b9050610e353382611c03565b336000908152600960205260408120805460ff19166001908117909155610e5c9043614a1b565b4060001c434233604051602001610e7391906125d3565b6040516020818303038152906040528051906020012060001c610e9691906149e8565b454241604051602001610ea991906125d3565b6040516020818303038152906040528051906020012060001c610ecc91906149e8565b610ed644426149d0565b610ee091906149d0565b610eea91906149d0565b610ef491906149d0565b610efe91906149d0565b610f0891906149d0565b604051602001610f1a91815260200190565b60408051601f1981840301815291905280516020909101209050610f3f600382614aae565b610f61576000918252600a6020908152604080842092909255600b9052812055565b610f6c600382614aae565b60011415610fb95733604051602001610f8591906125d3565b60408051808303601f1901815291815281516020928301206000948552600a835281852055600b9091529091206001905550565b6000828152600b60205260409020600290555b5050565b6000818152600260205260408120546001600160a01b0316806104ce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105ce565b6000336110526111ef565b6001600160a01b0316146110785760405162461bcd60e51b81526004016105ce9061494a565b504790565b3361108782610fd0565b6001600160a01b0316146110dd5760405162461bcd60e51b815260206004820152601e60248201527f596f7520617265206e6f7420612062616279206f74746572206f776e6572000060448201526064016105ce565b66470de4df8200003410156110f157600080fd5b60408051338152602081018390527f641acf4bf1d8c636143f5c448d15235357ca8b2ddaddecf64db213fcbddcb7f7910160405180910390a150565b60006001600160a01b0382166111985760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105ce565b506001600160a01b031660009081526003602052604090205490565b336111bd6111ef565b6001600160a01b0316146111e35760405162461bcd60e51b81526004016105ce9061494a565b6111ed6000611c1d565b565b6006546001600160a01b031690565b6060600180546104e390614a5e565b610fcc338383611c6f565b336112216111ef565b6001600160a01b0316146112475760405162461bcd60e51b81526004016105ce9061494a565b6008805460ff1916911515919091179055565b61126433836119b0565b6112805760405162461bcd60e51b81526004016105ce9061497f565b61128c84848484611d3a565b50505050565b606061129d82611738565b6113015760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105ce565b600854606090610100900460ff166114725761146b61131f846118ab565b6000858152600a602052604090205461137657611371633b9aca0061134387610fd0565b60405160200161135391906125d3565b6040516020818303038152906040528051906020012060001c610ac8565b611394565b6000858152600a602052604090205461139490633b9aca0090610ac8565b6040516020016113a49190613546565b60408051601f198184030181529181526000878152600b602052205415611420576000868152600b60205260409020546001146113fd57604051806040016040528060048152602001634669747360e01b815250611445565b60405180604001604052806005815260200164131bde585b60da1b815250611445565b6040518060400160405280600b81526020016a125b99195c195b99195b9d60aa1b8152505b6040516020016114579392919061478a565b604051602081830303815290604052611d6d565b9050611611565b61160e61147e846118ab565b611486611800565b610800146114a35761149e611499611800565b6118ab565b6114bd565b604051806060016040528060328152602001614b31603291395b6114c5611800565b610800146114eb57604051806080016040528060568152602001614ba3605691396114fc565b604051806020016040528060008152505b6000878152600a602052604090205461154e5761154961151b88610fd0565b60405160200161152b91906125d3565b6040516020818303038152906040528051906020012060001c6109f7565b611566565b6000878152600a6020526040902054611566906109f7565b6000888152600b6020526040902054156115d5576000888152600b60205260409020546001146115b257604051806040016040528060048152602001634669747360e01b8152506115fa565b60405180604001604052806005815260200164131bde585b60da1b8152506115fa565b6040518060400160405280600b81526020016a125b99195c195b99195b9d60aa1b8152505b60405160200161145795949392919061261a565b90505b80604051602001611622919061486d565b604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b336116706111ef565b6001600160a01b0316146116965760405162461bcd60e51b81526004016105ce9061494a565b600e55565b336116a46111ef565b6001600160a01b0316146116ca5760405162461bcd60e51b81526004016105ce9061494a565b6001600160a01b03811661172f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ce565b610d1581611c1d565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061178a82610fd0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060005b600e548110156117fa576117dc81611ec0565b6117e690836149d0565b9150806117f281614a93565b9150506117c9565b50919050565b6000600f546010546118129190614a1b565b61181d9060016149d0565b905090565b600061182d82610fd0565b905061183a600083611755565b6001600160a01b0381166000908152600360205260408120805460019290611863908490614a1b565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b03841690600080516020614bf9833981519152908390a45050565b6060816118cf5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118f957806118e381614a93565b91506118f29050600a836149e8565b91506118d3565b6000816001600160401b0381111561191357611913614b04565b6040519080825280601f01601f19166020018201604052801561193d576020820181803683370190505b5090505b84156119a857611952600183614a1b565b915061195f600a86614aae565b61196a9060306149d0565b60f81b81838151811061197f5761197f614aee565b60200101906001600160f81b031916908160001a9053506119a1600a866149e8565b9450611941565b949350505050565b60006119bb82611738565b611a1c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105ce565b6000611a2783610fd0565b9050806001600160a01b0316846001600160a01b03161480611a4e5750611a4e8185611639565b806119a85750836001600160a01b0316611a6784610566565b6001600160a01b031614949350505050565b826001600160a01b0316611a8c82610fd0565b6001600160a01b031614611af05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105ce565b6001600160a01b038216611b525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105ce565b611b5d600082611755565b6001600160a01b0383166000908152600360205260408120805460019290611b86908490614a1b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bb49084906149d0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020614bf983398151915291a4505050565b610fcc828260405180602001604052806000815250611f55565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ccd5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016105ce565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d45848484611a79565b611d5184848484611f88565b61128c5760405162461bcd60e51b81526004016105ce906148f8565b6060815160001415611d8d57505060408051602081019091526000815290565b6000604051806060016040528060408152602001614b636040913990506000600384516002611dbc91906149d0565b611dc691906149e8565b611dd19060046149fc565b6001600160401b03811115611de857611de8614b04565b6040519080825280601f01601f191660200182016040528015611e12576020820181803683370190505b509050600182016020820185865187015b80821015611e7e576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611e23565b5050600386510660018114611e9a5760028114611ead57611eb5565b603d6001830353603d6002830353611eb5565b603d60018303535b509195945050505050565b6000818152600d6020526040808220548151633fabe5a360e21b8152915183926001600160a01b039092169163feaf968c9160048083019260a0929190829003018186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f49919061246b565b50919695505050505050565b611f5f8383612095565b611f6c6000848484611f88565b6106ff5760405162461bcd60e51b81526004016105ce906148f8565b60006001600160a01b0384163b1561208a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fcc9033908990889088906004016148b2565b602060405180830381600087803b158015611fe657600080fd5b505af1925050508015612016575060408051601f3d908101601f19168201909252612013918101906123f0565b60015b612070573d808015612044576040519150601f19603f3d011682016040523d82523d6000602084013e612049565b606091505b5080516120685760405162461bcd60e51b81526004016105ce906148f8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119a8565b506001949350505050565b6001600160a01b0382166120eb5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105ce565b6120f481611738565b156121405760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016105ce565b6001600160a01b03821660009081526003602052604081208054600192906121699084906149d0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020614bf9833981519152908290a45050565b80356001600160a01b03811681146121cc57600080fd5b919050565b803580151581146121cc57600080fd5b80516001600160501b03811681146121cc57600080fd5b60006020828403121561220a57600080fd5b612213826121b5565b9392505050565b6000806040838503121561222d57600080fd5b612236836121b5565b9150612244602084016121b5565b90509250929050565b60008060006060848603121561226257600080fd5b61226b846121b5565b9250612279602085016121b5565b9150604084013590509250925092565b6000806000806080858703121561229f57600080fd5b6122a8856121b5565b93506122b6602086016121b5565b92506040850135915060608501356001600160401b03808211156122d957600080fd5b818701915087601f8301126122ed57600080fd5b8135818111156122ff576122ff614b04565b604051601f8201601f19908116603f0116810190838211818310171561232757612327614b04565b816040528281528a602084870101111561234057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561237757600080fd5b612380836121b5565b9150612244602084016121d1565b600080604083850312156123a157600080fd5b6123aa836121b5565b946020939093013593505050565b6000602082840312156123ca57600080fd5b612213826121d1565b6000602082840312156123e557600080fd5b813561221381614b1a565b60006020828403121561240257600080fd5b815161221381614b1a565b60006020828403121561241f57600080fd5b5035919050565b6000806040838503121561243957600080fd5b82359150612244602084016121b5565b6000806040838503121561245c57600080fd5b50508035926020909101359150565b600080600080600060a0868803121561248357600080fd5b61248c866121e1565b94506020860151935060408601519250606086015191506124af608087016121e1565b90509295509295909350565b600081518084526124d3816020860160208601614a32565b601f01601f19169290920160200192915050565b600081516124f9818560208601614a32565b9290920192915050565b6d3c70617468207374726f6b653d2760901b8152600e0190565b7f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323081527f30302f737667272076696577426f783d2730203020313030203130302720736860208201527a30b83296b932b73232b934b7339e93b1b934b9b822b233b2b9939f60291b6040820152605b0190565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224e81527030ba3ab932911610113b30b63ab2911d1160791b602082015260310190565b60609190911b6001600160601b031916815260140190565b600083516125fd818460208801614a32565b835190830190612611818360208801614a32565b01949350505050565b757b226e616d65223a202242616279206f74746572202360501b8152855160009061264c816016850160208b01614a32565b7f22202c20226465736372697074696f6e223a20224920616d206f6e65206f66206016918401918201526303a3432960e51b6036820152865161269681603a840160208b01614a32565b86519101906126ac81603a840160208a01614a32565b711116101134b6b0b3b2afb230ba30911d101160711b603a929091019182015284516126df81604c840160208901614a32565b6126ed604c82840101612590565b9150508351612700818360208801614a32565b63227d5d7d60e01b9101908152600401979650505050505050565b630e4cec4560e31b81526000845161273a816004850160208901614a32565b8083019050600b60fa1b806004830152855161275d816005850160208a01614a32565b60059201918201528351612778816006840160208801614a32565b602960f81b6006929091019182015260070195945050505050565b7f2720643d274d343620323768376d2d3920316831326d2d313420316831366d2d81527f3137203168396d31203068386d2d313920316832306d2d3235203168336d312060208201527f306832326d31203068336d2d3331203168336d3220306832326d32203068336d60408201527f2d3333203168326d33203068336d35203068386d35203068336d33203068326d60608201527f2d3334203168316d34203068316d38203068366d37203068326d34203068316d60808201527f2d3334203168326d32203068326d38203068366d38203068326d32203068326d60a08201527f2d3332203168316d31203068326d38203068366d38203068326d31203068326d60c08201527f2d3331203168316d31203068326d38203068366d38203068326d31203068316d60e08201527f2d3238203168326d38203068366d38203068326d2d3236203168326d382030686101008201527f366d38203068326d2d3236203168336d36203068386d36203068336d2d3236206101208201527f3168346d3420306831306d34203068316d31203068326d2d323620316831316d6101408201527f32203068316d3120306831316d2d323620316831316d3420306831316d2d32356101608201527f203168356d3134203068346d2d3233203168326d3230203068326d2d313920386101808201527f68316d2d31203168356d37203068316d2d3134203168366d37203068326d2d316101a08201527f35203168336d31203068326d38203068316d2d3136203168346d31203068326d6101c08201527f38203068326d2d3137203168346d31203068326d39203068316d2d31372031686101e08201527f346d31203068326d37203068346d2d3139203168356d31203068356d332030686102008201527f316d32203068316d2d3138203168356d31203068336d37203068316d2d3138206102208201527f3168366d32203068336d2d3131203168376d2d37203168386d2d38203168386d6102408201527f3130203068316d2d3139203168396d39203068316d2d3139203168396d3920306102608201527f68316d2d3139203168386d39203068326d2d3139203168386d2d37203168356d6102808201527f3130203068326d2d3136203168376d37203068326d2d3139203168326d3220306102a08201527f68326d31203068316d38203068326d32203068316d2d3232203168346d3320306102c08201527f68346d37203068336d2d3231203168346d2d35203168346d2d36203168356d2d6102e08201527f3139203168376d34203068376d2d3136203168376d31203068376d2d313220316103008201527f6831306d2d36203168346d32302d353468316d3620313568316d2d31322031686103208201527f316d3131203268316d2d3620323568316d2d3133203368316d352d343368316d6103408201527f2d3132203568314d323920373968316d342d343268316d3139203335683127206103608201526f2f3e3c70617468207374726f6b653d2760801b610380820152600061353c612f5f612f59612d98612d92612d36612d30612c0b6103908a018e6124e7565b7f2720643d274d343220333568336d3130203068336d2d3137203168316d31203081527f68336d38203068356d2d3139203168356d3130203068356d2d3230203168346d60208201527f3132203068346d2d3230203168336d3134203068336d2d3139203168316d313560408201527f203068326d2d3137203168316d3133203068326d2d31362d3568316d2d31203460608201527f68316d30203168316d312d3468316d38203068316d2d3131203168326d38203060808201527f68326d2d3133203168316d3132203068316d2d3134203168316d31322030683160a08201527f6d2d31332d3168326d38203068326d2d3132203168316d31302030683127202f60c08201526e3e3c70617468207374726f6b653d2760881b60e082015260ef0190565b8b6124e7565b7f2720643d274d343320333768316d3132203068316d2d3135203168336d31302081527f3068336d2d3135203168316d31322030683127202f3e3c70617468207374726f6020820152636b653d2760e01b604082015260440190565b886124e7565b7f2720643d274d343320343568316d32203068336d32203068366d2d313720316881527f366d31203068326d32203068326d31203068366d2d3232203168386d3820306860208201527f386d2d323320316832326d2d3231203168346d3120306831356d2d323020316860408201527f336d3120306831366d2d313920316831386d2d313620316831346d2d3132203160608201527f6831306d2d37203268316d31203068356d2d37203168376d2d37203168386d2d60808201527f38203168386d2d38203168356d2d31203168316d2d31203168316d2d3120316860a08201527f316d2d32203168336d2d33203168356d2d38203168386d2d37203168376d2d3760c08201527f203168376d2d37203168366d2d36203168366d2d37203168366d2d352031683460e08201527f6d2d392d323668316d30203068316d3320313068316d2d362d3668316d2d32206101008201527f3168316d39203968316d30203468314d333520333468326d3236203068326d2d6101208201527f3331203168326d3238203068326d2d3331203168316d32382030683127202f3e6101408201526d3c70617468207374726f6b653d2760901b61016082015261016e0190565b856124e7565b7f27203e3c616e696d6174652069643d27776b27206174747269627574654e616d81527f653d276427206475723d27302e323573272076616c7565733d274d353520333560208201527f68316d2d3134203068336d3131203068323b4d353520333568316d2d3134203060408201527f68336d313120306832204d343120333668316d31203068336d38203068346d2d60608201527f3136203068316d3135203068313b4d353520333568316d2d3134203068336d3160808201527f3120306832204d343120333668316d31203068336d38203068346d2d3136203060a08201527f68316d313520306831204d343020333768366d38203068363b204d353520333560c082015260007f68316d2d3134203068336d313120306832204d343120333668316d31203068338060e08401527f6d38203068346d2d3136203068316d313520306831204d343020333768366d38806101008501527f20306836204d343020333868326d31203068336d38203068326d31203068336d806101208601527f2d3138203068316d3133203068313b4d353520333568316d2d3134203068336d6101408601527f313120306832204d343120333668316d31203068336d38203068346d2d3136206101608601527f3068316d313520306831204d343020333768366d3820306836204d34302033386101808601527f68326d31203068336d38203068326d31203068336d2d3138203068316d3133206101a08601527f306831204d343020333968366d38203068363b204d353520333568316d2d31346101c08601527f203068336d313120306832204d343120333668316d31203068336d38203068346101e08601527f6d2d3136203068316d313520306831204d343020333768366d3820306836204d6102008601527f343020333868326d31203068336d38203068326d31203068336d2d31382030686102208601527f316d313320306831204d343020333968366d3820306836204d343120343068336102408601527f6d3131203068346d2d3135203068313b204d353520333568316d2d31342030686102608601527f336d313120306832204d343120333668316d31203068336d38203068346d2d316102808601527f36203068316d313520306831204d343020333768366d3820306836204d3430206102a08601527f333868326d31203068336d38203068326d31203068336d2d3138203068316d316102c08601527f3320306831204d343020333968366d3820306836204d343120343068336d31316102e08601527f203068346d2d313520306831204d343220343168324d353620343168323b4d356103008601527f3520333568316d2d3134203068336d313120306832204d343120333668316d31806103208701527f203068336d38203068346d2d3136203068316d313520306831204d3430203337806103408801527f68366d3820306836204d343020333868326d31203068336d38203068326d3120806103608901527f3068336d2d3138203068316d313320306831204d343020333968366d382030686103808901527f36204d343120343068336d3131203068346d2d3135203068313b4d35352033356103a0890152856103c0890152846103e0890152836104008901527f2d3138203068316d313320306831204d343020333968366d38203068363b4d3561042089015282610440890152816104608901528061048089015250507f3068336d2d3138203068316d3133203068313b4d353520333568316d2d3134206104a08701527f3068336d313120306832204d343120333668316d31203068336d38203068346d6104c08701527f2d3136203068316d313520306831204d343020333768366d38203068363b4d356104e087015280610500870152505050507f203068336d38203068346d2d3136203068316d3135203068313b4d35352033356105208301527f68316d2d3134203068336d313120306832272020626567696e3d2734733b776b610540830152761732b732159a3993979f1e17b830ba341f1e17b9bb339f60491b61056083015261057782019050919050565b9695505050505050565b60006135518261251d565b7f3c70617468207374726f6b653d27233030302720643d274d343520323668313081527f6d2d3132203168336d38203068336d2d3135203168326d3132203068326d2d3160208201527f37203168326d3134203068326d2d3232203168356d3137203068346d2d32362060408201527f3168316d32203068316d3138203068316d32203068316d2d3237203168326d3160608201527f203068326d3138203068326d31203068326d2d3238203168326d31203068316d60808201527f3220306831316d31203068346d32203068316d31203068326d2d32372031683360a08201527f6d31203068326d3134203068326d31203068336d2d3234203168336d3520306860c08201527f376d34203068336d2d3232203168326d33203068346d35203068346d3220306860e08201527f326d2d3232203168316d33203068326d3131203068326d32203068316d2d32326101008201527f203168316d32203068326d3133203068326d31203068316d2d3233203168326d6101208201527f31203068326d3135203068346d2d3234203168326d31203068316d32203068316101408201527f6d33203068316d32203068316d33203068316d33203068336d2d3233203168316101608201527f6d31203068316d32203068326d31203068326d32203068356d33203068326d2d6101808201527f3232203168336d3137203068326d2d3231203168326d3135203068346d2d32326101a08201527f203168366d3131203068326d31203068326d2d3233203168326d34203068346d6101c08201527f37203068326d33203068326d2d3234203168316d38203068336d31203068356d6101e08201527f35203068316d2d3234203168316d3130203068336d33203068326d34203068316102008201527f6d2d3234203168316d3132203068326d38203068316d2d3234203168316d31336102208201527f203068326d33203068316d33203068316d2d3234203168316d3134203068326d6102408201527f33203068316d32203068316d2d3234203168316d3136203068316d35203068316102608201527f6d2d3234203168316d3137203068316d34203068316d2d3234203168316d31386102808201527f203068316d33203068316d2d3234203168326d3138203068346d2d32332031686102a08201527f326d3139203068316d2d3232203168336d3138203068316d2d3232203168316d6102c08201527f31203068326d3137203068316d2d3232203168316d32203068326d31362030686102e08201527f316d2d3232203168316d33203068326d3135203068316d2d3137203168336d316103008201527f32203068316d2d3231203168326d35203068326d3131203068316d2d323020316103208201527f68326d35203068336d38203068326d2d3139203168326d36203068336d3420306103408201527f68336d2d3137203168336d36203068326d33203068326d2d3136203168316d316103608201527f203068326d3131203068316d2d3136203168316d3134203068316d2d313620316103808201527f68326d3132203068326d2d3135203168316d3132203068316d2d3134203168326103a08201527f6d3130203068326d2d3133203168326d38203068326d2d3131203168336d35206103c08201527f3068326d2d38203168336d31203068336d2d35203168336d362d343368314d346103e08201527f3620343168316d2d3820313968316d3230203068316d2d382d323768316d32206104008201526c189ab418b6981019341893979f60991b6104208201527f3c70617468207374726f6b653d27236561656161612720643d274d343620323761042d8201527f68386d2d313020316831326d2d313320316831346d2d313520316831366d2d3261044d8201527f30203168326d31203068366d3120306831316d31203068326d2d32342031683161046d8201527f6d3220306831386d32203068316d2d3234203168316d31203068326d3136203061048d8201527f68326d31203068316d2d3232203168316d3220306831346d32203068316d2d316104ad8201527f38203168356d37203068346d2d3137203168336d3133203068326d2d313920316104cd8201527f68336d3135203068326d2d3230203168326d3137203068316d2d3230203268316104ed8201527f6d2d31203168316d3137203368316d2d3139203168346d3133203068336d2d3261050d8201527f31203168386d39203068356d2d323220316831306d33203068336d322030683361052d8201527f6d2d3231203168396d31203068326d32203068326d32203068346d2d3232203161054d8201527f6831336d32203068336d31203068336d2d3232203168376d31203068366d322061056d8201527f3068326d32203068326d2d323220316831316d31203068346d31203068356d2d61058d8201527f323220316831376d31203068346d2d323220316831386d31203068336d2d32316105ad8201527f203168346d3120306831336d2d3137203168366d3120306831306d31203068316105cd8201527f6d2d313820316831386d2d3230203168316d3220306831326d31203068346d2d6105ed8201527f3230203168326d32203068336d3120306831326d2d3230203168336d3220306861060d8201527f31356d2d3230203168346d3320306831326d2d3138203168356d32203068313161062d8201527f6d2d3137203168356d33203068316d31203068366d2d3135203168366d33203061064d8201527f68346d2d3131203168366d32203068336d2d3133203168316d3220306831316d61066d8201527f2d313420316831346d2d313320316831326d2d313220316831326d2d3131203161068d8201527f6831306d2d38203168376d2d36203168356d2d33203168316d2d342d343168316106ad8201527f6d2d38203868316d37203968316d36203068316d2d39203768316d31302030686106cd8201527f316d312d3868316d2d3135203368316d33203168316d2d37203368316d3130206106ed8201527919b418b6969c9018b418b699901a3418b6969b101c341893979f60311b61070d8201526119a8613f3e613e25613e1f6107278501612503565b876124e7565b7f2720643d274d343820333668356d2d38203168346d31203068316d312030683481527f6d2d3132203168356d31203068316d31203068356d2d3134203168386d31203060208201527f68366d2d3136203168326d31203068336d31203068326d31203068336d31203060408201527f68336d2d3137203168326d35203068326d35203068326d2d3136203168396d3160608201527f203068376d2d313720316831356d2d313220316831316d2d38203168346d312060808201527f3068326d2d35203168316d2d322d3968316d2d31203168316d312d3168316d2d60a08201527f31203168316d2d31203168316d36203268316d2d37203468316d2d322d33683160c08201526213979f60e91b60e082015260e30190565b651e17b9bb339f60d11b815260060190565b6000613f5b8261251d565b7f3c7265637420783d27302720793d2730272077696474683d2731303027206865815270696768743d27313030272066696c6c3d2760781b60208201528451613fab816031840160208901614a32565b6213979f60e91b603192909101918201527f3c70617468207374726f6b653d27233030302720643d274d343120313868356d60348201527f38203068356d2d3139203168326d3120306831376d2d3139203168356d33203060548201527f68326d33203068356d2d3130203168326d2d32203168326d2d32203168326d2d60748201527f34203168366d2d35203168346d2d3720316831306d2d3132203168336d39203060948201527f68326d2d3136203168336d3132203068336d2d3139203168326d31362030683260b48201527f6d2d3231203168326d3138203068326d2d3237203168366d3230203068336d3160d48201527f203068326d2d3333203168326d33203068316d3232203068316d33203068326d60f48201527f2d3334203168316d33203068326d3232203068326d33203068326d2d333620316101148201527f68316d34203068316d33203068356d38203068356d33203068316d34203068316101348201527f6d2d3336203168316d33203068326d32203068326d33203068326d36203068326101548201527f6d33203068326d32203068326d33203068316d2d3336203168316d33203068316101748201527f6d32203068326d35203068316d36203068316d35203068326d32203068316d2d6101948201527f3332203168326d32203068316d32203068316d36203068316d36203068316d366101b48201527f203068316d32203068316d32203068326d2d3335203168326d31203068316d326101d48201527f203068316d36203068316d36203068316d36203068316d32203068316d3120306101f48201527f68316d2d3332203168316d31203068316d32203068316d36203068316d3620306102148201527f68316d36203068316d32203068336d2d3330203168316d32203068326d3420306102348201527f68326d36203068326d34203068326d32203068316d2d3238203168316d3320306102548201527f68326d32203068326d38203068326d32203068326d33203068316d2d323820316102748201527f68316d34203068316d31203068326d3130203068346d34203068316d2d3136206102948201527f3168316d32203068316d3131203068316d2d3238203168316d3131203068346d6102b48201527f3131203068316d2d3238203168326d3131203068326d3132203068316d2d32376102d48201527f203168316d38203068316d32203068326d32203068316d38203068316d2d32366102f48201527f203168316d38203068386d38203068316d2d3236203168326d3232203068326d6103148201527f2d3235203168326d3230203068326d2d3233203168316d3230203068316d2d326103348201527f32203168326d3138203068326d2d3231203168336d3134203068336d2d3138206103548201527f3168336d3130203068336d2d3136203168316d3120306831336d2d31362031686103748201527f326d3133203068326d2d3137203168316d3135203068316d2d3138203168326d6103948201527f33203068316d3131203068326d2d3139203168316d34203068316d31322030686103b48201527f316d2d3139203168316d34203068316d38203068336d31203068326d2d3231206103d48201527f3168326d34203068316d32203068346d32203068316d34203068316d2d3231206103f48201527f3168316d35203068316d35203068316d31203068316d31203068326d312030686104148201527f326d2d3231203168316d35203068316d33203068336d31203068336d312030686104348201527f326d2d3231203168316d36203068326d33203068316d34203068336d2d3230206104548201527f3168316d37203068356d35203068316d2d3139203168316d38203068316d38206104748201527f3068336d2d3231203168316d38203068326d39203068316d2d3231203168316d6104948201527f39203068316d37203068316d31203068316d2d3231203168316d39203068316d6104b48201527f36203068326d31203068316d2d3231203168316d38203068326d36203068316d6104d48201527f32203068316d2d3231203168316d38203068316d36203068326d31203068326d6104f48201527f2d3231203168326d35203068346d34203068326d32203068316d2d32312031686105148201527f346d38203068356d33203068336d2d3234203168326d32203068326d342030686105348201527f326d35203068316d32203068326d31203068316d2d3234203168316d342030686105548201527f336d34203068316d34203068326d33203068326d2d3235203168326d342030686105748201527f316d31203068366d35203068356d2d3236203168336d34203068326d2d3234206105948201527f316831306d32203068346d35203068326d2d3233203168326d37203068326d316105b48201527f203068316d37203068326d2d3231203168336d3135203068316d2d31372031686105d48201527f346d3130203068336d2d3134203168356d34203068336d2d38203168366d382d6105f48201527f363368314d333220333368316d3334203368316d2d36203968314d35332036306106148201527f68316d32203668316d2d39203668316d2d31203168316d2d3230203568316d386106348201527f203168316d31352d353268316d38203468314d333620343368316d2d322d34686106548201527318b699981698b418b696991a901a34189390179f60611b610674820152614781612f596106888301612503565b95945050505050565b7f7b226e616d65223a2022536c656570696e672062616279206f747465722023008152600084516147c281601f850160208901614a32565b7f22202c20226465736372697074696f6e223a20227a7a7a7a2e2e2e2e2e7a7a7a601f918401918201527f7a2e2e2e2e2e7a7a7a7a2e2e2e2e2e7a7a7a7a222c2022696d6167655f646174603f8201526430911d101160d91b605f8201528451614833816064840160208901614a32565b614841606482840101612590565b9150508351614854818360208801614a32565b63227d5d7d60e01b910190815260040195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516148a581601d850160208701614a32565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061353c908301846124bb565b60208152600061221360208301846124bb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156149e3576149e3614ac2565b500190565b6000826149f7576149f7614ad8565b500490565b6000816000190483118215151615614a1657614a16614ac2565b500290565b600082821015614a2d57614a2d614ac2565b500390565b60005b83811015614a4d578181015183820152602001614a35565b8381111561128c5750506000910152565b600181811c90821680614a7257607f821691505b602082108114156117fa57634e487b7160e01b600052602260045260246000fd5b6000600019821415614aa757614aa7614ac2565b5060010190565b600082614abd57614abd614ad8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d1557600080fdfe3230343820626162696573206f74746572732e20576861742069732074686973207468696e67206f6e206d7920686561643f4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f20626162696573206f74746572732072656d61696e696e672e205765207765726520323034382e2e2e204e6576657220746f7563682074686973207468696e67206f6e206d7920686561642c20706c656173652e2e2eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122007c782cf3b4ef822204f8c2d18bb79dd05143582c9c1ed4034eef964521d6f7464736f6c63430008070033

Deployed Bytecode Sourcemap

43982:23095:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30248:305;;;;;;;;;;-1:-1:-1;30248:305:0;;;;;:::i;:::-;;:::i;:::-;;;31148:14:1;;31141:22;31123:41;;31111:2;31096:18;30248:305:0;;;;;;;;31193:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32753:221::-;;;;;;;;;;-1:-1:-1;32753:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;30156:32:1;;;30138:51;;30126:2;30111:18;32753:221:0;29992:203:1;32276:411:0;;;;;;;;;;-1:-1:-1;32276:411:0;;;;;:::i;:::-;;:::i;:::-;;63674:2180;;;;;;;;;;;;;:::i;46840:6488::-;;;;;;;;;;-1:-1:-1;46840:6488:0;;;;;:::i;:::-;;:::i;62789:664::-;;;;;;;;;;-1:-1:-1;62789:664:0;;;;;:::i;:::-;;:::i;33503:339::-;;;;;;;;;;-1:-1:-1;33503:339:0;;;;;:::i;:::-;;:::i;61530:534::-;;;;;;;;;;;;;:::i;65973:139::-;;;;;;;;;;-1:-1:-1;65973:139:0;;;;;:::i;:::-;;:::i;62588:193::-;;;:::i;33913:185::-;;;;;;;;;;-1:-1:-1;33913:185:0;;;;;:::i;:::-;;:::i;45360:1395::-;;;:::i;30887:239::-;;;;;;;;;;-1:-1:-1;30887:239:0;;;;;:::i;:::-;;:::i;62463:117::-;;;;;;;;;;;;;:::i;:::-;;;40607:25:1;;;40595:2;40580:18;62463:117:0;40461:177:1;62138:317:0;;;;;;:::i;:::-;;:::i;30617:208::-;;;;;;;;;;-1:-1:-1;30617:208:0;;;;;:::i;:::-;;:::i;10831:103::-;;;;;;;;;;;;;:::i;10180:87::-;;;;;;;;;;;;;:::i;31362:104::-;;;;;;;;;;;;;:::i;33046:155::-;;;;;;;;;;-1:-1:-1;33046:155:0;;;;;:::i;:::-;;:::i;61350:99::-;;;;;;;;;;-1:-1:-1;61350:99:0;;;;;:::i;:::-;;:::i;34169:328::-;;;;;;;;;;-1:-1:-1;34169:328:0;;;;;:::i;:::-;;:::i;53336:7939::-;;;;;;;;;;-1:-1:-1;53336:7939:0;;;;;:::i;:::-;;:::i;63461:28::-;;;;;;;;;;;;;;;;33272:164;;;;;;;;;;-1:-1:-1;33272:164:0;;;;;:::i;:::-;;:::i;66120:102::-;;;;;;;;;;-1:-1:-1;66120:102:0;;;;;:::i;:::-;;:::i;11089:201::-;;;;;;;;;;-1:-1:-1;11089:201:0;;;;;:::i;:::-;;:::i;30248:305::-;30350:4;-1:-1:-1;;;;;;30387:40:0;;-1:-1:-1;;;30387:40:0;;:105;;-1:-1:-1;;;;;;;30444:48:0;;-1:-1:-1;;;30444:48:0;30387:105;:158;;;-1:-1:-1;;;;;;;;;;23096:40:0;;;30509:36;30367:178;30248:305;-1:-1:-1;;30248:305:0:o;31193:100::-;31247:13;31280:5;31273:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31193:100;:::o;32753:221::-;32829:7;32857:16;32865:7;32857;:16::i;:::-;32849:73;;;;-1:-1:-1;;;32849:73:0;;37956:2:1;32849:73:0;;;37938:21:1;37995:2;37975:18;;;37968:30;38034:34;38014:18;;;38007:62;-1:-1:-1;;;38085:18:1;;;38078:42;38137:19;;32849:73:0;;;;;;;;;-1:-1:-1;32942:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32942:24:0;;32753:221::o;32276:411::-;32357:13;32373:23;32388:7;32373:14;:23::i;:::-;32357:39;;32421:5;-1:-1:-1;;;;;32415:11:0;:2;-1:-1:-1;;;;;32415:11:0;;;32407:57;;;;-1:-1:-1;;;32407:57:0;;39486:2:1;32407:57:0;;;39468:21:1;39525:2;39505:18;;;39498:30;39564:34;39544:18;;;39537:62;-1:-1:-1;;;39615:18:1;;;39608:31;39656:19;;32407:57:0;39284:397:1;32407:57:0;8984:10;-1:-1:-1;;;;;32499:21:0;;;;:62;;-1:-1:-1;32524:37:0;32541:5;8984:10;33272:164;:::i;32524:37::-;32477:168;;;;-1:-1:-1;;;32477:168:0;;35990:2:1;32477:168:0;;;35972:21:1;36029:2;36009:18;;;36002:30;36068:34;36048:18;;;36041:62;-1:-1:-1;;;36119:18:1;;;36112:54;36183:19;;32477:168:0;35788:420:1;32477:168:0;32658:21;32667:2;32671:7;32658:8;:21::i;:::-;32346:341;32276:411;;:::o;63674:2180::-;64449:8;;;;;;;64441:49;;;;-1:-1:-1;;;64441:49:0;;39888:2:1;64441:49:0;;;39870:21:1;39927:2;39907:18;;;39900:30;-1:-1:-1;;;39946:18:1;;;39939:58;40014:18;;64441:49:0;39686:352:1;64441:49:0;64533:1;64509:21;64519:10;64509:9;:21::i;:::-;:25;64501:67;;;;-1:-1:-1;;;64501:67:0;;34867:2:1;64501:67:0;;;34849:21:1;34906:2;34886:18;;;34879:30;34945:31;34925:18;;;34918:59;34994:18;;64501:67:0;34665:353:1;64501:67:0;64600:15;64587:9;;:28;;64579:52;;;;-1:-1:-1;;;64579:52:0;;38369:2:1;64579:52:0;;;38351:21:1;38408:2;38388:18;;;38381:30;-1:-1:-1;;;38427:18:1;;;38420:41;38478:18;;64579:52:0;38167:335:1;64579:52:0;64642:12;65268:13;:11;:13::i;:::-;65222:16;65237:1;65222:12;:16;:::i;:::-;65212:27;65204:36;;65164:12;65119:15;65072:10;65055:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;65045:39;;;;;;65037:48;;65036:99;;;;:::i;:::-;64993:14;64948:15;64900:14;64883:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;64873:43;;;;;;64865:52;;64834:130;;;;:::i;:::-;64746:59;64789:16;64746:15;:59;:::i;:::-;:219;;;;:::i;:::-;:261;;;;:::i;:::-;:390;;;;:::i;:::-;:430;;;;:::i;:::-;:494;;;;:::i;:::-;:535;;;;:::i;:::-;64707:593;;;;;;29934:19:1;;29978:2;29969:12;;29805:182;64707:593:0;;;;-1:-1:-1;;64707:593:0;;;;;;;;;64679:636;;64707:593;64679:636;;;;;-1:-1:-1;65341:8:0;65348:1;64679:636;65341:8;:::i;:::-;65337:463;;65406:3;;65371:177;65466:1;65443:20;:18;:20::i;:::-;:24;;;;:::i;:::-;65439:1;65433:3;;:7;;;;:::i;:::-;:34;;;;:::i;:::-;65428:1;:39;65371:177;;65524:8;65530:1;65524:5;:8::i;:::-;65486:3;;;;:::i;:::-;;;;65371:177;;;;65597:1;65574:20;:18;:20::i;:::-;:24;;;;:::i;:::-;65568:3;;:30;;;;:::i;:::-;65562:3;:36;65337:463;;;65636:9;65677:1;65654:20;:18;:20::i;:::-;:24;;;;:::i;:::-;65648:3;;:30;;;;:::i;:::-;65636:42;;65631:107;65685:3;;65680:1;:8;65631:107;;65714:8;65720:1;65714:5;:8::i;:::-;65690:3;;;;:::i;:::-;;;;65631:107;;;;65787:1;65764:20;:18;:20::i;:::-;:24;;;;:::i;:::-;65758:3;;:30;;;;:::i;:::-;65752:3;:36;65337:463;65822:24;:15;65840:6;65822:24;:::i;:::-;65810:9;:36;-1:-1:-1;63674:2180:0:o;46840:6488::-;46930:13;46961:17;47311:18;47322:1;47325:3;47311:10;:18::i;:::-;49743:27;49754:10;49766:3;49743:10;:27::i;:::-;47070:2723;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50800:36;50811:19;50832:3;50800:10;:36::i;:::-;51131:45;-1:-1:-1;;;51172:3:0;51131:10;:45::i;:::-;51300:54;-1:-1:-1;;;51350:3:0;51300:10;:54::i;:::-;51776:27;51787:10;51799:3;51776:10;:27::i;:::-;49816:3438;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;49816:3438:0;;;;;;;;;;47035:6238;;;49816:3438;47035:6238;;:::i;:::-;;;;-1:-1:-1;;47035:6238:0;;;;;;;;;;46840:6488;-1:-1:-1;;;46840:6488:0:o;62789:664::-;62892:12;62922:10;62935:18;62949:4;62935:11;:18;:::i;:::-;62922:31;-1:-1:-1;62964:9:0;62990:3;62977:9;62982:4;62922:31;62977:9;:::i;:::-;62976:17;;;;:::i;:::-;62964:29;-1:-1:-1;63004:10:0;63032:11;:4;63039;63032:11;:::i;:::-;63017:27;;:11;:27;:::i;:::-;63004:40;-1:-1:-1;63055:9:0;63081:3;63068:9;63073:4;63004:40;63068:9;:::i;:::-;63067:17;;;;:::i;:::-;63055:29;-1:-1:-1;63095:10:0;63123:14;:4;63130:7;63123:14;:::i;:::-;63108:30;;:11;:30;:::i;:::-;63095:43;-1:-1:-1;63149:9:0;63175:3;63162:9;63167:4;63095:43;63162:9;:::i;:::-;63161:17;;;;:::i;:::-;63149:29;;63269:19;63286:1;63269:16;:19::i;:::-;63329;63346:1;63329:16;:19::i;:::-;63389;63406:1;63389:16;:19::i;:::-;63209:236;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63189:256;;;;;;;;62789:664;;;;:::o;33503:339::-;33698:41;8984:10;33731:7;33698:18;:41::i;:::-;33690:103;;;;-1:-1:-1;;;33690:103:0;;;;;;;:::i;:::-;33806:28;33816:4;33822:2;33826:7;33806:9;:28::i;61530:534::-;8984:10;10400:7;:5;:7::i;:::-;-1:-1:-1;;;;;10400:23:0;;10392:68;;;;-1:-1:-1;;;10392:68:0;;;;;;;:::i;:::-;61578:8:::1;:15:::0;;-1:-1:-1;;61578:15:0::1;;;::::0;;62032:24:::1;:15;62050:6;62032:24;:::i;:::-;62020:9;:36:::0;61530:534::o;65973:139::-;8984:10;10400:7;:5;:7::i;:::-;-1:-1:-1;;;;;10400:23:0;;10392:68;;;;-1:-1:-1;;;10392:68:0;;;;;;;:::i;:::-;66055:15:::1;::::0;;;:9:::1;:15;::::0;;;;;:49;;-1:-1:-1;;;;;;66055:49:0::1;-1:-1:-1::0;;;;;66055:49:0;;::::1;::::0;;;::::1;::::0;;65973:139::o;62588:193::-;8984:10;10400:7;:5;:7::i;:::-;-1:-1:-1;;;;;10400:23:0;;10392:68;;;;-1:-1:-1;;;10392:68:0;;;;;;;:::i;:::-;62647:12:::1;62673:10;62711:20;:18;:20::i;:::-;62665:81;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62646:100;;;62765:7;62757:16;;;::::0;::::1;;62635:146;62588:193::o:0;33913:185::-;34051:39;34068:4;34074:2;34078:7;34051:39;;;;;;;;;;;;:16;:39::i;45360:1395::-;45427:13;;;;45426:14;45418:33;;;;-1:-1:-1;;;45418:33:0;;31845:2:1;45418:33:0;;;31827:21:1;31884:1;31864:18;;;31857:29;-1:-1:-1;;;31902:18:1;;;31895:36;31948:18;;45418:33:0;31643:329:1;45418:33:0;45496:4;45470:23;:13;1994:14;;1902:114;45470:23;:30;45462:54;;;;-1:-1:-1;;;45462:54:0;;33768:2:1;45462:54:0;;;33750:21:1;33807:2;33787:18;;;33780:30;-1:-1:-1;;;33826:18:1;;;33819:41;33877:18;;45462:54:0;33566:335:1;45462:54:0;45544:10;45536:19;;;;:7;:19;;;;;;;;45535:20;45527:56;;;;-1:-1:-1;;;45527:56:0;;35225:2:1;45527:56:0;;;35207:21:1;35264:2;35244:18;;;35237:30;-1:-1:-1;;;35283:18:1;;;35276:53;35346:18;;45527:56:0;35023:347:1;45527:56:0;45594:25;:13;2113:19;;2131:1;2113:19;;;2024:127;45594:25;45630:17;45650:23;:13;1994:14;;1902:114;45650:23;45630:43;;45684:32;45694:10;45706:9;45684;:32::i;:::-;45735:10;45727:19;;;;:7;:19;;;;;:26;;-1:-1:-1;;45727:26:0;45749:4;45727:26;;;;;;46344:16;;:12;:16;:::i;:::-;46334:27;46326:36;;46286:12;46241:15;46194:10;46177:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;46167:39;;;;;;46159:48;;46158:99;;;;:::i;:::-;46115:14;46070:15;46022:14;46005:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;45995:43;;;;;;45987:52;;45956:130;;;;:::i;:::-;45868:59;45911:16;45868:15;:59;:::i;:::-;:219;;;;:::i;:::-;:261;;;;:::i;:::-;:390;;;;:::i;:::-;:430;;;;:::i;:::-;:494;;;;:::i;:::-;45829:552;;;;;;29934:19:1;;29978:2;29969:12;;29805:182;45829:552:0;;;;-1:-1:-1;;45829:552:0;;;;;;;;;45801:595;;45829:552;45801:595;;;;;-1:-1:-1;46422:8:0;46429:1;45801:595;46422:8;:::i;:::-;46418:330;;46452:15;;;;:4;:15;;;;;;;;:22;;;;46489:12;:23;;;;:27;45360:1395::o;46418:330::-;46538:8;46545:1;46538:4;:8;:::i;:::-;46550:1;46538:13;46534:214;;;46621:10;46604:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;46604:28:0;;;;;;46594:39;;46604:28;46594:39;;;;46586:48;46568:15;;;:4;:15;;;;;:66;46649:12;:23;;;;;;46675:1;46649:27;;-1:-1:-1;45360:1395:0:o;46534:214::-;46709:23;;;;:12;:23;;;;;46735:1;46709:27;;46534:214;45407:1348;;45360:1395::o;30887:239::-;30959:7;30995:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30995:16:0;31030:19;31022:73;;;;-1:-1:-1;;;31022:73:0;;37185:2:1;31022:73:0;;;37167:21:1;37224:2;37204:18;;;37197:30;37263:34;37243:18;;;37236:62;-1:-1:-1;;;37314:18:1;;;37307:39;37363:19;;31022:73:0;36983:405:1;62463:117:0;62524:7;8984:10;10400:7;:5;:7::i;:::-;-1:-1:-1;;;;;10400:23:0;;10392:68;;;;-1:-1:-1;;;10392:68:0;;;;;;;:::i;:::-;-1:-1:-1;62551:21:0::1;62463:117:::0;:::o;62138:317::-;62266:10;62245:17;62253:8;62245:7;:17::i;:::-;-1:-1:-1;;;;;62245:31:0;;62223:111;;;;-1:-1:-1;;;62223:111:0;;36415:2:1;62223:111:0;;;36397:21:1;36454:2;36434:18;;;36427:30;36493:32;36473:18;;;36466:60;36543:18;;62223:111:0;36213:354:1;62223:111:0;62366:17;62353:9;:30;;62345:39;;;;;;62400:47;;;62426:10;30878:51:1;;30960:2;30945:18;;30938:34;;;62400:47:0;;30851:18:1;62400:47:0;;;;;;;62138:317;:::o;30617:208::-;30689:7;-1:-1:-1;;;;;30717:19:0;;30709:74;;;;-1:-1:-1;;;30709:74:0;;36774:2:1;30709:74:0;;;36756:21:1;36813:2;36793:18;;;36786:30;36852:34;36832:18;;;36825:62;-1:-1:-1;;;36903:18:1;;;36896:40;36953:19;;30709:74:0;36572:406:1;30709:74:0;-1:-1:-1;;;;;;30801:16:0;;;;;:9;:16;;;;;;;30617:208::o;10831:103::-;8984:10;10400:7;:5;:7::i;:::-;-1:-1:-1;;;;;10400:23:0;;10392:68;;;;-1:-1:-1;;;10392:68:0;;;;;;;:::i;:::-;10896:30:::1;10923:1;10896:18;:30::i;:::-;10831:103::o:0;10180:87::-;10253:6;;-1:-1:-1;;;;;10253:6:0;;10180:87::o;31362:104::-;31418:13;31451:7;31444:14;;;;;:::i;33046:155::-;33141:52;8984:10;33174:8;33184;33141:18;:52::i;61350:99::-;8984:10;10400:7;:5;:7::i;:::-;-1:-1:-1;;;;;10400:23:0;;10392:68;;;;-1:-1:-1;;;10392:68:0;;;;;;;:::i;:::-;61419:13:::1;:22:::0;;-1:-1:-1;;61419:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61350:99::o;34169:328::-;34344:41;8984:10;34377:7;34344:18;:41::i;:::-;34336:103;;;;-1:-1:-1;;;34336:103:0;;;;;;;:::i;:::-;34450:39;34464:4;34470:2;34474:7;34483:5;34450:13;:39::i;:::-;34169:328;;;;:::o;53336:7939::-;53441:13;53494:20;53502:11;53494:7;:20::i;:::-;53472:117;;;;-1:-1:-1;;;53472:117:0;;39070:2:1;53472:117:0;;;39052:21:1;39109:2;39089:18;;;39082:30;39148:34;39128:18;;;39121:62;-1:-1:-1;;;39199:18:1;;;39192:45;39254:19;;53472:117:0;38868:411:1;53472:117:0;53636:8;;53602:18;;53636:8;;;;;53631:7554;;53668:4385;53872:29;53889:11;53872:16;:29::i;:::-;56294:17;;;;:4;:17;;;;;;:867;;56598:563;56659:10;56929:20;56937:11;56929:7;:20::i;:::-;56850:158;;;;;;;;:::i;:::-;;;;;;;;;;;;;56782:281;;;;;;56720:394;;56598:10;:563::i;:::-;56294:867;;;56486:17;;;;:4;:17;;;;;;56364:186;;56425:10;;56364;:186::i;:::-;54119:3404;;;;;;;;:::i;:::-;;;;-1:-1:-1;;54119:3404:0;;;;;;;;;57702:25;;;;:12;54119:3404;57702:25;;;:30;:230;;57817:25;;;;:12;:25;;;;;;57846:1;57817:30;:115;;;;;;;;;;;;;;;-1:-1:-1;;;57817:115:0;;;57702:230;;57817:115;;;;;;;;;;;;;;-1:-1:-1;;;57817:115:0;;;57702:230;;;;;;;;;;;;;;;;-1:-1:-1;;;57702:230:0;;;;53761:4235;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53668:13;:4385::i;:::-;53661:4392;;53631:7554;;;58093:3080;58288:29;58305:11;58288:16;:29::i;:::-;58417:20;:18;:20::i;:::-;58441:4;58417:28;:734;;59113:38;59130:20;:18;:20::i;:::-;59113:16;:38::i;:::-;58417:734;;;;;;;;;;;;;;;;;;;;;59182:20;:18;:20::i;:::-;59206:4;59182:28;:780;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60044:17;;;;:4;:17;;;;;;:665;;60227:447;60474:20;60482:11;60474:7;:20::i;:::-;60403:142;;;;;;;;:::i;:::-;;;;;;;;;;;;;60343:249;;;;;;60289:346;;60227:19;:447::i;:::-;60044:665;;;60128:17;;;;:4;:17;;;;;;60108:38;;:19;:38::i;:::-;60822:25;;;;:12;:25;;;;;;:30;:230;;60937:25;;;;:12;:25;;;;;;60966:1;60937:30;:115;;;;;;;;;;;;;;;-1:-1:-1;;;60937:115:0;;;60822:230;;60937:115;;;;;;;;;;;;;;-1:-1:-1;;;60937:115:0;;;60822:230;;;;;;;;;;;;;;;;-1:-1:-1;;;60822:230:0;;;;58186:2930;;;;;;;;;;;;:::i;58093:3080::-;58086:3087;;53631:7554;61261:4;61211:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;61197:70;;;53336:7939;;;:::o;33272:164::-;-1:-1:-1;;;;;33393:25:0;;;33369:4;33393:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33272:164::o;66120:102::-;8984:10;10400:7;:5;:7::i;:::-;-1:-1:-1;;;;;10400:23:0;;10392:68;;;;-1:-1:-1;;;10392:68:0;;;;;;;:::i;:::-;66191:16:::1;:23:::0;66120:102::o;11089:201::-;8984:10;10400:7;:5;:7::i;:::-;-1:-1:-1;;;;;10400:23:0;;10392:68;;;;-1:-1:-1;;;10392:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11178:22:0;::::1;11170:73;;;::::0;-1:-1:-1;;;11170:73:0;;32598:2:1;11170:73:0::1;::::0;::::1;32580:21:1::0;32637:2;32617:18;;;32610:30;32676:34;32656:18;;;32649:62;-1:-1:-1;;;32727:18:1;;;32720:36;32773:19;;11170:73:0::1;32396:402:1::0;11170:73:0::1;11254:28;11273:8;11254:18;:28::i;36007:127::-:0;36072:4;36096:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36096:16:0;:30;;;36007:127::o;40153:174::-;40228:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40228:29:0;-1:-1:-1;;;;;40228:29:0;;;;;;;;:24;;40282:23;40228:24;40282:14;:23::i;:::-;-1:-1:-1;;;;;40273:46:0;;;;;;;;;;;40153:174;;:::o;66411:663::-;66457:7;66911:13;66940:9;66935:109;66959:16;;66955:1;:20;66935:109;;;67014:17;67029:1;67014:14;:17::i;:::-;66997:35;;;;:::i;:::-;;-1:-1:-1;66977:3:0;;;;:::i;:::-;;;;66935:109;;;-1:-1:-1;67061:5:0;66411:663;-1:-1:-1;66411:663:0:o;65862:103::-;65915:7;65949:3;;65943;;:9;;;;:::i;:::-;65942:15;;65956:1;65942:15;:::i;:::-;65935:22;;65862:103;:::o;38653:420::-;38713:13;38729:23;38744:7;38729:14;:23::i;:::-;38713:39;;38854:29;38871:1;38875:7;38854:8;:29::i;:::-;-1:-1:-1;;;;;38896:16:0;;;;;;:9;:16;;;;;:21;;38916:1;;38896:16;:21;;38916:1;;38896:21;:::i;:::-;;;;-1:-1:-1;;38935:16:0;;;;:7;:16;;;;;;38928:23;;-1:-1:-1;;;;;;38928:23:0;;;38969:36;38943:7;;38935:16;-1:-1:-1;;;;;38969:36:0;;;-1:-1:-1;;;;;;;;;;;38969:36:0;38935:16;;38969:36;45407:1348;;45360:1395::o;6466:723::-;6522:13;6743:10;6739:53;;-1:-1:-1;;6770:10:0;;;;;;;;;;;;-1:-1:-1;;;6770:10:0;;;;;6466:723::o;6739:53::-;6817:5;6802:12;6858:78;6865:9;;6858:78;;6891:8;;;;:::i;:::-;;-1:-1:-1;6914:10:0;;-1:-1:-1;6922:2:0;6914:10;;:::i;:::-;;;6858:78;;;6946:19;6978:6;-1:-1:-1;;;;;6968:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6968:17:0;;6946:39;;6996:154;7003:10;;6996:154;;7030:11;7040:1;7030:11;;:::i;:::-;;-1:-1:-1;7099:10:0;7107:2;7099:5;:10;:::i;:::-;7086:24;;:2;:24;:::i;:::-;7073:39;;7056:6;7063;7056:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7056:56:0;;;;;;;;-1:-1:-1;7127:11:0;7136:2;7127:11;;:::i;:::-;;;6996:154;;;7174:6;6466:723;-1:-1:-1;;;;6466:723:0:o;36301:348::-;36394:4;36419:16;36427:7;36419;:16::i;:::-;36411:73;;;;-1:-1:-1;;;36411:73:0;;35577:2:1;36411:73:0;;;35559:21:1;35616:2;35596:18;;;35589:30;35655:34;35635:18;;;35628:62;-1:-1:-1;;;35706:18:1;;;35699:42;35758:19;;36411:73:0;35375:408:1;36411:73:0;36495:13;36511:23;36526:7;36511:14;:23::i;:::-;36495:39;;36564:5;-1:-1:-1;;;;;36553:16:0;:7;-1:-1:-1;;;;;36553:16:0;;:52;;;;36573:32;36590:5;36597:7;36573:16;:32::i;:::-;36553:87;;;;36633:7;-1:-1:-1;;;;;36609:31:0;:20;36621:7;36609:11;:20::i;:::-;-1:-1:-1;;;;;36609:31:0;;36545:96;36301:348;-1:-1:-1;;;;36301:348:0:o;39410:625::-;39569:4;-1:-1:-1;;;;;39542:31:0;:23;39557:7;39542:14;:23::i;:::-;-1:-1:-1;;;;;39542:31:0;;39534:81;;;;-1:-1:-1;;;39534:81:0;;33005:2:1;39534:81:0;;;32987:21:1;33044:2;33024:18;;;33017:30;33083:34;33063:18;;;33056:62;-1:-1:-1;;;33134:18:1;;;33127:35;33179:19;;39534:81:0;32803:401:1;39534:81:0;-1:-1:-1;;;;;39634:16:0;;39626:65;;;;-1:-1:-1;;;39626:65:0;;34108:2:1;39626:65:0;;;34090:21:1;34147:2;34127:18;;;34120:30;34186:34;34166:18;;;34159:62;-1:-1:-1;;;34237:18:1;;;34230:34;34281:19;;39626:65:0;33906:400:1;39626:65:0;39808:29;39825:1;39829:7;39808:8;:29::i;:::-;-1:-1:-1;;;;;39850:15:0;;;;;;:9;:15;;;;;:20;;39869:1;;39850:15;:20;;39869:1;;39850:20;:::i;:::-;;;;-1:-1:-1;;;;;;;39881:13:0;;;;;;:9;:13;;;;;:18;;39898:1;;39881:13;:18;;39898:1;;39881:18;:::i;:::-;;;;-1:-1:-1;;39910:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39910:21:0;-1:-1:-1;;;;;39910:21:0;;;;;;;;;39949:27;;39910:16;;39949:27;;;;-1:-1:-1;;;;;;;;;;;39949:27:0;;32346:341;32276:411;;:::o;36991:110::-;37067:26;37077:2;37081:7;37067:26;;;;;;;;;;;;:9;:26::i;11450:191::-;11543:6;;;-1:-1:-1;;;;;11560:17:0;;;-1:-1:-1;;;;;;11560:17:0;;;;;;;11593:40;;11543:6;;;11560:17;11543:6;;11593:40;;11524:16;;11593:40;11513:128;11450:191;:::o;40469:315::-;40624:8;-1:-1:-1;;;;;40615:17:0;:5;-1:-1:-1;;;;;40615:17:0;;;40607:55;;;;-1:-1:-1;;;40607:55:0;;34513:2:1;40607:55:0;;;34495:21:1;34552:2;34532:18;;;34525:30;-1:-1:-1;;;34571:18:1;;;34564:55;34636:18;;40607:55:0;34311:349:1;40607:55:0;-1:-1:-1;;;;;40673:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;40673:46:0;;;;;;;;;;40735:41;;31123::1;;;40735::0;;31096:18:1;40735:41:0;;;;;;;40469:315;;;:::o;35379:::-;35536:28;35546:4;35552:2;35556:7;35536:9;:28::i;:::-;35583:48;35606:4;35612:2;35616:7;35625:5;35583:22;:48::i;:::-;35575:111;;;;-1:-1:-1;;;35575:111:0;;;;;;;:::i;3041:3053::-;3099:13;3336:4;:11;3351:1;3336:16;3332:31;;;-1:-1:-1;;3354:9:0;;;;;;;;;-1:-1:-1;3354:9:0;;;3041:3053::o;3332:31::-;3416:19;3438:6;;;;;;;;;;;;;;;;;3416:28;;3855:20;3914:1;3895:4;:11;3909:1;3895:15;;;;:::i;:::-;3894:21;;;;:::i;:::-;3889:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;3878:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3878:39:0;;3855:62;;4053:1;4046:5;4042:13;4157:2;4149:6;4145:15;4268:4;4320;4314:11;4308:4;4304:22;4230:1432;4354:6;4345:7;4342:19;4230:1432;;;4460:1;4451:7;4447:15;4436:26;;4499:7;4493:14;5152:4;5144:5;5140:2;5136:14;5132:25;5122:8;5118:40;5112:47;5101:9;5093:67;5206:1;5195:9;5191:17;5178:30;;5298:4;5290:5;5286:2;5282:14;5278:25;5268:8;5264:40;5258:47;5247:9;5239:67;5352:1;5341:9;5337:17;5324:30;;5443:4;5435:5;5432:1;5428:13;5424:24;5414:8;5410:39;5404:46;5393:9;5385:66;5497:1;5486:9;5482:17;5469:30;;5580:4;5573:5;5569:16;5559:8;5555:31;5549:38;5538:9;5530:58;;5634:1;5623:9;5619:17;5606:30;;4230:1432;;;4234:107;;5824:1;5817:4;5811:11;5807:19;5845:1;5840:123;;;;5982:1;5977:73;;;;5800:250;;5840:123;5893:4;5889:1;5878:9;5874:17;5866:32;5943:4;5939:1;5928:9;5924:17;5916:32;5840:123;;5977:73;6030:4;6026:1;6015:9;6011:17;6003:32;5800:250;-1:-1:-1;6080:6:0;;3041:3053;-1:-1:-1;;;;;3041:3053:0:o;66230:173::-;66293:6;66337:17;;;:9;:17;;;;;;;:35;;-1:-1:-1;;;66337:35:0;;;;66293:6;;-1:-1:-1;;;;;66337:17:0;;;;:33;;:35;;;;;;;;;;;;;;:17;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;66312:60:0;;66230:173;-1:-1:-1;;;;;;66230:173:0:o;37328:321::-;37458:18;37464:2;37468:7;37458:5;:18::i;:::-;37509:54;37540:1;37544:2;37548:7;37557:5;37509:22;:54::i;:::-;37487:154;;;;-1:-1:-1;;;37487:154:0;;;;;;;:::i;41349:799::-;41504:4;-1:-1:-1;;;;;41525:13:0;;13176:19;:23;41521:620;;41561:72;;-1:-1:-1;;;41561:72:0;;-1:-1:-1;;;;;41561:36:0;;;;;:72;;8984:10;;41612:4;;41618:7;;41627:5;;41561:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41561:72:0;;;;;;;;-1:-1:-1;;41561:72:0;;;;;;;;;;;;:::i;:::-;;;41557:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41803:13:0;;41799:272;;41846:60;;-1:-1:-1;;;41846:60:0;;;;;;;:::i;41799:272::-;42021:6;42015:13;42006:6;42002:2;41998:15;41991:38;41557:529;-1:-1:-1;;;;;;41684:51:0;-1:-1:-1;;;41684:51:0;;-1:-1:-1;41677:58:0;;41521:620;-1:-1:-1;42125:4:0;41349:799;;;;;;:::o;37985:439::-;-1:-1:-1;;;;;38065:16:0;;38057:61;;;;-1:-1:-1;;;38057:61:0;;37595:2:1;38057:61:0;;;37577:21:1;;;37614:18;;;37607:30;37673:34;37653:18;;;37646:62;37725:18;;38057:61:0;37393:356:1;38057:61:0;38138:16;38146:7;38138;:16::i;:::-;38137:17;38129:58;;;;-1:-1:-1;;;38129:58:0;;33411:2:1;38129:58:0;;;33393:21:1;33450:2;33430:18;;;33423:30;-1:-1:-1;;;33469:18:1;;;33462:58;33537:18;;38129:58:0;33209:352:1;38129:58:0;-1:-1:-1;;;;;38258:13:0;;;;;;:9;:13;;;;;:18;;38275:1;;38258:13;:18;;38275:1;;38258:18;:::i;:::-;;;;-1:-1:-1;;38287:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38287:21:0;-1:-1:-1;;;;;38287:21:0;;;;;;;;38326:33;;38287:16;;;-1:-1:-1;;;;;;;;;;;38326:33:0;38287:16;;38326:33;45407:1348;;45360:1395::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:175;435:13;;-1:-1:-1;;;;;477:30:1;;467:41;;457:69;;522:1;519;512:12;537:186;596:6;649:2;637:9;628:7;624:23;620:32;617:52;;;665:1;662;655:12;617:52;688:29;707:9;688:29;:::i;:::-;678:39;537:186;-1:-1:-1;;;537:186:1:o;728:260::-;796:6;804;857:2;845:9;836:7;832:23;828:32;825:52;;;873:1;870;863:12;825:52;896:29;915:9;896:29;:::i;:::-;886:39;;944:38;978:2;967:9;963:18;944:38;:::i;:::-;934:48;;728:260;;;;;:::o;993:328::-;1070:6;1078;1086;1139:2;1127:9;1118:7;1114:23;1110:32;1107:52;;;1155:1;1152;1145:12;1107:52;1178:29;1197:9;1178:29;:::i;:::-;1168:39;;1226:38;1260:2;1249:9;1245:18;1226:38;:::i;:::-;1216:48;;1311:2;1300:9;1296:18;1283:32;1273:42;;993:328;;;;;:::o;1326:1138::-;1421:6;1429;1437;1445;1498:3;1486:9;1477:7;1473:23;1469:33;1466:53;;;1515:1;1512;1505:12;1466:53;1538:29;1557:9;1538:29;:::i;:::-;1528:39;;1586:38;1620:2;1609:9;1605:18;1586:38;:::i;:::-;1576:48;;1671:2;1660:9;1656:18;1643:32;1633:42;;1726:2;1715:9;1711:18;1698:32;-1:-1:-1;;;;;1790:2:1;1782:6;1779:14;1776:34;;;1806:1;1803;1796:12;1776:34;1844:6;1833:9;1829:22;1819:32;;1889:7;1882:4;1878:2;1874:13;1870:27;1860:55;;1911:1;1908;1901:12;1860:55;1947:2;1934:16;1969:2;1965;1962:10;1959:36;;;1975:18;;:::i;:::-;2050:2;2044:9;2018:2;2104:13;;-1:-1:-1;;2100:22:1;;;2124:2;2096:31;2092:40;2080:53;;;2148:18;;;2168:22;;;2145:46;2142:72;;;2194:18;;:::i;:::-;2234:10;2230:2;2223:22;2269:2;2261:6;2254:18;2309:7;2304:2;2299;2295;2291:11;2287:20;2284:33;2281:53;;;2330:1;2327;2320:12;2281:53;2386:2;2381;2377;2373:11;2368:2;2360:6;2356:15;2343:46;2431:1;2426:2;2421;2413:6;2409:15;2405:24;2398:35;2452:6;2442:16;;;;;;;1326:1138;;;;;;;:::o;2469:254::-;2534:6;2542;2595:2;2583:9;2574:7;2570:23;2566:32;2563:52;;;2611:1;2608;2601:12;2563:52;2634:29;2653:9;2634:29;:::i;:::-;2624:39;;2682:35;2713:2;2702:9;2698:18;2682:35;:::i;2728:254::-;2796:6;2804;2857:2;2845:9;2836:7;2832:23;2828:32;2825:52;;;2873:1;2870;2863:12;2825:52;2896:29;2915:9;2896:29;:::i;:::-;2886:39;2972:2;2957:18;;;;2944:32;;-1:-1:-1;;;2728:254:1:o;2987:180::-;3043:6;3096:2;3084:9;3075:7;3071:23;3067:32;3064:52;;;3112:1;3109;3102:12;3064:52;3135:26;3151:9;3135:26;:::i;3172:245::-;3230:6;3283:2;3271:9;3262:7;3258:23;3254:32;3251:52;;;3299:1;3296;3289:12;3251:52;3338:9;3325:23;3357:30;3381:5;3357:30;:::i;3422:249::-;3491:6;3544:2;3532:9;3523:7;3519:23;3515:32;3512:52;;;3560:1;3557;3550:12;3512:52;3592:9;3586:16;3611:30;3635:5;3611:30;:::i;3676:180::-;3735:6;3788:2;3776:9;3767:7;3763:23;3759:32;3756:52;;;3804:1;3801;3794:12;3756:52;-1:-1:-1;3827:23:1;;3676:180;-1:-1:-1;3676:180:1:o;3861:254::-;3929:6;3937;3990:2;3978:9;3969:7;3965:23;3961:32;3958:52;;;4006:1;4003;3996:12;3958:52;4042:9;4029:23;4019:33;;4071:38;4105:2;4094:9;4090:18;4071:38;:::i;4120:248::-;4188:6;4196;4249:2;4237:9;4228:7;4224:23;4220:32;4217:52;;;4265:1;4262;4255:12;4217:52;-1:-1:-1;;4288:23:1;;;4358:2;4343:18;;;4330:32;;-1:-1:-1;4120:248:1:o;4373:473::-;4476:6;4484;4492;4500;4508;4561:3;4549:9;4540:7;4536:23;4532:33;4529:53;;;4578:1;4575;4568:12;4529:53;4601:39;4630:9;4601:39;:::i;:::-;4591:49;;4680:2;4669:9;4665:18;4659:25;4649:35;;4724:2;4713:9;4709:18;4703:25;4693:35;;4768:2;4757:9;4753:18;4747:25;4737:35;;4791:49;4835:3;4824:9;4820:19;4791:49;:::i;:::-;4781:59;;4373:473;;;;;;;;:::o;4851:268::-;4903:3;4941:5;4935:12;4968:6;4963:3;4956:19;4984:63;5040:6;5033:4;5028:3;5024:14;5017:4;5010:5;5006:16;4984:63;:::i;:::-;5101:2;5080:15;-1:-1:-1;;5076:29:1;5067:39;;;;5108:4;5063:50;;4851:268;-1:-1:-1;;4851:268:1:o;5124:184::-;5165:3;5203:5;5197:12;5218:52;5263:6;5258:3;5251:4;5244:5;5240:16;5218:52;:::i;:::-;5286:16;;;;;5124:184;-1:-1:-1;;5124:184:1:o;5313:123::-;-1:-1:-1;;;5373:29:1;;5427:2;5418:12;;5313:123::o;8587:271::-;8664:34;8652:47;;8729:34;8724:2;8715:12;;8708:56;-1:-1:-1;;;8789:2:1;8780:12;;8773:51;8849:2;8840:12;;8587:271::o;8863:255::-;8940:66;8928:79;;-1:-1:-1;;;9032:2:1;9023:12;;9016:68;9109:2;9100:12;;8863:255::o;12941:221::-;13115:2;13086:15;;;;-1:-1:-1;;;;;;13082:45:1;13070:58;;13153:2;13144:12;;12941:221::o;13409:466::-;13584:3;13622:6;13616:13;13638:53;13684:6;13679:3;13672:4;13664:6;13660:17;13638:53;:::i;:::-;13754:13;;13713:16;;;;13776:57;13754:13;13713:16;13810:4;13798:17;;13776:57;:::i;:::-;13849:20;;13409:466;-1:-1:-1;;;;13409:466:1:o;13880:1952::-;-1:-1:-1;;;14724:68:1;;14815:13;;14706:3;;14837:62;14815:13;14887:2;14878:12;;14871:4;14859:17;;14837:62;:::i;:::-;14963:66;14958:2;14918:16;;;14950:11;;;14943:87;-1:-1:-1;;;15054:2:1;15046:11;;15039:27;15091:13;;15113:63;15091:13;15162:2;15154:11;;15147:4;15135:17;;15113:63;:::i;:::-;15237:13;;15195:17;;;15259:63;15237:13;15308:2;15300:11;;15293:4;15281:17;;15259:63;:::i;:::-;-1:-1:-1;;;15382:2:1;15341:17;;;;15374:11;;;15367:69;15461:13;;15483:63;15461:13;15532:2;15524:11;;15517:4;15505:17;;15483:63;:::i;:::-;15565:57;15618:2;15607:8;15603:2;15599:17;15595:26;15565:57;:::i;:::-;15555:67;;;15653:6;15647:13;15669:54;15714:8;15710:2;15703:4;15695:6;15691:17;15669:54;:::i;:::-;-1:-1:-1;;;15742:17:1;;15768:32;;;15824:1;15816:10;;13880:1952;-1:-1:-1;;;;;;;13880:1952:1:o;15837:1247::-;-1:-1:-1;;;16493:3:1;16486:19;16468:3;16534:6;16528:13;16550:61;16604:6;16600:1;16595:3;16591:11;16584:4;16576:6;16572:17;16550:61;:::i;:::-;16639:6;16634:3;16630:16;16620:26;;-1:-1:-1;;;16696:2:1;16692:1;16688:2;16684:10;16677:22;16730:6;16724:13;16746:62;16799:8;16795:1;16791:2;16787:10;16780:4;16772:6;16768:17;16746:62;:::i;:::-;16868:1;16827:17;;16860:10;;;16853:22;16900:13;;16922:62;16900:13;16971:1;16963:10;;16956:4;16944:17;;16922:62;:::i;:::-;-1:-1:-1;;;17044:1:1;17003:17;;;;17036:10;;;17029:23;17076:1;17068:10;;15837:1247;-1:-1:-1;;;;;15837:1247:1:o;17089:2929::-;17891:34;17886:3;17879:47;17956:34;17951:2;17946:3;17942:12;17935:56;18021:34;18016:2;18011:3;18007:12;18000:56;18086:34;18081:2;18076:3;18072:12;18065:56;18152:34;18146:3;18141;18137:13;18130:57;18218:34;18212:3;18207;18203:13;18196:57;18284:34;18278:3;18273;18269:13;18262:57;18350:34;18344:3;18339;18335:13;18328:57;18416:34;18410:3;18405;18401:13;18394:57;18482:34;18476:3;18471;18467:13;18460:57;18548:34;18542:3;18537;18533:13;18526:57;18614:34;18608:3;18603;18599:13;18592:57;18680:34;18674:3;18669;18665:13;18658:57;18746:34;18740:3;18735;18731:13;18724:57;18812:34;18806:3;18801;18797:13;18790:57;18878:34;18872:3;18867;18863:13;18856:57;18944:34;18938:3;18933;18929:13;18922:57;19010:34;19004:3;18999;18995:13;18988:57;19076:34;19070:3;19065;19061:13;19054:57;19142:34;19136:3;19131;19127:13;19120:57;19208:34;19202:3;19197;19193:13;19186:57;19274:34;19268:3;19263;19259:13;19252:57;19340:34;19334:3;19329;19325:13;19318:57;19406:34;19400:3;19395;19391:13;19384:57;19472:34;19466:3;19461;19457:13;19450:57;19538:34;19532:3;19527;19523:13;19516:57;19604:34;19598:3;19593;19589:13;19582:57;19670:34;19664:3;19659;19655:13;19648:57;-1:-1:-1;;;19730:3:1;19725;19721:13;19714:41;17861:3;19771:241;19801:210;19826:184;19856:153;19881:127;19911:96;19936:70;19966:39;20000:3;19995;19991:13;19983:6;19966:39;:::i;:::-;9782:34;9770:47;;9847:34;9842:2;9833:12;;9826:56;9912:34;9907:2;9898:12;;9891:56;9977:34;9972:2;9963:12;;9956:56;10043:34;10037:3;10028:13;;10021:57;10109:34;10103:3;10094:13;;10087:57;10175:34;10169:3;10160:13;;10153:57;-1:-1:-1;;;10235:3:1;10226:13;;10219:40;10284:3;10275:13;;9705:589;19936:70;19928:6;19911:96;:::i;:::-;5518:34;5506:47;;5583:34;5578:2;5569:12;;5562:56;-1:-1:-1;;;5643:2:1;5634:12;;5627:28;5680:2;5671:12;;5441:248;19881:127;19873:6;19856:153;:::i;:::-;10376:34;10364:47;;10441:34;10436:2;10427:12;;10420:56;10506:34;10501:2;10492:12;;10485:56;10571:34;10566:2;10557:12;;10550:56;10637:34;10631:3;10622:13;;10615:57;10703:34;10697:3;10688:13;;10681:57;10769:34;10763:3;10754:13;;10747:57;10835:34;10829:3;10820:13;;10813:57;10901:34;10895:3;10886:13;;10879:57;10967:34;10961:3;10952:13;;10945:57;11033:34;11027:3;11018:13;;11011:57;-1:-1:-1;;;11093:3:1;11084:13;;11077:39;11141:3;11132:13;;10299:852;19826:184;19818:6;19801:210;:::i;:::-;5771:34;5766:3;5759:47;5836:34;5831:2;5826:3;5822:12;5815:56;5901:34;5896:2;5891:3;5887:12;5880:56;5966:34;5961:2;5956:3;5952:12;5945:56;6032:34;6026:3;6021;6017:13;6010:57;6098:34;6092:3;6087;6083:13;6076:57;6164:34;6158:3;6153;6149:13;6142:57;5741:3;6218:34;6283:2;6277:3;6272;6268:13;6261:25;6305:34;6370:2;6364:3;6359;6355:13;6348:25;6392:34;6457:2;6451:3;6446;6442:13;6435:25;6491:34;6485:3;6480;6476:13;6469:57;6557:34;6551:3;6546;6542:13;6535:57;6623:34;6617:3;6612;6608:13;6601:57;6689:34;6683:3;6678;6674:13;6667:57;6755:34;6749:3;6744;6740:13;6733:57;6821:34;6815:3;6810;6806:13;6799:57;6887:34;6881:3;6876;6872:13;6865:57;6953:34;6947:3;6942;6938:13;6931:57;7019:34;7013:3;7008;7004:13;6997:57;7085:34;7079:3;7074;7070:13;7063:57;7151:34;7145:3;7140;7136:13;7129:57;7217:34;7211:3;7206;7202:13;7195:57;7283:34;7277:3;7272;7268:13;7261:57;7349:34;7343:3;7338;7334:13;7327:57;7415:34;7409:3;7404;7400:13;7393:57;7469:34;7534:2;7528:3;7523;7519:13;7512:25;7556:34;7621:2;7615:3;7610;7606:13;7599:25;7643:34;7708:2;7702:3;7697;7693:13;7686:25;7742:34;7736:3;7731;7727:13;7720:57;7808:34;7802:3;7797;7793:13;7786:57;7874:2;7868:3;7863;7859:13;7852:25;7908:2;7902:3;7897;7893:13;7886:25;7943:2;7936:4;7931:3;7927:14;7920:26;7978:34;7971:4;7966:3;7962:14;7955:58;8045:2;8038:4;8033:3;8029:14;8022:26;8080:2;8073:4;8068:3;8064:14;8057:26;8115:2;8108:4;8103:3;8099:14;8092:26;;;8150:34;8143:4;8138:3;8134:14;8127:58;8217:34;8210:4;8205:3;8201:14;8194:58;8284:34;8277:4;8272:3;8268:14;8261:58;8351:2;8344:4;8339:3;8335:14;8328:26;;;;;8386:34;8379:4;8374:3;8370:14;8363:58;8453:34;8446:4;8441:3;8437:14;8430:58;-1:-1:-1;;;8513:4:1;8508:3;8504:14;8497:49;8571:4;8566:3;8562:14;8555:21;;5694:2888;;;;19771:241;19764:248;17089:2929;-1:-1:-1;;;;;;17089:2929:1:o;20023:3157::-;20758:3;20786:34;20816:3;20786:34;:::i;:::-;20840;20829:46;;20904:34;20899:2;20891:11;;20884:55;20968:34;20963:2;20955:11;;20948:55;21032:34;21027:2;21019:11;;21012:55;21097:34;21091:3;21083:12;;21076:56;21162:34;21156:3;21148:12;;21141:56;21227:34;21221:3;21213:12;;21206:56;21292:34;21286:3;21278:12;;21271:56;21357:34;21351:3;21343:12;;21336:56;21422:34;21416:3;21408:12;;21401:56;21487:34;21481:3;21473:12;;21466:56;21552:34;21546:3;21538:12;;21531:56;21617:34;21611:3;21603:12;;21596:56;21682:34;21676:3;21668:12;;21661:56;21747:34;21741:3;21733:12;;21726:56;21812:34;21806:3;21798:12;;21791:56;21877:34;21871:3;21863:12;;21856:56;21942:34;21936:3;21928:12;;21921:56;22007:34;22001:3;21993:12;;21986:56;22072:34;22066:3;22058:12;;22051:56;22137:34;22131:3;22123:12;;22116:56;22202:34;22196:3;22188:12;;22181:56;22267:34;22261:3;22253:12;;22246:56;22332:34;22326:3;22318:12;;22311:56;22397:34;22391:3;22383:12;;22376:56;22462:34;22456:3;22448:12;;22441:56;22527:34;22521:3;22513:12;;22506:56;22592:34;22586:3;22578:12;;22571:56;22657:34;22651:3;22643:12;;22636:56;22722:34;22716:3;22708:12;;22701:56;22787:34;22781:3;22773:12;;22766:56;22852:34;22846:3;22838:12;;22831:56;22918:34;22911:4;22903:13;;22896:57;-1:-1:-1;;;22977:4:1;22969:13;;22962:38;11357:34;23164:4;23156:13;;11345:47;11422:34;11408:12;;;11401:56;11487:34;11473:12;;;11466:56;11552:34;11538:12;;;11531:56;11618:34;11603:13;;;11596:57;11684:34;11669:13;;;11662:57;11750:34;11735:13;;;11728:57;11816:34;11801:13;;;11794:57;11882:34;11867:13;;;11860:57;11948:34;11933:13;;;11926:57;12014:34;11999:13;;;11992:57;12080:34;12065:13;;;12058:57;12146:34;12131:13;;;12124:57;12212:34;12197:13;;;12190:57;12278:34;12263:13;;;12256:57;12344:34;12329:13;;;12322:57;12410:34;12395:13;;;12388:57;12476:34;12461:13;;;12454:57;12542:34;12527:13;;;12520:57;12608:34;12593:13;;;12586:57;12674:34;12659:13;;;12652:57;12740:34;12725:13;;;12718:57;12806:34;12791:13;;;12784:57;-1:-1:-1;;;12857:13:1;;;12850:51;23016:158;23046:127;23076:96;23101:70;12917:13;;;23101:70;:::i;:::-;23093:6;23076:96;:::i;:::-;9200:34;9188:47;;9265:34;9260:2;9251:12;;9244:56;9330:34;9325:2;9316:12;;9309:56;9395:34;9390:2;9381:12;;9374:56;9461:34;9455:3;9446:13;;9439:57;9527:34;9521:3;9512:13;;9505:57;9593:34;9587:3;9578:13;;9571:57;-1:-1:-1;;;9653:3:1;9644:13;;9637:28;9690:3;9681:13;;9123:577;23046:127;-1:-1:-1;;;11221:21:1;;11267:1;11258:11;;11156:119;23185:4428;23865:3;23893:34;23923:3;23893:34;:::i;:::-;23947;23943:2;23936:46;-1:-1:-1;;;24006:2:1;24002;23998:11;23991:40;24060:6;24054:13;24076:59;24128:6;24123:2;24119;24115:11;24110:2;24102:6;24098:15;24076:59;:::i;:::-;-1:-1:-1;;;24193:2:1;24154:15;;;;24185:11;;;24178:26;24233:34;24228:2;24220:11;;24213:55;24297:34;24292:2;24284:11;;24277:55;24362:34;24356:3;24348:12;;24341:56;24427:34;24421:3;24413:12;;24406:56;24492:34;24486:3;24478:12;;24471:56;24557:34;24551:3;24543:12;;24536:56;24622:34;24616:3;24608:12;;24601:56;24687:34;24681:3;24673:12;;24666:56;24752:34;24746:3;24738:12;;24731:56;24817:34;24811:3;24803:12;;24796:56;24882:34;24876:3;24868:12;;24861:56;24947:34;24941:3;24933:12;;24926:56;25012:34;25006:3;24998:12;;24991:56;25077:34;25071:3;25063:12;;25056:56;25142:34;25136:3;25128:12;;25121:56;25207:34;25201:3;25193:12;;25186:56;25272:34;25266:3;25258:12;;25251:56;25337:34;25331:3;25323:12;;25316:56;25402:34;25396:3;25388:12;;25381:56;25467:34;25461:3;25453:12;;25446:56;25532:34;25526:3;25518:12;;25511:56;25597:34;25591:3;25583:12;;25576:56;25662:34;25656:3;25648:12;;25641:56;25727:34;25721:3;25713:12;;25706:56;25792:34;25786:3;25778:12;;25771:56;25857:34;25851:3;25843:12;;25836:56;25922:34;25916:3;25908:12;;25901:56;25987:34;25981:3;25973:12;;25966:56;26052:34;26046:3;26038:12;;26031:56;26117:34;26111:3;26103:12;;26096:56;26183:34;26176:4;26168:13;;26161:57;26249:34;26242:4;26234:13;;26227:57;26315:34;26308:4;26300:13;;26293:57;26381:34;26374:4;26366:13;;26359:57;26447:34;26440:4;26432:13;;26425:57;26513:34;26506:4;26498:13;;26491:57;26579:34;26572:4;26564:13;;26557:57;26645:34;26638:4;26630:13;;26623:57;26711:34;26704:4;26696:13;;26689:57;26777:34;26770:4;26762:13;;26755:57;26843:34;26836:4;26828:13;;26821:57;26909:34;26902:4;26894:13;;26887:57;26975:34;26968:4;26960:13;;26953:57;27041:34;27034:4;27026:13;;27019:57;27107:34;27100:4;27092:13;;27085:57;27173:34;27166:4;27158:13;;27151:57;27239:34;27232:4;27224:13;;27217:57;27305:34;27298:4;27290:13;;27283:57;27371:34;27364:4;27356:13;;27349:57;27437:34;27430:4;27422:13;;27415:57;-1:-1:-1;;;27496:4:1;27488:13;;27481:45;27542:65;27567:39;27600:4;27592:13;;27567:39;:::i;27542:65::-;27535:72;23185:4428;-1:-1:-1;;;;;23185:4428:1:o;27618:1519::-;28277:66;28272:3;28265:79;28247:3;28373:6;28367:13;28389:62;28444:6;28439:2;28434:3;28430:12;28423:4;28415:6;28411:17;28389:62;:::i;:::-;28515:66;28510:2;28470:16;;;28502:11;;;28495:87;28611:66;28606:2;28598:11;;28591:87;-1:-1:-1;;;28702:2:1;28694:11;;28687:43;28755:13;;28777:64;28755:13;28826:3;28818:12;;28811:4;28799:17;;28777:64;:::i;:::-;28860:58;28913:3;28902:8;28898:2;28894:17;28890:27;28860:58;:::i;:::-;28850:68;;;28949:6;28943:13;28965:54;29010:8;29006:2;28999:4;28991:6;28987:17;28965:54;:::i;:::-;-1:-1:-1;;;29041:17:1;;29067:35;;;29129:1;29118:13;;27618:1519;-1:-1:-1;;;;;27618:1519:1:o;29142:448::-;29404:31;29399:3;29392:44;29374:3;29465:6;29459:13;29481:62;29536:6;29531:2;29526:3;29522:12;29515:4;29507:6;29503:17;29481:62;:::i;:::-;29563:16;;;;29581:2;29559:25;;29142:448;-1:-1:-1;;29142:448:1:o;30200:499::-;-1:-1:-1;;;;;30469:15:1;;;30451:34;;30521:15;;30516:2;30501:18;;30494:43;30568:2;30553:18;;30546:34;;;30616:3;30611:2;30596:18;;30589:31;;;30394:4;;30637:56;;30673:19;;30665:6;30637:56;:::i;31175:228::-;31322:2;31311:9;31304:21;31285:4;31342:55;31393:2;31382:9;31378:18;31370:6;31342:55;:::i;31977:414::-;32179:2;32161:21;;;32218:2;32198:18;;;32191:30;32257:34;32252:2;32237:18;;32230:62;-1:-1:-1;;;32323:2:1;32308:18;;32301:48;32381:3;32366:19;;31977:414::o;38507:356::-;38709:2;38691:21;;;38728:18;;;38721:30;38787:34;38782:2;38767:18;;38760:62;38854:2;38839:18;;38507:356::o;40043:413::-;40245:2;40227:21;;;40284:2;40264:18;;;40257:30;40323:34;40318:2;40303:18;;40296:62;-1:-1:-1;;;40389:2:1;40374:18;;40367:47;40446:3;40431:19;;40043:413::o;40643:128::-;40683:3;40714:1;40710:6;40707:1;40704:13;40701:39;;;40720:18;;:::i;:::-;-1:-1:-1;40756:9:1;;40643:128::o;40776:120::-;40816:1;40842;40832:35;;40847:18;;:::i;:::-;-1:-1:-1;40881:9:1;;40776:120::o;40901:168::-;40941:7;41007:1;41003;40999:6;40995:14;40992:1;40989:21;40984:1;40977:9;40970:17;40966:45;40963:71;;;41014:18;;:::i;:::-;-1:-1:-1;41054:9:1;;40901:168::o;41074:125::-;41114:4;41142:1;41139;41136:8;41133:34;;;41147:18;;:::i;:::-;-1:-1:-1;41184:9:1;;41074:125::o;41204:258::-;41276:1;41286:113;41300:6;41297:1;41294:13;41286:113;;;41376:11;;;41370:18;41357:11;;;41350:39;41322:2;41315:10;41286:113;;;41417:6;41414:1;41411:13;41408:48;;;-1:-1:-1;;41452:1:1;41434:16;;41427:27;41204:258::o;41467:380::-;41546:1;41542:12;;;;41589;;;41610:61;;41664:4;41656:6;41652:17;41642:27;;41610:61;41717:2;41709:6;41706:14;41686:18;41683:38;41680:161;;;41763:10;41758:3;41754:20;41751:1;41744:31;41798:4;41795:1;41788:15;41826:4;41823:1;41816:15;41852:135;41891:3;-1:-1:-1;;41912:17:1;;41909:43;;;41932:18;;:::i;:::-;-1:-1:-1;41979:1:1;41968:13;;41852:135::o;41992:112::-;42024:1;42050;42040:35;;42055:18;;:::i;:::-;-1:-1:-1;42089:9:1;;41992:112::o;42109:127::-;42170:10;42165:3;42161:20;42158:1;42151:31;42201:4;42198:1;42191:15;42225:4;42222:1;42215:15;42241:127;42302:10;42297:3;42293:20;42290:1;42283:31;42333:4;42330:1;42323:15;42357:4;42354:1;42347:15;42373:127;42434:10;42429:3;42425:20;42422:1;42415:31;42465:4;42462:1;42455:15;42489:4;42486:1;42479:15;42505:127;42566:10;42561:3;42557:20;42554:1;42547:31;42597:4;42594:1;42587:15;42621:4;42618:1;42611:15;42637:131;-1:-1:-1;;;;;;42711:32:1;;42701:43;;42691:71;;42758:1;42755;42748:12

Swarm Source

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