ETH Price: $3,398.70 (+2.93%)

Token

Degenarios (DEGENARIOS)
 

Overview

Max Total Supply

4,444 DEGENARIOS

Holders

1,455

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DEGENARIOS
0xf8dee865abcaf3b27b50df29e894c61ae066e120
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:
Degenarios

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.9;

/*

▓█████▄ ▓█████   ▄████ ▓█████  ███▄    █  ▄▄▄       ██▀███   ██▓ ▒█████    ██████ 
▒██▀ ██▌▓█   ▀  ██▒ ▀█▒▓█   ▀  ██ ▀█   █ ▒████▄    ▓██ ▒ ██▒▓██▒▒██▒  ██▒▒██    ▒ 
░██   █▌▒███   ▒██░▄▄▄░▒███   ▓██  ▀█ ██▒▒██  ▀█▄  ▓██ ░▄█ ▒▒██▒▒██░  ██▒░ ▓██▄   
░▓█▄   ▌▒▓█  ▄ ░▓█  ██▓▒▓█  ▄ ▓██▒  ▐▌██▒░██▄▄▄▄██ ▒██▀▀█▄  ░██░▒██   ██░  ▒   ██▒
░▒████▓ ░▒████▒░▒▓███▀▒░▒████▒▒██░   ▓██░ ▓█   ▓██▒░██▓ ▒██▒░██░░ ████▓▒░▒██████▒▒
 ▒▒▓  ▒ ░░ ▒░ ░ ░▒   ▒ ░░ ▒░ ░░ ▒░   ▒ ▒  ▒▒   ▓▒█░░ ▒▓ ░▒▓░░▓  ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░
 ░ ▒  ▒  ░ ░  ░  ░   ░  ░ ░  ░░ ░░   ░ ▒░  ▒   ▒▒ ░  ░▒ ░ ▒░ ▒ ░  ░ ▒ ▒░ ░ ░▒  ░ ░
 ░ ░  ░    ░   ░ ░   ░    ░      ░   ░ ░   ░   ▒     ░░   ░  ▒ ░░ ░ ░ ▒  ░  ░  ░  
   ░       ░  ░      ░    ░  ░         ░       ░  ░   ░      ░      ░ ░        ░  
 ░                                                                                

*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @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;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @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);
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
 * @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);
}

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

// OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol)
/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
/**
 * @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);

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// Creator: Chiru Labs
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    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())) : '';
    }

    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	    return result;
	}
}

library degenSVG {
    
    function font() internal pure returns (string memory) {
        return "@font-face { font-family: 'Press Start 2P'; src: url(data:application/octet-stream;base64,d09GMgABAAAAABIwAAwAAAAARfwAABHeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIJkBmAAhGwRCArwVNJjC4NCAAE2AiQDg0YEIAWESgeEUBt0NKOimnQXsv+etMZtc/arCoLMrlTj7sDDSKhoUo3QokyEBuILd6hJ40F4FXopS5/npS0+vfFbtFjG0rBo5IMjJJmF52s/9ufuYm7JPWpjKIFFvLkmtxJJpBeJ9k1+sHt9seo09wkF9KUAMddTJ4PqrU4k6vA8cd/+3F4aRrslvIPvFG4b+KPGM8jwU/Y36of72SLj/b/gqKS1RoRoEc9GKZB3OJA7/e0PcDdQJ3cILJIWaIilGFQZNC/BH8YT4JtfN9UjBClpkRKGh4wdSwUHa5Oa2mglCDeSwGnlec+nnU3ppLarQIb3fKt0KpW30sgOmJ/8SiMNfI+3WRgOwyyc8p9c8g6UfnIl3+h0raH/39KUzujubMm1wFJRGkClPR7UHg9g1p/5+z07Gk286z01y11uV9zPSd9Znd9buZSG/IxSGnUupVbkZ5gXmo5IEEkwDeB5G0MDDaBcbCJGvKK/lzX7F2hhD9mKx6OsGyHFIYwxhpiOcWT5p/84v2cEOKk0XfRokivimJvacoxL5ydq2C8CkvEfUxRbdruHD8KGDfILQbP//xfsgxNv73HT69Rw3IEmjSGODhBsM0og/XjryoklswHCgQgTzUcyYaNDtDlRbETWFyoRioA6qJpTcWGn75e3GxKtTRTRDOlJEc0P8c2mxdgxTTQ3dqYkvTDVU/CnDJoq/sFKjGQa9nCm9rGf67qIUOogRSpICCt9yd6weJVt4qDKUQXUVS8rK9ycAbC1vK29z1g2zcdxl0FUnfgFQH/JugvYAqDeTTKsSaf5iCE61sjPKwcilg/AVTqJEf/x5hQqp3FXD/WKEIECNICCETwQg4BEUGSHHFAxhgngKgKb1OaYk9eYJgQZqG7Y/ZPg8weaAPzXgX8NBgvrCayTmbU02a/7z1nun4LPvigAGYB6z4E8slwg5cfm4v84bdlGa511xwOb7LLbEpestM86W6yw2XVXXbPefbFcuHLnaZTRxhhrogIILBwCBhY2Di4eMQkpGYUdltrppa3eUzIysbBx8/DyiShUpESpcvUaNWnWqk23Hr36DNrmue1uOmWN084744IXHnnnMdQBt+z3xAfP3DDXPK/d9tAyb8wx4qBFFlpsg0S27Dix58iZG1/ZcuTKN854E2TCoyAioSG7jEqET0BIjqmFloqanoaOgZmLnYNTWEBQiFWZahUq1apyRY0u7Tp06tdgAF2dvfY46pgjosgH8wFYAOQFyH947nDg/QawAzEA0ABA0TS1WMELEyix0JrLBATJWLWqNlfScLusyNsTsFUzKVPKgowhgAxev1BOwhHtipUDcfFJq7YEBhJqcpg0qMKO5JKQHRMKxDsj4Tka/HCmTbVLuilAcG8xZ+Pb1WqdzXJlLVtkzVzZAPI83dm97xLdTLKZAYNo9Td53FAvaWs+V/qWVwZR59f+RqWW3K/vbIWTelfBkFa2+j8bNeujVpRB1OxRWwm6/dADY0lvz14HYWTA2EA2n1v+vD03YJ51oCE+Px6ts7XRy7JZoivgY+CL+epha6m9KdqwyTVkJZe5zlTbZW64j58ze3jcQneQaqNeWxHIt5EKc23/3j0pSCiwtxym8bNHqdeSFxbL2q5rcWFw8LpArW2AI2wvkGySPsNC6EhMP8Rlqvu3t12BBIsLpXFxSTjcKAFNoRCcDn44jgSoLmUGmh01pCgM9XyqBbD3XHigD3Ampe/C52UE5G6EfJCiObarZ5gz7eMXITcImWb0ADLOgRBC67I0NDYkbpsw8+ugZKnoXSj2LyQmeRA4ZSmhtXuDJ6ycBOJqlCtVbYtdU9WxrwF9nuXokQgM8LZdSJXZ2hAPDCmPehSvppfuHYW8EHaqOFUfEA69BiWLLHlJ9ZbaXbWhl5hJSwCi+1MFQ6bWGAzRQVaIhR6akKQv9doyTxsjGzfCnBdUzbLNdXzpqVvLbfUWgWPgAAuFx01pjobrGKGAtWvh4Gh1YeKU2BCnKhUpGGC8cdUryD0WvcielSh54lBV+Pqsk65wMjyKkSms7jTkwzUlRi0bpYcVgY8vaRrhhlpE1tqri1SQVQK6BddNylzUNPLs6SwLc3GsjhBx34qjmgiFL01hoY84knFsRgIIG7SFS1BBzc1cOgmESZ/HiDlpghnyEiVS14exuPBHW8ROQAUESmGyVlzXxmKsAUJiHHOiDnPqjsZCk0i22ByPVtBjguWMkOXgwkTls1AiuPXXhiL2qWQyen6DTSKKzK5HAhIm2yJQ4aA5HQ5h9O8sI+iZ7AAWAY5Ykik8WUJS1VTqBn3hiy3DAIIUWHFq2NWV4u0rsUWoktmVPzdebhIJual46yshudFAMIfLwDF+QKIJ0p2HfJiRh8YlaIXI2ticIgR4DdAL90zEi1cTpdUDSTZ0BTbTvkAtWtgbAd3Vv3SXw3BJ9JQMq5Ks1PqI5/Vgp+bak1QMlyVQoZuguiz0D2czByKuwlOGC5NxRUJOubK4EK4VwGWDhGQ7BFF90ts8GRY2nggRUUcIuJlYEhZirYvEmihBEEGOYuUia4ywC5PHkjNrWcoyl22Wo5o9CJGfjVMWV9aS1JV4LtvyGVd79mzvLzQtXEZZPD6CNEp5jWBoJSAQO5bUzRd7JUuvFvYJlkAdUMEVwEizAWZxNrWYThxG5UDrUoPjEUZFvugyD+sRguC69hpiVmIUrgcYdv+K92yZlG7LMLtzU0RdGPDFqEoTiQBZ8oU51sh6gR3kUlsWGSKWvgNBDtFy8bkh13KGKg0kdIvwRxJFYbw7H9B7MHVj6z4e2JmMT4xAF9/VCpP+aRRrnFDE4rogs9ydWYitjhEj8fRYOEccQOecCCbB8aI+m2swLwRIW0i4ehCDSK0K0epXnWYEyl7gTzNsC5kh12IeIw8qsMVc29HvgNREll1gdCOxtUapVPWtu0Fz1tatzmAdXAZrptRUltdjj/npaiop+iPsX4oc6JiP2yAmDmxn2C20vX4XfpTVrkyyOUfzko7quIw266JENhBz/nyF1L9gvqoX0o1XCBJEeTrtbXOpCzMVdij0iYbooULAKehWdh5b6+QHScnmhHbpCvgirlRiUjSasFM92egL/uyikeX4i36VucwxR2wom/6YJnVnVuBFX57PgkSss4z64kal3rXCj3hZ/nhmE76FXB/NjpZ6bMAj7IU658/047OYdZ0l00WaJftgU5K5k9N4mnCdn/i1Zcd19LdO/yo07ARwjkESwATiS9h0nalZhF8mhn0FM2AAhzjWTpe8mNSyKChSAd86f167QERonqiDkQhY52Exr/pywCuwdsDzj+vRZTo1OvcHFkQeuP+4bZ/KcmDOdL9Po2xh3iqnE6dcYsaLTXycT5N6OgzJf+UM5cc6627JiAgoN4AAOlGkAFA3A95VYMnLGSoLehWH5uYbN1dvU8cIEH4/Ad1BJ9f0/138jpXJwZDjHG+1tVlYuII7G7uReOehlmQdOBoDhPI6EMQc9yrqxRWs7jIQRFmByXDXi1zZmPWKX2DuL6S8fB3t6V8tZq8kt499gxw467V1xzgdknkvcBj7XX0RqX2/9xv7zl4FjbeL4h7LOWMQ0tKBA3J5RVK21y6GdDhx68KoaeQfADCRP4SElrUlDq7WZaLlInQoC5vo5MAppBnOoaIY1d6VY6q1eyeBd1Bb8XFTbuGaEoD69EWC2fcA80SfvmkA8BdBr3rvqOV8uNW0IhL6qYFI23LBJq/65vEgNb4faIoBmfBSNRXJ5rsEsAVliiO2ZHwkNdLd255IaHxDf2CqOLrECBW8lyPwnu9jAJsN1RY1ZoMmBtvoCTYUPpU/PK60vDQn2PpAaicnzEipLLMC9hh7Tsdy8YuUrveBaHkcgTfloctjCCoyiIOS0zCMCTVOMZ5GaMoZOUCqIj1KquTGglJ065RQJzhic6CfZQzvLMzaIfENsfoY+BvxXuv0eQOLYF4Rg3uEi3yzGyAZl5JtFCmWLrZrOJ3uzGf7SXIm61wUvu1MzOud8XVA8fNVObSaWnPoNAEEgflCAGudrG8Bd4YwDM/pSUIW4fc2kYIrAY/TmLu9C/tJkbddrmfoxuJ2bEHDUtEf0dA4ZwVVPa6RZqmeRl8nJlmQvvC+roZ7I4UXHe/RznnPLfw4zm9X1w+2tWZBaM5ir30HCC6DAbqvQBWam/d1MiHp2MObH+svhbk5h33ORK7pW19fWxgI22zf3hy2/DfeglElIjqTw0Oxb0m8+yfdQXwqNY60h2Xy+E9ie9EOFcLzZcKJQGmri5q0NRXmwNl4ysUEQyi3yAFDOFj2IS6GNbfTjHUofdh3x85aOkN9XDi3xwaVnGNPjO1uqZzSh+QGRgiewnb7zsE7/mbcQjgkSSsWKLvqPBRdPEdwx3Ez6CVv3SGV5u0QOQf7RDkIbil8j+VuwjchlTd879KYTDXEByuhaaQ8M/KmriyHii2qifOccfXuyNSnodZxHRV4b9fahiQCxEzYynWTyUnSFynV5jdLYN9E8K5h5NhAul+hmyk2UgD1pCgYEQ2eCeBB3QfX2v+5TtNld501cLsHclZIEIs3ELvSfVbtwXN714gkidYwEr7XGzMHi3pGvAMsa5TkPN4cqJ+bsMKgJb2rG5q8ZKs3z9DlMq7zHx7WEnkPbl8W9i+wi7oYDRKutLGokPT33pOD081+aDxWifvTjB20afEp4uJDLU8z2tfCbQvpYwwW1aSzSQ5cKB4UlkmnC6rFXhVu59wOXCiqn/83fRfF5TzvJ7m/uZJr+eGpH9TSA5Lixol0z9F0JX/4pHMhMIH9RMBeqdr73BkEU0vuca5kX1gZ2QnPa+wREsLAUzCJQa4qRMAmFXEevX1fojas0OuOtE+ZZXKkSyg2QaiFLC2GVpVeJjUTq3Xb6Iwk7ozXA5R+hPs4PxZ9MWqz+Kuwntw+buj63wEpnYgY+rGrLgju+eJ/BVC1Y44qCSEn3yXg+AwWJPNXvJm3bpNiz8YZCeQzpv7PyVbF9X61eut91vNpZmj+pt1SEN1/271pqjbAoUfnnsB2J/sx/ci3HtaLkLddbbxBgcfSu7Sl2V8xhHAqfRjfd6v+Oz7GCvnG+BvCDEFAAzaGN9618ILvysU3Q2hxv1paUB08OcvFOC3q9ZKlWVmlT9Hp9vId9ajaEt+F2ODOeteHC3Nm3BCt4gCvbX6DHjlICScjwcWc21MUOg6UHcthyrs1xaD4EgU0Viaq6873nYubAjz34L9a//b+lUXkxl5zkeBB4bmbKMBwliAKaOduJLHmGaVtBDfX33VIyYBrcleNxqkaqPkbNuZX2aTJDCrbfhkjOMzE5bRRcUijeO2GCrdq7qGBjV95NlAg91Sj0pVBoaKARSxVjARKMY95gLuaRBQBDnrEkKoj8BJGNkOE+DFDcWPN0AptnWEjRe8MW0GKZ9hJwFdutAbo1a1T2kmxNuxSpVODV91pNFOXau6qbaLqdhu6GNm5naqBz9PFp1uFTt243Bi8atTp0ZyqIOpO/YHatELwMLHL2CKNJBrJbwCJa/zVyOhEeBnIzLtS/01uqtOm3YDr9Tr1KvlQeQXhD6ym39rYUWnTuNVViopGD+p63wF4YLIqbaoNUBv0CK9RYoZ6oG4UdIg+DRrSC7rLg6o3dVVDGFPA7XKq0GLPzmNzg2WVCv+PvulyhQXkUenLGeOOWyodUOWgxQiIqpF8RlbjtrvuoaCiobvvgYceYWBiheglVctv/tgTdZ5Z4pDDeL4/yv5iImLPvVDv5QP6D5b7SkGv4dF71chdLTYzuLepyRdm7T57Px0srGzsXunWq0/P4+81V0gP86t+/nEGDBk2aAvUET4/+AUEzRESNmKyKSY98v/Rin1zVonLrthgoxy58n5fgXwk/782ZLETe3HgyU9ffeOqyDWz5MtwKNaeeJ6wtorjJEw2rVLllNRSuLh0VGbo7NvroktuOO6Ek065HgajLkiIM2NWhoWbN3cQGAWWqbA9bBziJu5ESzJppnnmmm+aMp9owrPAR68tpPPWB2+q/+PLDUm59WRJGraHUVe7nkki7qrDkrFOsojTBnIUjonARH9F9tyaX4xTs31eBK9TO80nm9WUDr/PSCirGokC);}";
    }

    function speech() internal pure returns (string memory) {
        return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB9AAAAfQAgMAAADnVizqAAAADFBMVEUAAAD///8AAAAdHR1AT0ftAAAAAXRSTlMAQObYZgAACBVJREFUeNrs2sEJg1AABFHTmU3YTC7pR0iJwYDgUYi3fOe9Fgb2tBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwF9bGZzoQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQdN1G4ObLnssDG6+POrvhcE914PoGaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQT9H3w6fhcG9toNnXNA8nTHqt7UPvegtogeJHiR6kOhBogeJHiR6kOhBogeJHiR6kOhBogeJHiR6kOhB59E9425rf8u5xwXNlr1n33jRW77s0YEAAAAAgCB/60EuhaQPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+KXTs4bRiIoig66UxNuBlv1I96DEqUhQxBNnjpued0MFz4s3miB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGP6A9fN6a2jAv7r+8bE1qPtuPkxhf8XXbRW0QPEj1I9CDRg0QPEj1I9CDRg0QPEj1I9CDRg0QPEj1I9CDRg/5FN5QrWMZL+8FabgrrGXO8th0c+incz5iiZ4geJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiBz2Nbi03r2W8bf8Ul2u+dWe8b/sUlx/RfUP0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0oDGpbXsWfeZXx4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4n+w84dnTAIBUAQ1M7SWfoR0mBAXiSggliBO9PCwn1ekOhBogeJHiR6kOhBogeJHiR6kOhBogeJHiR6kOhBokfNogeNzSp6y3/jRW8RPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGD7qK/x2bisY7oV6+JJ3MmVzR2q+gZy+4jeoboQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoZbPoQePwFb1iOYleIXqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJDoAAAAAAAAAAAAAAAAA/NiDAwEAAAAAIP/XRlBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFfbgQAAAAAAAyP+1EVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVhT04EAAAAAAA8n9tBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYQ8OBAAAAACA/F8bQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV2IMDAQAAAAAg/9dGUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUV9uBAAAAAAADI/7URVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWFPTgQAAAAAADyf20EVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVhDw4EAAAAAID8XxtBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXYgwMBAAAAACD/10ZQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRX24EAAAAAAAMj/tRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYU9OBAAAAAAAPJ/bQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWEPDgQAAAAAgPxfG0FVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdqDQwIAAAAAQf9fe8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcBbQ4SRypNCDlAAAAAElFTkSuQmCC";
    }

    function getSVG(string memory _cs, string memory _imgURI, string memory _token) internal pure returns (string memory) {
        string[7] memory parts;
		parts[0] = "<svg width='2000' height='2000' viewBox='0 0 2000 2000' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns='http://www.w3.org/2000/svg'>";
        parts[1] = string(abi.encodePacked("<style type='text/css'>", degenSVG.font(), "</style>"));
        parts[2] = string(abi.encodePacked("<filter id='this_image' x='0%' y='0%' width='100%' height='100%'><feImage xlink:href='",_imgURI, _token));
        parts[3] = string(abi.encodePacked("'/></filter><filter id='custom_text' x='0%' y='0%' width='100%' height='100%'><feImage xlink:href='", degenSVG.speech(), "'/></filter>"));
        parts[4] = "<rect width='100%' height='100%' x='0%' y='0%' filter='url(#this_image)'/><rect width='100%' height='100%' x='0%' y='0%' filter='url(#custom_text)'/><text dominant-baseline='middle' text-anchor='middle' x='50%' y='10.5%' font-family='&quot;Press Start 2P&quot;,cursive' font-size='10em' textLength='1800' lengthAdjust='spacingAndGlyphs'>";
        parts[5] = _cs;
        parts[6] = "</text></svg>";

        return string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]));
    }

    function desc() internal pure returns (string memory) {
        return "4444 Degens preparing to take over the ethereum blockchain. Created by Degens for Degens!";
    }

    function getJSON(uint256 token, string memory _imgURI, string memory _cs) internal pure returns (string memory) {
        
        string memory json = (string(abi.encodePacked('{"name": "Degenarios #', Strings.toString(token + 1), '", "external_url": "https://degenarios.wtf", ', '"description": "', degenSVG.desc(),'", "attributes":[{"trait_type": "Speech", "value": "', _cs, '"},{"trait_type": "Custom Speech", "value": "Yes"}], "image_data": "', degenSVG.getSVG(_cs, _imgURI, Strings.toString(token)), '"}')));
        return string(abi.encodePacked('data:application/json;base64,', Base64.encode(bytes(json))));
    }
}

contract Degenarios is ERC721A, Ownable {
    using Strings for uint256;
    uint256 public constant maxSupply = 4444;

    bool public csAllowed = false;
    bool public bOpen = false;
    bool public bPaused = true;

    uint256 public mintedWLAmt = 0;
    uint256 public mintedFreeAmt = 0;

    uint256 public supplyWL = 1249;
    uint256 public supplyFree = 3195;

    uint256 public maxPerMint = 3;
    uint256 public maxPerWallet = 3;

    mapping(uint256 => string) _tokCS;

    mapping(address => uint256) public minted;
    mapping(address => uint256) public mintedWL;
    mapping(address => uint256) public mintedFree;

    bytes32 public merkleRoot;
    string private _imgURI = "";
    string private _bURIExt = "";

    constructor() ERC721A("Degenarios", "DEGENARIOS") {}

    function _checkFlags() private view {
        require(!bPaused, "Contract Paused");
    }

    modifier checkFlags() {
        _checkFlags();
        _;
    }

    function setPaused(bool b) external onlyOwner {
        bPaused = b;
    }

    function setPublic(bool b) external onlyOwner {
        bOpen = b;
    }

    function setCSAllowed(bool b) external onlyOwner {
        csAllowed = b;
    }

    function devSetCS(uint256 token, string memory _cs) external onlyOwner {
        _tokCS[token] = _cs;
    }

    function setCS(uint256 token, string memory _cs) external {
        require(token >= 0 && token <= totalSupply(),"nonexistent token");
        require(csAllowed, "Cust Speech isn't allowed.");
        
        address owner = ERC721A.ownerOf(token);
        require(msg.sender == owner, 'Non-owned token.');
        
        require((4*((bytes(_cs)).length / 3)) < 85, 'Max len exceeded!');

        _tokCS[token] = _cs;
    }

    function tokenURI(uint256 token) public view virtual override returns (string memory) {
        require(token >= 0 && token <= totalSupply(),"nonexistent token");

        if(bytes(_tokCS[token]).length > 0) {
            return _tokSVG(token);
        }
        else {
            return string(abi.encodePacked(_bURIExt, token.toString()));    
        }
    }

    function tokenIMG(uint256 token) public view virtual returns (string memory) {
        require(token >= 0 && token <= totalSupply(),"nonexistent token");

        if(bytes(_tokCS[token]).length > 0) {
            return degenSVG.getSVG(string(Base64.decode(_tokCS[token])), _imgURI, token.toString());
        }
        else {
            return string(abi.encodePacked(_imgURI, token.toString()));    
        }
    }

    function _tokSVG(uint256 token) private view returns (string memory) {
        return degenSVG.getJSON(token, _imgURI, string(Base64.decode(_tokCS[token])));
    }

    function setmaxPerMint(uint256 a) external onlyOwner {
        maxPerMint = a;
    }

    function setmaxPerWallet(uint256 a) external onlyOwner {
        maxPerWallet = a;
    }
    
    function setImageURI(string memory u) external onlyOwner {
        _imgURI = u;
    }

    function setBaseURI(string memory u) external onlyOwner {
        _bURIExt = u;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _bURIExt;
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(msg.sender), balance);
    }

    function setWLSupply(uint a) external onlyOwner {
        supplyWL = a;
    }

    function setFreeSupply(uint a) external onlyOwner {
        supplyFree = a;
    }

    function setMerkleRoot(bytes32 data) external onlyOwner {
        merkleRoot = data;
    }

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

    function claimWLDegen(bytes32[] calldata merkleProof) external checkFlags {

        require(mintedWL[msg.sender] < 1, "WL Wallet limit reached");
        require((mintedWLAmt + 1) <= supplyWL, "No WL mint left");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(merkleProof, merkleRoot, leaf), "Invalid WL proof");

        uint256 avail = maxSupply - mintedWLAmt - mintedFreeAmt;
        require(avail > 0, "Sold out!"); 

        mintedWLAmt += 1;
        mintedWL[msg.sender] += 1;
        minted[msg.sender] += 1;

        _safeMint(msg.sender, 1);
    }

    function claimFreeDegen(uint amount) external checkFlags {
        require(bOpen, "!Public");

        uint256 mAmt = amount;
        require(mAmt <= maxPerMint, "Exceeded max mint");
        require((mintedFreeAmt + mAmt) <= supplyFree, "No Free mint left");
        require((minted[msg.sender] + mAmt) <= maxPerWallet, "Wallet limit reached");

        uint256 avail = maxSupply - mintedWLAmt - mintedFreeAmt;
        require(avail > 0, "Sold out!");

        mAmt = Math.min(mAmt, avail);

        mintedFreeAmt += mAmt;
        mintedFree[msg.sender] += mAmt;
        minted[msg.sender] += mAmt;

        _safeMint(msg.sender, mAmt);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimFreeDegen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimWLDegen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"csAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"string","name":"_cs","type":"string"}],"name":"devSetCS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedFreeAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedWLAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"u","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"string","name":"_cs","type":"string"}],"name":"setCS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setCSAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"u","type":"string"}],"name":"setImageURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setWLSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setmaxPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setmaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"tokenIMG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6007805462ffffff60a01b1916600160b01b1790556000600881905560098190556104e1600a55610c7b600b556003600c819055600d5560a0604081905260808290526200005191601391906200016e565b5060408051602081019182905260009081905262000072916014916200016e565b503480156200008057600080fd5b506040518060400160405280600a815260200169446567656e6172696f7360b01b8152506040518060400160405280600a815260200169444547454e4152494f5360b01b8152508160019080519060200190620000df9291906200016e565b508051620000f59060029060208401906200016e565b505050620001126200010c6200011860201b60201c565b6200011c565b62000251565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200017c9062000214565b90600052602060002090601f016020900481019282620001a05760008555620001eb565b82601f10620001bb57805160ff1916838001178555620001eb565b82800160010185558215620001eb579182015b82811115620001eb578251825591602001919060010190620001ce565b50620001f9929150620001fd565b5090565b5b80821115620001f95760008155600101620001fe565b600181811c908216806200022957607f821691505b602082108114156200024b57634e487b7160e01b600052602260045260246000fd5b50919050565b615c1c80620002616000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c80636f6eac0d11610182578063a22cb465116100e9578063d5abeb01116100a2578063e985e9c51161007c578063e985e9c51461062c578063f2fde38b14610668578063f676308a1461067b578063ff260b591461068e57600080fd5b8063d5abeb01146105fd578063dbd4e9d814610606578063e1d1ce181461061957600080fd5b8063a22cb4651461059f578063b88d4fde146105b2578063bcc295a1146105c5578063c87b56dd146105ce578063cb889594146105e1578063d03a8585146105ea57600080fd5b80638da5cb5b1161013b5780638da5cb5b146105395780639032bff01461054a57806395d89b411461055d5780639aa5d57f146105655780639b68a6c614610579578063a194190d1461058c57600080fd5b80636f6eac0d146104d957806370a08231146104e2578063715018a6146104f55780637cb64759146104fd5780638462151c1461051057806389cfa3641461053057600080fd5b80632f745c59116102415780634f6ccce7116101fa57806359695dd3116101d457806359695dd31461048c5780635cbcec4e146104a057806360d3e1ae146104b35780636352211e146104c657600080fd5b80634f6ccce71461045d578063507e094f1461047057806355f804b31461047957600080fd5b80632f745c591461040057806338cc0c15146104135780633948b8cc146104265780633ccfd60b1461043957806342842e0e14610441578063453c23101461045457600080fd5b806316c38b3c1161029357806316c38b3c1461037f57806318160ddd146103925780631e7269c5146103a457806320984801146103c457806323b872dd146103e45780632eb4a7ab146103f757600080fd5b806301ffc9a7146102db57806304787ca21461030357806306fdde0314610318578063081812fc1461032d578063095ea7b31461035857806311319b1e1461036b575b600080fd5b6102ee6102e9366004612a0d565b6106ae565b60405190151581526020015b60405180910390f35b610316610311366004612ad5565b61071b565b005b610320610765565b6040516102fa9190612b61565b61034061033b366004612b74565b6107f7565b6040516001600160a01b0390911681526020016102fa565b610316610366366004612ba4565b610882565b6007546102ee90600160b01b900460ff1681565b61031661038d366004612bde565b61099a565b6000545b6040519081526020016102fa565b6103966103b2366004612bf9565b600f6020526000908152604090205481565b6103966103d2366004612bf9565b60116020526000908152604090205481565b6103166103f2366004612c14565b6109e2565b61039660125481565b61039661040e366004612ba4565b6109ed565b610316610421366004612bde565b610b49565b610316610434366004612b74565b610b91565b610316610bc0565b61031661044f366004612c14565b610bf8565b610396600d5481565b61039661046b366004612b74565b610c13565b610396600c5481565b610316610487366004612ad5565b610c75565b6007546102ee90600160a01b900460ff1681565b6103166104ae366004612bde565b610cb2565b6103166104c1366004612b74565b610cfa565b6103406104d4366004612b74565b610d29565b61039660095481565b6103966104f0366004612bf9565b610d3b565b610316610dcc565b61031661050b366004612b74565b610e02565b61052361051e366004612bf9565b610e31565b6040516102fa9190612c50565b61039660085481565b6007546001600160a01b0316610340565b610320610558366004612b74565b610eef565b6103206110ae565b6007546102ee90600160a81b900460ff1681565b610316610587366004612b74565b6110bd565b61031661059a366004612c94565b6110ec565b6103166105ad366004612d08565b61132e565b6103166105c0366004612d3b565b6113f3565b610396600a5481565b6103206105dc366004612b74565b611426565b610396600b5481565b6103166105f8366004612b74565b611485565b61039661115c81565b610316610614366004612db6565b6116a1565b610316610627366004612db6565b6116ea565b6102ee61063a366004612dfc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610316610676366004612bf9565b611838565b610316610689366004612b74565b6118d0565b61039661069c366004612bf9565b60106020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b14806106df57506001600160e01b03198216635b5e139f60e01b145b806106fa57506001600160e01b0319821663780e9d6360e01b145b8061071557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b0316331461074e5760405162461bcd60e51b815260040161074590612e26565b60405180910390fd5b805161076190601390602084019061293b565b5050565b60606001805461077490612e5b565b80601f01602080910402602001604051908101604052809291908181526020018280546107a090612e5b565b80156107ed5780601f106107c2576101008083540402835291602001916107ed565b820191906000526020600020905b8154815290600101906020018083116107d057829003601f168201915b5050505050905090565b6000610804826000541190565b6108665760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610745565b506000908152600560205260409020546001600160a01b031690565b600061088d82610d29565b9050806001600160a01b0316836001600160a01b031614156108fc5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610745565b336001600160a01b03821614806109185750610918813361063a565b61098a5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610745565b6109958383836118ff565b505050565b6007546001600160a01b031633146109c45760405162461bcd60e51b815260040161074590612e26565b60078054911515600160b01b0260ff60b01b19909216919091179055565b61099583838361195b565b60006109f883610d3b565b8210610a515760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610745565b600080549080805b83811015610ae9576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610aab57805192505b876001600160a01b0316836001600160a01b03161415610ae05786841415610ad95750935061071592505050565b6001909301925b50600101610a59565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610745565b6007546001600160a01b03163314610b735760405162461bcd60e51b815260040161074590612e26565b60078054911515600160a01b0260ff60a01b19909216919091179055565b6007546001600160a01b03163314610bbb5760405162461bcd60e51b815260040161074590612e26565b600a55565b6007546001600160a01b03163314610bea5760405162461bcd60e51b815260040161074590612e26565b47610bf53382611c3e565b50565b610995838383604051806020016040528060008152506113f3565b600080548210610c715760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610745565b5090565b6007546001600160a01b03163314610c9f5760405162461bcd60e51b815260040161074590612e26565b805161076190601490602084019061293b565b6007546001600160a01b03163314610cdc5760405162461bcd60e51b815260040161074590612e26565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6007546001600160a01b03163314610d245760405162461bcd60e51b815260040161074590612e26565b600d55565b6000610d3482611d57565b5192915050565b60006001600160a01b038216610da75760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610745565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610df65760405162461bcd60e51b815260040161074590612e26565b610e006000611e2d565b565b6007546001600160a01b03163314610e2c5760405162461bcd60e51b815260040161074590612e26565b601255565b60606000610e3e83610d3b565b905080610e5f5760408051600080825260208201909252905b509392505050565b6000816001600160401b03811115610e7957610e79612a2a565b604051908082528060200260200182016040528015610ea2578160200160208202803683370190505b50905060005b82811015610e5757610eba85826109ed565b828281518110610ecc57610ecc612e90565b602090810291909101015280610ee181612ebc565b915050610ea8565b50919050565b6060610efa60005490565b821115610f195760405162461bcd60e51b815260040161074590612ed7565b6000828152600e602052604081208054610f3290612e5b565b90501115611077576000828152600e60205260409020805461071591610fde91610f5b90612e5b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8790612e5b565b8015610fd45780601f10610fa957610100808354040283529160200191610fd4565b820191906000526020600020905b815481529060010190602001808311610fb757829003601f168201915b5050505050611e7f565b60138054610feb90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461101790612e5b565b80156110645780601f1061103957610100808354040283529160200191611064565b820191906000526020600020905b81548152906001019060200180831161104757829003601f168201915b50505050506110728561202f565b612134565b60136110828361202f565b604051602001611093929190612f1e565b6040516020818303038152906040529050919050565b919050565b60606002805461077490612e5b565b6007546001600160a01b031633146110e75760405162461bcd60e51b815260040161074590612e26565b600c55565b6110f4612274565b336000908152601060205260409020546001116111535760405162461bcd60e51b815260206004820152601760248201527f574c2057616c6c6574206c696d697420726561636865640000000000000000006044820152606401610745565b600a54600854611164906001612fc5565b11156111a45760405162461bcd60e51b815260206004820152600f60248201526e139bc815d3081b5a5b9d081b19599d608a1b6044820152606401610745565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061121e8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506122c0565b61125d5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102ba610383937b7b360811b6044820152606401610745565b600060095460085461115c6112729190612fdd565b61127c9190612fdd565b9050600081116112ba5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610745565b6001600860008282546112cd9190612fc5565b90915550503360009081526010602052604081208054600192906112f2908490612fc5565b9091555050336000908152600f60205260408120805460019290611317908490612fc5565b9091555061132890503360016122d6565b50505050565b6001600160a01b0382163314156113875760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610745565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113fe84848461195b565b61140a848484846122f0565b6113285760405162461bcd60e51b815260040161074590612ff4565b606061143160005490565b8211156114505760405162461bcd60e51b815260040161074590612ed7565b6000828152600e60205260408120805461146990612e5b565b9050111561147a57610715826123fd565b60146110828361202f565b61148d612274565b600754600160a81b900460ff166114d05760405162461bcd60e51b8152602060048201526007602482015266215075626c696360c81b6044820152606401610745565b600c5481908111156115185760405162461bcd60e51b8152602060048201526011602482015270115e18d959591959081b585e081b5a5b9d607a1b6044820152606401610745565b600b54816009546115299190612fc5565b111561156b5760405162461bcd60e51b8152602060048201526011602482015270139bc8119c9959481b5a5b9d081b19599d607a1b6044820152606401610745565b600d54336000908152600f6020526040902054611589908390612fc5565b11156115ce5760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d081b1a5b5a5d081c995858da195960621b6044820152606401610745565b600060095460085461115c6115e39190612fdd565b6115ed9190612fdd565b90506000811161162b5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610745565b61163582826124b2565b915081600960008282546116499190612fc5565b9091555050336000908152601160205260408120805484929061166d908490612fc5565b9091555050336000908152600f602052604081208054849290611691908490612fc5565b90915550610995905033836122d6565b6007546001600160a01b031633146116cb5760405162461bcd60e51b815260040161074590612e26565b6000828152600e6020908152604090912082516109959284019061293b565b60005482111561170c5760405162461bcd60e51b815260040161074590612ed7565b600754600160a01b900460ff166117655760405162461bcd60e51b815260206004820152601a60248201527f43757374205370656563682069736e277420616c6c6f7765642e0000000000006044820152606401610745565b600061177083610d29565b9050336001600160a01b038216146117bd5760405162461bcd60e51b815260206004820152601060248201526f2737b716b7bbb732b2103a37b5b2b71760811b6044820152606401610745565b6055600383516117cd919061305d565b6117d8906004613071565b106118195760405162461bcd60e51b81526020600482015260116024820152704d6178206c656e2065786365656465642160781b6044820152606401610745565b6000838152600e6020908152604090912083516113289285019061293b565b6007546001600160a01b031633146118625760405162461bcd60e51b815260040161074590612e26565b6001600160a01b0381166118c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610745565b610bf581611e2d565b6007546001600160a01b031633146118fa5760405162461bcd60e51b815260040161074590612e26565b600b55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061196682611d57565b80519091506000906001600160a01b0316336001600160a01b0316148061199d575033611992846107f7565b6001600160a01b0316145b806119af575081516119af903361063a565b905080611a195760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610745565b846001600160a01b031682600001516001600160a01b031614611a8d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610745565b6001600160a01b038416611af15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610745565b611b0160008484600001516118ff565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b031602179055908601808352912054909116611bf457611ba8816000541190565b15611bf457825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b80471015611c8e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610745565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cdb576040519150601f19603f3d011682016040523d82523d6000602084013e611ce0565b606091505b50509050806109955760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610745565b6040805180820190915260008082526020820152611d76826000541190565b611dd55760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610745565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611e23579392505050565b5060001901611dd7565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516060908290611ea0576040805160008082526020820190925290610e57565b60048151611eae9190613090565b15611efb5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420626173653634206465636f64657220696e707574000000006044820152606401610745565b60006040518060a0016040528060808152602001614179608091399050600060048351611f28919061305d565b611f33906003613071565b90506000611f42826020612fc5565b6001600160401b03811115611f5957611f59612a2a565b6040519080825280601f01601f191660200182016040528015611f83576020820181803683370190505b5090508351840151603d60ff82161415611fb257600183039250613d3d61ffff82161415611fb2576001830392505b50818152600183018485518101602084015b8183101561202157600483019250825160ff8082168601511660ff808360081c168701511660061b0160ff808360101c1687015116600c1b60ff808460181c168801511660121b010190508060e81b825250600381019050611fc4565b509298975050505050505050565b6060816120535750506040805180820190915260018152600360fc1b602082015290565b8160005b811561207d578061206781612ebc565b91506120769050600a8361305d565b9150612057565b6000816001600160401b0381111561209757612097612a2a565b6040519080825280601f01601f1916602001820160405280156120c1576020820181803683370190505b5090505b841561212c576120d6600183612fdd565b91506120e3600a86613090565b6120ee906030612fc5565b60f81b81838151811061210357612103612e90565b60200101906001600160f81b031916908160001a905350612125600a8661305d565b94506120c5565b949350505050565b606061213e6129bb565b6040518060c00160405280608681526020016135596086913981526121616124ca565b60405160200161217191906130a4565b60408051808303601f19018152918152602080840192909252516121999186918691016130fb565b60408051808303601f190181529181528201526121b46124ed565b6040516020016121c4919061319b565b60408051808303601f19018152918152606083019190915280516101808101909152610151808252615a9660208301396080820190815260a08201868152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b60208083019190915260c0860182905285518187015184880151606089015197519651955161225b989397929691959394929391920161324e565b6040516020818303038152906040529150509392505050565b600754600160b01b900460ff1615610e005760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd0814185d5cd959608a1b6044820152606401610745565b6000826122cd8584612510565b14949350505050565b61076182826040518060200160405280600081525061257c565b60006001600160a01b0384163b156123f257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123349033908990889088906004016132e0565b602060405180830381600087803b15801561234e57600080fd5b505af192505050801561237e575060408051601f3d908101601f1916820190925261237b9181019061331d565b60015b6123d8573d8080156123ac576040519150601f19603f3d011682016040523d82523d6000602084013e6123b1565b606091505b5080516123d05760405162461bcd60e51b815260040161074590612ff4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061212c565b506001949350505050565b6060610715826013805461241090612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461243c90612e5b565b80156124895780601f1061245e57610100808354040283529160200191612489565b820191906000526020600020905b81548152906001019060200180831161246c57829003601f168201915b5050506000878152600e6020526040902080546124ad9350909150610f5b90612e5b565b612589565b60008183106124c157816124c3565b825b9392505050565b6060604051806118c0016040528061189d81526020016141f961189d9139905090565b606060405180610b800160405280610b5a81526020016135df610b5a9139905090565b600081815b8451811015610e5757600085828151811061253257612532612e90565b602002602001015190508083116125585760008381526020829052604090209250612569565b600081815260208490526040902092505b508061257481612ebc565b915050612515565b61099583838360016125f4565b606060006125a061259b866001612fc5565b61202f565b6125a86127b6565b846125b786886110728b61202f565b6040516020016125ca949392919061333a565b60405160208183030381529060405290506125e4816127d6565b60405160200161225b91906134ba565b6000546001600160a01b0385166126575760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610745565b836126b55760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610745565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b858110156127ad5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156127a15761278560008884886122f0565b6127a15760405162461bcd60e51b815260040161074590612ff4565b60019182019101612732565b50600055611c37565b606060405180608001604052806059815260200161350060599139905090565b60608151600014156127f657505060408051602081019091526000815290565b600060405180606001604052806040815260200161413960409139905060006003845160026128259190612fc5565b61282f919061305d565b61283a906004613071565b90506000612849826020612fc5565b6001600160401b0381111561286057612860612a2a565b6040519080825280601f01601f19166020018201604052801561288a576020820181803683370190505b509050818152600183018586518101602084015b818310156128f6576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161289e565b60038951066001811461291057600281146129215761292d565b613d3d60f01b60011983015261292d565b603d60f81b6000198301525b509398975050505050505050565b82805461294790612e5b565b90600052602060002090601f01602090048101928261296957600085556129af565b82601f1061298257805160ff19168380011785556129af565b828001600101855582156129af579182015b828111156129af578251825591602001919060010190612994565b50610c719291506129e2565b6040518060e001604052806007905b60608152602001906001900390816129ca5790505090565b5b80821115610c7157600081556001016129e3565b6001600160e01b031981168114610bf557600080fd5b600060208284031215612a1f57600080fd5b81356124c3816129f7565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612a5a57612a5a612a2a565b604051601f8501601f19908116603f01168101908282118183101715612a8257612a82612a2a565b81604052809350858152868686011115612a9b57600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612ac657600080fd5b6124c383833560208501612a40565b600060208284031215612ae757600080fd5b81356001600160401b03811115612afd57600080fd5b61212c84828501612ab5565b60005b83811015612b24578181015183820152602001612b0c565b838111156113285750506000910152565b60008151808452612b4d816020860160208601612b09565b601f01601f19169290920160200192915050565b6020815260006124c36020830184612b35565b600060208284031215612b8657600080fd5b5035919050565b80356001600160a01b03811681146110a957600080fd5b60008060408385031215612bb757600080fd5b612bc083612b8d565b946020939093013593505050565b803580151581146110a957600080fd5b600060208284031215612bf057600080fd5b6124c382612bce565b600060208284031215612c0b57600080fd5b6124c382612b8d565b600080600060608486031215612c2957600080fd5b612c3284612b8d565b9250612c4060208501612b8d565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612c8857835183529284019291840191600101612c6c565b50909695505050505050565b60008060208385031215612ca757600080fd5b82356001600160401b0380821115612cbe57600080fd5b818501915085601f830112612cd257600080fd5b813581811115612ce157600080fd5b8660208260051b8501011115612cf657600080fd5b60209290920196919550909350505050565b60008060408385031215612d1b57600080fd5b612d2483612b8d565b9150612d3260208401612bce565b90509250929050565b60008060008060808587031215612d5157600080fd5b612d5a85612b8d565b9350612d6860208601612b8d565b92506040850135915060608501356001600160401b03811115612d8a57600080fd5b8501601f81018713612d9b57600080fd5b612daa87823560208401612a40565b91505092959194509250565b60008060408385031215612dc957600080fd5b8235915060208301356001600160401b03811115612de657600080fd5b612df285828601612ab5565b9150509250929050565b60008060408385031215612e0f57600080fd5b612e1883612b8d565b9150612d3260208401612b8d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612e6f57607f821691505b60208210811415610ee957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612ed057612ed0612ea6565b5060010190565b6020808252601190820152703737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b60008151612f14818560208601612b09565b9290920192915050565b600080845481600182811c915080831680612f3a57607f831692505b6020808410821415612f5a57634e487b7160e01b86526022600452602486fd5b818015612f6e5760018114612f7f57612fac565b60ff19861689528489019650612fac565b60008b81526020902060005b86811015612fa45781548b820152908501908301612f8b565b505084890196505b505050505050612fbc8185612f02565b95945050505050565b60008219821115612fd857612fd8612ea6565b500190565b600082821015612fef57612fef612ea6565b500390565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261306c5761306c613047565b500490565b600081600019048311821515161561308b5761308b612ea6565b500290565b60008261309f5761309f613047565b500690565b7f3c7374796c6520747970653d27746578742f637373273e0000000000000000008152600082516130dc816017850160208701612b09565b671e17b9ba3cb6329f60c11b6017939091019283015250601f01919050565b7f3c66696c7465722069643d27746869735f696d6167652720783d27302527207981527f3d273025272077696474683d273130302527206865696768743d2731303025276020820152753e3c6665496d61676520786c696e6b3a687265663d2760501b604082015260008351613178816056850160208801612b09565b83519083019061318f816056840160208801612b09565b01605601949350505050565b7f272f3e3c2f66696c7465723e3c66696c7465722069643d27637573746f6d5f7481527f6578742720783d2730252720793d273025272077696474683d2731303025272060208201527f6865696768743d2731303025273e3c6665496d61676520786c696e6b3a687265604082015262663d2760e81b60608201526000825161322b816063850160208701612b09565b6b13979f1e17b334b63a32b91f60a11b6063939091019283015250606f01919050565b6000885160206132618285838e01612b09565b8951918401916132748184848e01612b09565b89519201916132868184848d01612b09565b88519201916132988184848c01612b09565b87519201916132aa8184848b01612b09565b86519201916132bc8184848a01612b09565b85519201916132ce8184848901612b09565b919091019a9950505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061331390830184612b35565b9695505050505050565b60006020828403121561332f57600080fd5b81516124c3816129f7565b757b226e616d65223a2022446567656e6172696f73202360501b8152845160009061336c816016850160208a01612b09565b7f222c202265787465726e616c5f75726c223a202268747470733a2f2f646567656016918401918201526c03730b934b7b9973bba3311161609d1b60368201526f113232b9b1b934b83a34b7b7111d101160811b604382015285516133d8816053840160208a01612b09565b7f222c202261747472696275746573223a5b7b2274726169745f74797065223a2060539290910191820152731129b832b2b1b4111610113b30b63ab2911d101160611b60738201528451613433816087840160208901612b09565b7f227d2c7b2274726169745f74797065223a2022437573746f6d20537065656368608792909101918201527f222c202276616c7565223a2022596573227d5d2c2022696d6167655f6461746160a782015263111d101160e11b60c78201526134af6134a160cb830186612f02565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516134f281601d850160208701612b09565b91909101601d019291505056fe3434343420446567656e7320707265706172696e6720746f2074616b65206f7665722074686520657468657265756d20626c6f636b636861696e2e204372656174656420627920446567656e7320666f7220446567656e73213c7376672077696474683d273230303027206865696768743d2732303030272076696577426f783d27302030203230303020323030302720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141423941414141665141674d414141446e56697a71414141414446424d564555414141442f2f2f38414141416448523141543066744141414141585253546c4d41514f62595a6741414342564a52454655654e72733273454a67314141424648546d553359544337705230694a7759446755596933664f65394667623274424d4141414141414141414141414141414141414141414141414141414141414141414141414177463962475a7a6f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f51644e3147344f624c6e73734447362b504f7276686345393134506f476149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f515439483377366668634739746f4e6e584e41386e54487174375550766567746f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68423539453934323572663875357877584e6c72316e33336a525737377330594541414141416743422f363045756861515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b4b58547334625269496f6967363655784e75426c763149393644457155685178424e6e6a70756564304d467a3473336d6942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a48715136454750364139664e3661326a417637722b3862453171507475506b786866385858625257305150456a31493943445267305150456a31493943445267305150456a31493943445267305150456a314939434452672f35464e355172574d5a4c2b3846616267727247584f38746830632b696e637a3569695a3467654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a48715136454769427a324e6269303372325738626638556c32752b64576538622f73556c782f5266555030494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a306f4447706258735766655a5878346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346e2b773834646e54414942554151314d375357666f52306d424158695367676c69424f395043776e31656b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f6b664e6f67654e7a53703679332f6a5257385250556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e474437714b2f783262697359376f56362b4a4a334d6d567a5232712b675a792b346a656f626f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f5a62506f51655077466231694f596c65495871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a446f41414141414141414141414141414141412f4e6944417745414141414149502f58526c42565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565646666267514141414141414179502b314556525656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656685430344541414141414141386e397442465656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565951384f42414141414143412f463862515656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565632494d4441514141414141672f39644755465656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565655563975424141414141414144492f375552564656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656574650546751414141414141447966323045565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656566844773445414141414149443858787442565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656585967774d42414141414143442f31305a5156565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565258323445414141414141414d6a2f7452465556565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565955394f4241414141414141504a2f62515256565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565657455044675141414141416750786647304656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565664714451774941414141415166396665384d41414141414141414141414141414141414141414141414141414141414141426342625134535279704e43446c4141414141456c46546b5375516d43434142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e0000003f3435363738393a3b3c3d00000000000000000102030405060708090a0b0c0d0e0f101112131415161718190000000000001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233000000000040666f6e742d66616365207b20666f6e742d66616d696c793a20275072657373205374617274203250273b207372633a2075726c28646174613a6170706c69636174696f6e2f6f637465742d73747265616d3b6261736536342c643039474d674142414141414142497741417741414141415266774141424865414145414141414141414141414141414141414141414141414141414141414148494a6b426d41416847775243417277564e4a6a43344e434141453241695144673059454941574553676545554274304e4b4f696d6e515873762b65744d5a74632f6172436f4c4d726c546a37734444534b686f556f33516f6b79454275494c6436684a3430463446586f7053352f6e7053302b7666466274466a473072426f35494d6a4a4a6d463532732f39756675596d374a5057706a4b494646764c6b6d74784a4a7042654a396b312b7348743973656f3039776b46394b55414d6464544a3450717255346b3676413863642f2b334634615272736c76495076464734622b4b50474d386a77552f5933366f663732534c6a2f622f67714b5331526f526f456339474b5a42334f4a41372f653050634464514a3363494c4a49576149696c4746515a4e432f4248385954344a74664e39556a42436c706b524b47683477645377554861354f61326d676c4344655377476e6c65632b6e6e553370704c617251496233664b74304b7057333073674f6d4a2f3853694d4e66492b335752674f777979633870396338673655666e496c332b68307261482f33394b557a756a75624d6d3177464a52476b436c505237554867396731702f352b7a3037476b3238367a30317931317556397a505364395a6e643962755a53472f497853476e55757056626b5a3567586d6f354945456b774465423547304d444461426362434a47764b4b2f6c7a58374632686844396d4b78364f7347794846495977786870694f63575435702f3834763263454f4b6b305866526f6b6976696d4a7661636f784c35796471324338436b764566557852626472754844384b474466494c5162502f2f78667367784e7637334854363952773349456d6a53474f446842734d306f672f586a72796f6b6c73774843675167547a55637959614e4474446c526245545746796f52696f4136714a70546357476e3735653347784b7454525452444f6c4a456330503863326d78646778545451336471596b76544456552f436e444a6f712f73464b6a475161396e436d3972476636377149554f6f67525370494343743979643677654a56743471444b55515855565338724b39796341624331764b32397a3167327a6364786c3046556e66674651482f4a756776594171446554544b73536166356943453631736a504b7763696c672f415654714a45662f783568517170334658442f574b454945434e4943434554775167344245554753484846417868676e674b674b62314f61596b3965594a67515a714737592f5a50673877656141507a586758384e42677672436179546d62553032612f377a316e756e344c5076696741475942367a344538736c77673563666d3476383462646c476135313178774f62374c4c6245706573744d38365736797732585658586250656662466375484c6e615a5452786868726f6749494c42774342685932446934654d516b70475955646c74727070613365557a497973624278382f44796953685570455370637655614e576e57716b323348723336444e726d756531754f6d574e3038343734344958486e6e6e4d645142742b7a337841665033444458504b2f64397441796238777834714246466c707367305332374469783538695a47312f5a6375544b4e383534453254436f7941696f5347376a457145543042496a716d466c6f71616e6f614f675a6d4c6e594e54574542516946575a616855713161707952593075375470303674646741463264766659343670676a6f73674838774659414f514679483934376e44672f516177417a45413041424130545331574d454c45796978304a724c4241544a574c57714e6c6653634c7573794e73547346557a4b56504b676f7768674178657631424f77684874697055446366464a7137594542684a7163706730714d4b4f354a4b5148524d4b7844736a34546b612f48436d5462564c75696c41634738785a2b5062315771647a584a6c4c56746b7a567a5a4150493833646d3937784c64544c4b5a41594e6f39546435334641766157732b562f715756775a523539662b52715757334b2f7662495754656c66426b4661322b6a38624e65756a56705242314f785257776d362f64414459306c767a31344859575441324541326e31762b76443033594a35316f43452b507836747337585279374a5a6f697667592b434c2b65706861366d394b6471777954566b4a5a65357a6c54625a5736346a35387a65336a63516e655161714e65577848497435454b6332332f336a3070534369777478796d38624e48716465534678624c3271357263574677384c704172573241493277766b47795350734e433645684d5038526c71767533743132424249734c7058467853546a634b41464e6f524363446e34346a67536f4c6d55476d6830317043674d3958797142624433584869674433416d70652f433532554535473645664a43694f6261725a35677a37654d58495463496d57623041444c4f67524243363749304e44596b62707377382b75675a4b6e6f58536a324c79516d655241345a536d68745875444a367963424f4a716c4374566259746455395778727746396e75586f6b51674d384c5a64534a585a3268415044436d50656853767070667548595738454861714f465566454136394269574c4c486c4a395a6261586257686c35684a537743692b314d465136625747417a5251566149685236616b4b517639646f795478736a477a66436e4264557a624c4e64587a707156764c626655576757506741417546783031706a6f6272474b4741745776683447683159654b553242436e4b685570474743386364557279443057766369656c536835346c42562b5071736b3635774d6a794b6b536d73376a546b777a556c52693062705963566759387661527268686c7045317471726931535156514b364264644e796c7a554e504c733653774c633347736a6842783334716a6d6769464c3031686f5938346b6e46735267494947375346533142427a6331634f676d45535a2f4869446c7067686e794569565331346578755042485738524f51415545536d4779566c7a58786d4b7341554a6948484f69446e50716a735a436b306932324279505674426a6775574d6b4f5867776b546c733141697550585868694c3271575179656e364454534b4b7a4b35484168496d32794a513461413548513568394f3873492b695a37414157415935596b696b3857554a5331565471426e3368697933444149495557484671324e5756347530727355576f6b746d56507a64656268494a75616c3436797368756446414d49664c7744462b514b494a30703248664a69526838596c6149584932746963496752344464414c39307a45693163547064554453545a3042546254766b41745774676241643356763353587733424a394a514d71354b7331507149352f5667702b62616b31514d6c7956516f5a756775697a304432637a42794b75776c4f4743354e7852554a4f75624b34454b345677475744684751374246463930747338475259326e67675255556349754a6c5945685a69725976456d6968424545474f5975556961347977433550486b6a4e7257636f796c3232576f356f39434a47666a564d5756396153314a56344c74767947566437396d7a764c7a517458455a5a504436434e4570356a57426f4a5341514f3562557a5264374a5575764676594a6c6b4164554d45567745697a41575a784e7257595468784735554472556f506a45555a4676756779442b73526775433639687069566d49557267635964762b4b3932795a6c47374c4d4c747a553052644750444671456f546951425a386f5535317368366752336b556c735747534b5776674e424474467938626b6831334b474b67306b6449767752784a4659627737483942374d48566a367a3465324a6d4d5434784146392f564370502b615252726e46444534726f6773397964575969746a68456a386652594f456363514f6563434362423861492b6d3273774c7752495730693465684344534b304b306570586e575945796c3767547a4e7343356b683132496549773871734d566332394876674e52456c6c316764434f7874556170565057747530467a317461747a6d416458415a72707452556c74646a6a2f6e7061696f702b69507358346f63364a69503279416d446d786e324332307658345866705456726b79794f55667a6b6f37717549773236364a454e68427a2f6e7946314c396776716f58306f315843424a456554727462584f70437a4d5664696a306959626f6f554c414b65685764683562362b514853636e6d6848627043766769726c5269556a536173464d393265674c2f7579696b65583469333656756377785232776f6d2f36594a6e566e5675424658353750676b537373347a36346b616c337258436a33685a2f6e686d4537364658422f4e6a705a36624d416a3749553635382f3034374f59645a306c303057614a66746755354b356b394e346d6e43646e2f69315a636431394c644f2f796f30374152776a6b455377415469533968306e616c5a6846386d686e30464d324141687a6a57547065386d4e53794b43685341643836663136375145526f6e7169446b51685935324578722f7079774375776473447a6a2b76525a546f314f766348466b516575502b34625a2f4b636d444f644c39506f3278683369716e453664635973614c5458796354354e364f677a4a662b554d356363363632374a6941676f4e3441414f6c476b4146413341393556594d6e4c47536f4c65685748357559624e316476553863494548342f416431424a3966302f3133386a70584a775a446a48472b3174566c597549493747377552654f65686c6d51644f426f4468504936454d51633979727178525773376a495152466d427958445869317a5a6d50574b583244754c36533866423374365638745a71386b743439396778773436375631787a67646b6e6b7663426a37585830527158322f397876377a6c34466a62654c3468374c4f574d5130744b4241334a3552564b32317936476444687836384b6f6165516641444352503453456c72556c447137575a614c6c496e516f4335766f354d417070426e4f6f614959316436565936713165796542643142623858465462754761456f4436394557433266634138305366766d6b413842644272337276714f5638754e573049684c367159464932334c424a712f36357645674e62346661496f426d6642534e52584a357273457341566c69694f325a48776b4e644c643235354961487844663243714f4c7245434257386c7950776e75396a414a734e315259315a6f4d6d4274766f435459555070552f504b36307644516e325070416169636e7a4569704c4c4d433968683754736479385975557276654261486b636754666c6f63746a43436f7969494f53307a434d4354564f4d5a3547614d6f5a4f554371496a314b71755447676c4a30363552514a7a6869633643665a517a764c4d7a614966454e73666f592b4276785875763065514f4c59463452673375456933797a4779415a6c354a7446436d574c725a724f4a33757a4766375358496d363177557675314d7a4f75643858564138664e564f625361576e506f4e41454567666c43414775647247384264345977444d2f7053554957346663326b59497241592f546d4c7539432f744a6b626464726d666f78754a326245484455744566306441345a775656506136525a716d65526c386e4a6c6d517676432b726f5a374934555848652f527a6e6e504c6677347a6d395831772b3274575a42614d3569723330484343364441627176514257616d2f64314d694870324d4f62482b737668626b356833334f524b3770573139665778674932327a66336879322f446665676c456c496a715477304f7862306d382b796664515877714e593630683258792b4539696539454f46634c7a5a634b4a51476d72693571304e52586d774e6c347973554551796933794146444f466a32495336474e6266546a48556f66646833783835614f6b4e3958446933787761566e474e506a4f3175715a7a53682b514752676965776e62377a7345372f6d6263516a676b535373574b4c767150425264504564777833457a3643567633534756357530514f51663752446b4962696c386a2b5675776a63686c54643837394b595444584542797568616151384d2f4b6d726979486969327169664f6363665875794e536e6f645a7848525634623966616869514378457a59796e575479556e5346796e56356a644c594e3945384b3568354e6841756c2b686d796b32556744317043675945513265436542423351665832762b3554744e6c64353031634c7348636c5a4945497333454c76536656627477584e373134676b6964597745723758477a4d486933704776414d736135546b504e3463714a2b62734d4b674a623272473571385a4b73337a39446c4d71377a48783757456e6b50626c385739692b7769376f5944524b75744c476f6b50543333704f443038312b61447857696676546a4232306166457034754a444c55387a3274664362517670597777573161537a535135634b4234556c6b6d6e43367246586856753539774f584369716e2f38336652664635547a764a376d2f755a4a722b6547704839545341354c69786f6c307a3946304a582f3470484d684d494839524d42657164723733426b45553076756361356b5831675a32516e50612b775245734c41557a434a51613471524d416d46584565765831666f6a6173304f754f74452b5a5a584b6b53796732516169464c433247567056654a6a5554713358623649776b376f7a584135522b6850733450785a394d57717a2b4b75776e74772b62756a36337745706e5967592b7247724c676a752b654a2f42564331593434714353456e337958672b4177574a504e58764a6d3362704e697a38595a4365517a7076375079566246395836316575743931764e705a6d6a2b70743153454e312f32373170716a62416f55666e6e7342324a2f73782f6369334874614c6b4c646462627842676366537537536c325638786848417166526a666436762b4f7a374743766e472b42764344454641417a61474e39363138494c76797355335132687876317061554230384f6376464f433371395a4b6c57566d6c543948703976496439616a6145742b46324f444f6574654843334e6d334243743467437662583644486a6c494353636a7763576332314d554f6736554863746879727331786144344567553056696171363837336e597562416a7a33344c39612f2f622b6c55586b786c357a6b65424234626d624b4d42776c69414b614f64754a4c486d47615674424466583333564979594272636c654e78716b6171506b624e755a583261544a4443726266686b6a4f4d7a45356252526355696a654f324743726471377147426a5639354e6c41673931536a307056426f614b41525378566a41524b4d593935674c756152425142446e72456b4b6f6a38424a474e6b4f452b4446446357504e304170746e57456a5265384d5730474b5a39684a774664757441626f31613154326b6d784e75785370564f44563931704e464f586175367162614c7164687536474e6d356e6171427a39504670317546547432343342693861745470305a7971494f704f2f59486174454c774d4c484c32434b4e4a42724a6277434a612f7a56794f684565426e497a4c74532f30317571744f6d33594472395472314b766c51655158684436796d3339725955576e54754e5656696f7047442b703633774634594c497162616f4e55427630434b3952596f5a366f4734556449672b445272534337724c67366f33645656444746504137584b7130474c507a6d4e7a6732575643762b5076756c796851586b55656e4c47654f4f57796f64554f57677851694971704638526c626a747276756f6143696f62767667596365595742696865676c566374762f746754645a355a34704444654c342f79763569496d4c50765644763551503644356237536b477634644637316368644c54597a754c65707952646d375435375078307372477a7358756e5771302f50342b3831563067503836742b2f6e454744426b32614176554554342f2b4155457a5245534e6d4b794b53593938762f52696e317a566f6e4c727468676f787935386e35666758776b2f3738325a4c4554653348677955396666654f717944577a354d74774b4e6165654a3677746f726a4a45773272564c6c6c4e5253754c68305647626f374e76726f6b74754f4f36456b3036354867616a4c6b69494d324e57686f57624e336351474157577162413962427a694a753545537a4a70706e6e6d6d6d2b614d70396f77725041523638747050505742322b712f2b504c44556d353957524a47726148555665376e6b6b69377172446b72464f736f6a54426e49556a6f6e4152483946397479615834785473333165424b39544f38306e6d39575544722f5053436972476f6b43293b7d3c726563742077696474683d273130302527206865696768743d27313030252720783d2730252720793d273025272066696c7465723d2775726c2823746869735f696d61676529272f3e3c726563742077696474683d273130302527206865696768743d27313030252720783d2730252720793d273025272066696c7465723d2775726c2823637573746f6d5f7465787429272f3e3c7465787420646f6d696e616e742d626173656c696e653d276d6964646c652720746578742d616e63686f723d276d6964646c652720783d273530252720793d2731302e35252720666f6e742d66616d696c793d272671756f743b50726573732053746172742032502671756f743b2c637572736976652720666f6e742d73697a653d273130656d2720746578744c656e6774683d273138303027206c656e67746841646a7573743d2773706163696e67416e64476c79706873273ea2646970667358221220c8e1a04e18f99ebe24df09f9c10f0fe0a6942de22b9bb396d2093395e92394a264736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102d65760003560e01c80636f6eac0d11610182578063a22cb465116100e9578063d5abeb01116100a2578063e985e9c51161007c578063e985e9c51461062c578063f2fde38b14610668578063f676308a1461067b578063ff260b591461068e57600080fd5b8063d5abeb01146105fd578063dbd4e9d814610606578063e1d1ce181461061957600080fd5b8063a22cb4651461059f578063b88d4fde146105b2578063bcc295a1146105c5578063c87b56dd146105ce578063cb889594146105e1578063d03a8585146105ea57600080fd5b80638da5cb5b1161013b5780638da5cb5b146105395780639032bff01461054a57806395d89b411461055d5780639aa5d57f146105655780639b68a6c614610579578063a194190d1461058c57600080fd5b80636f6eac0d146104d957806370a08231146104e2578063715018a6146104f55780637cb64759146104fd5780638462151c1461051057806389cfa3641461053057600080fd5b80632f745c59116102415780634f6ccce7116101fa57806359695dd3116101d457806359695dd31461048c5780635cbcec4e146104a057806360d3e1ae146104b35780636352211e146104c657600080fd5b80634f6ccce71461045d578063507e094f1461047057806355f804b31461047957600080fd5b80632f745c591461040057806338cc0c15146104135780633948b8cc146104265780633ccfd60b1461043957806342842e0e14610441578063453c23101461045457600080fd5b806316c38b3c1161029357806316c38b3c1461037f57806318160ddd146103925780631e7269c5146103a457806320984801146103c457806323b872dd146103e45780632eb4a7ab146103f757600080fd5b806301ffc9a7146102db57806304787ca21461030357806306fdde0314610318578063081812fc1461032d578063095ea7b31461035857806311319b1e1461036b575b600080fd5b6102ee6102e9366004612a0d565b6106ae565b60405190151581526020015b60405180910390f35b610316610311366004612ad5565b61071b565b005b610320610765565b6040516102fa9190612b61565b61034061033b366004612b74565b6107f7565b6040516001600160a01b0390911681526020016102fa565b610316610366366004612ba4565b610882565b6007546102ee90600160b01b900460ff1681565b61031661038d366004612bde565b61099a565b6000545b6040519081526020016102fa565b6103966103b2366004612bf9565b600f6020526000908152604090205481565b6103966103d2366004612bf9565b60116020526000908152604090205481565b6103166103f2366004612c14565b6109e2565b61039660125481565b61039661040e366004612ba4565b6109ed565b610316610421366004612bde565b610b49565b610316610434366004612b74565b610b91565b610316610bc0565b61031661044f366004612c14565b610bf8565b610396600d5481565b61039661046b366004612b74565b610c13565b610396600c5481565b610316610487366004612ad5565b610c75565b6007546102ee90600160a01b900460ff1681565b6103166104ae366004612bde565b610cb2565b6103166104c1366004612b74565b610cfa565b6103406104d4366004612b74565b610d29565b61039660095481565b6103966104f0366004612bf9565b610d3b565b610316610dcc565b61031661050b366004612b74565b610e02565b61052361051e366004612bf9565b610e31565b6040516102fa9190612c50565b61039660085481565b6007546001600160a01b0316610340565b610320610558366004612b74565b610eef565b6103206110ae565b6007546102ee90600160a81b900460ff1681565b610316610587366004612b74565b6110bd565b61031661059a366004612c94565b6110ec565b6103166105ad366004612d08565b61132e565b6103166105c0366004612d3b565b6113f3565b610396600a5481565b6103206105dc366004612b74565b611426565b610396600b5481565b6103166105f8366004612b74565b611485565b61039661115c81565b610316610614366004612db6565b6116a1565b610316610627366004612db6565b6116ea565b6102ee61063a366004612dfc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610316610676366004612bf9565b611838565b610316610689366004612b74565b6118d0565b61039661069c366004612bf9565b60106020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b14806106df57506001600160e01b03198216635b5e139f60e01b145b806106fa57506001600160e01b0319821663780e9d6360e01b145b8061071557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b0316331461074e5760405162461bcd60e51b815260040161074590612e26565b60405180910390fd5b805161076190601390602084019061293b565b5050565b60606001805461077490612e5b565b80601f01602080910402602001604051908101604052809291908181526020018280546107a090612e5b565b80156107ed5780601f106107c2576101008083540402835291602001916107ed565b820191906000526020600020905b8154815290600101906020018083116107d057829003601f168201915b5050505050905090565b6000610804826000541190565b6108665760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610745565b506000908152600560205260409020546001600160a01b031690565b600061088d82610d29565b9050806001600160a01b0316836001600160a01b031614156108fc5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610745565b336001600160a01b03821614806109185750610918813361063a565b61098a5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610745565b6109958383836118ff565b505050565b6007546001600160a01b031633146109c45760405162461bcd60e51b815260040161074590612e26565b60078054911515600160b01b0260ff60b01b19909216919091179055565b61099583838361195b565b60006109f883610d3b565b8210610a515760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610745565b600080549080805b83811015610ae9576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610aab57805192505b876001600160a01b0316836001600160a01b03161415610ae05786841415610ad95750935061071592505050565b6001909301925b50600101610a59565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610745565b6007546001600160a01b03163314610b735760405162461bcd60e51b815260040161074590612e26565b60078054911515600160a01b0260ff60a01b19909216919091179055565b6007546001600160a01b03163314610bbb5760405162461bcd60e51b815260040161074590612e26565b600a55565b6007546001600160a01b03163314610bea5760405162461bcd60e51b815260040161074590612e26565b47610bf53382611c3e565b50565b610995838383604051806020016040528060008152506113f3565b600080548210610c715760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610745565b5090565b6007546001600160a01b03163314610c9f5760405162461bcd60e51b815260040161074590612e26565b805161076190601490602084019061293b565b6007546001600160a01b03163314610cdc5760405162461bcd60e51b815260040161074590612e26565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6007546001600160a01b03163314610d245760405162461bcd60e51b815260040161074590612e26565b600d55565b6000610d3482611d57565b5192915050565b60006001600160a01b038216610da75760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610745565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610df65760405162461bcd60e51b815260040161074590612e26565b610e006000611e2d565b565b6007546001600160a01b03163314610e2c5760405162461bcd60e51b815260040161074590612e26565b601255565b60606000610e3e83610d3b565b905080610e5f5760408051600080825260208201909252905b509392505050565b6000816001600160401b03811115610e7957610e79612a2a565b604051908082528060200260200182016040528015610ea2578160200160208202803683370190505b50905060005b82811015610e5757610eba85826109ed565b828281518110610ecc57610ecc612e90565b602090810291909101015280610ee181612ebc565b915050610ea8565b50919050565b6060610efa60005490565b821115610f195760405162461bcd60e51b815260040161074590612ed7565b6000828152600e602052604081208054610f3290612e5b565b90501115611077576000828152600e60205260409020805461071591610fde91610f5b90612e5b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8790612e5b565b8015610fd45780601f10610fa957610100808354040283529160200191610fd4565b820191906000526020600020905b815481529060010190602001808311610fb757829003601f168201915b5050505050611e7f565b60138054610feb90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461101790612e5b565b80156110645780601f1061103957610100808354040283529160200191611064565b820191906000526020600020905b81548152906001019060200180831161104757829003601f168201915b50505050506110728561202f565b612134565b60136110828361202f565b604051602001611093929190612f1e565b6040516020818303038152906040529050919050565b919050565b60606002805461077490612e5b565b6007546001600160a01b031633146110e75760405162461bcd60e51b815260040161074590612e26565b600c55565b6110f4612274565b336000908152601060205260409020546001116111535760405162461bcd60e51b815260206004820152601760248201527f574c2057616c6c6574206c696d697420726561636865640000000000000000006044820152606401610745565b600a54600854611164906001612fc5565b11156111a45760405162461bcd60e51b815260206004820152600f60248201526e139bc815d3081b5a5b9d081b19599d608a1b6044820152606401610745565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061121e8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506122c0565b61125d5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102ba610383937b7b360811b6044820152606401610745565b600060095460085461115c6112729190612fdd565b61127c9190612fdd565b9050600081116112ba5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610745565b6001600860008282546112cd9190612fc5565b90915550503360009081526010602052604081208054600192906112f2908490612fc5565b9091555050336000908152600f60205260408120805460019290611317908490612fc5565b9091555061132890503360016122d6565b50505050565b6001600160a01b0382163314156113875760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610745565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113fe84848461195b565b61140a848484846122f0565b6113285760405162461bcd60e51b815260040161074590612ff4565b606061143160005490565b8211156114505760405162461bcd60e51b815260040161074590612ed7565b6000828152600e60205260408120805461146990612e5b565b9050111561147a57610715826123fd565b60146110828361202f565b61148d612274565b600754600160a81b900460ff166114d05760405162461bcd60e51b8152602060048201526007602482015266215075626c696360c81b6044820152606401610745565b600c5481908111156115185760405162461bcd60e51b8152602060048201526011602482015270115e18d959591959081b585e081b5a5b9d607a1b6044820152606401610745565b600b54816009546115299190612fc5565b111561156b5760405162461bcd60e51b8152602060048201526011602482015270139bc8119c9959481b5a5b9d081b19599d607a1b6044820152606401610745565b600d54336000908152600f6020526040902054611589908390612fc5565b11156115ce5760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d081b1a5b5a5d081c995858da195960621b6044820152606401610745565b600060095460085461115c6115e39190612fdd565b6115ed9190612fdd565b90506000811161162b5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610745565b61163582826124b2565b915081600960008282546116499190612fc5565b9091555050336000908152601160205260408120805484929061166d908490612fc5565b9091555050336000908152600f602052604081208054849290611691908490612fc5565b90915550610995905033836122d6565b6007546001600160a01b031633146116cb5760405162461bcd60e51b815260040161074590612e26565b6000828152600e6020908152604090912082516109959284019061293b565b60005482111561170c5760405162461bcd60e51b815260040161074590612ed7565b600754600160a01b900460ff166117655760405162461bcd60e51b815260206004820152601a60248201527f43757374205370656563682069736e277420616c6c6f7765642e0000000000006044820152606401610745565b600061177083610d29565b9050336001600160a01b038216146117bd5760405162461bcd60e51b815260206004820152601060248201526f2737b716b7bbb732b2103a37b5b2b71760811b6044820152606401610745565b6055600383516117cd919061305d565b6117d8906004613071565b106118195760405162461bcd60e51b81526020600482015260116024820152704d6178206c656e2065786365656465642160781b6044820152606401610745565b6000838152600e6020908152604090912083516113289285019061293b565b6007546001600160a01b031633146118625760405162461bcd60e51b815260040161074590612e26565b6001600160a01b0381166118c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610745565b610bf581611e2d565b6007546001600160a01b031633146118fa5760405162461bcd60e51b815260040161074590612e26565b600b55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061196682611d57565b80519091506000906001600160a01b0316336001600160a01b0316148061199d575033611992846107f7565b6001600160a01b0316145b806119af575081516119af903361063a565b905080611a195760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610745565b846001600160a01b031682600001516001600160a01b031614611a8d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610745565b6001600160a01b038416611af15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610745565b611b0160008484600001516118ff565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b031602179055908601808352912054909116611bf457611ba8816000541190565b15611bf457825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b80471015611c8e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610745565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cdb576040519150601f19603f3d011682016040523d82523d6000602084013e611ce0565b606091505b50509050806109955760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610745565b6040805180820190915260008082526020820152611d76826000541190565b611dd55760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610745565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611e23579392505050565b5060001901611dd7565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516060908290611ea0576040805160008082526020820190925290610e57565b60048151611eae9190613090565b15611efb5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420626173653634206465636f64657220696e707574000000006044820152606401610745565b60006040518060a0016040528060808152602001614179608091399050600060048351611f28919061305d565b611f33906003613071565b90506000611f42826020612fc5565b6001600160401b03811115611f5957611f59612a2a565b6040519080825280601f01601f191660200182016040528015611f83576020820181803683370190505b5090508351840151603d60ff82161415611fb257600183039250613d3d61ffff82161415611fb2576001830392505b50818152600183018485518101602084015b8183101561202157600483019250825160ff8082168601511660ff808360081c168701511660061b0160ff808360101c1687015116600c1b60ff808460181c168801511660121b010190508060e81b825250600381019050611fc4565b509298975050505050505050565b6060816120535750506040805180820190915260018152600360fc1b602082015290565b8160005b811561207d578061206781612ebc565b91506120769050600a8361305d565b9150612057565b6000816001600160401b0381111561209757612097612a2a565b6040519080825280601f01601f1916602001820160405280156120c1576020820181803683370190505b5090505b841561212c576120d6600183612fdd565b91506120e3600a86613090565b6120ee906030612fc5565b60f81b81838151811061210357612103612e90565b60200101906001600160f81b031916908160001a905350612125600a8661305d565b94506120c5565b949350505050565b606061213e6129bb565b6040518060c00160405280608681526020016135596086913981526121616124ca565b60405160200161217191906130a4565b60408051808303601f19018152918152602080840192909252516121999186918691016130fb565b60408051808303601f190181529181528201526121b46124ed565b6040516020016121c4919061319b565b60408051808303601f19018152918152606083019190915280516101808101909152610151808252615a9660208301396080820190815260a08201868152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b60208083019190915260c0860182905285518187015184880151606089015197519651955161225b989397929691959394929391920161324e565b6040516020818303038152906040529150509392505050565b600754600160b01b900460ff1615610e005760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd0814185d5cd959608a1b6044820152606401610745565b6000826122cd8584612510565b14949350505050565b61076182826040518060200160405280600081525061257c565b60006001600160a01b0384163b156123f257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123349033908990889088906004016132e0565b602060405180830381600087803b15801561234e57600080fd5b505af192505050801561237e575060408051601f3d908101601f1916820190925261237b9181019061331d565b60015b6123d8573d8080156123ac576040519150601f19603f3d011682016040523d82523d6000602084013e6123b1565b606091505b5080516123d05760405162461bcd60e51b815260040161074590612ff4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061212c565b506001949350505050565b6060610715826013805461241090612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461243c90612e5b565b80156124895780601f1061245e57610100808354040283529160200191612489565b820191906000526020600020905b81548152906001019060200180831161246c57829003601f168201915b5050506000878152600e6020526040902080546124ad9350909150610f5b90612e5b565b612589565b60008183106124c157816124c3565b825b9392505050565b6060604051806118c0016040528061189d81526020016141f961189d9139905090565b606060405180610b800160405280610b5a81526020016135df610b5a9139905090565b600081815b8451811015610e5757600085828151811061253257612532612e90565b602002602001015190508083116125585760008381526020829052604090209250612569565b600081815260208490526040902092505b508061257481612ebc565b915050612515565b61099583838360016125f4565b606060006125a061259b866001612fc5565b61202f565b6125a86127b6565b846125b786886110728b61202f565b6040516020016125ca949392919061333a565b60405160208183030381529060405290506125e4816127d6565b60405160200161225b91906134ba565b6000546001600160a01b0385166126575760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610745565b836126b55760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610745565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b858110156127ad5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156127a15761278560008884886122f0565b6127a15760405162461bcd60e51b815260040161074590612ff4565b60019182019101612732565b50600055611c37565b606060405180608001604052806059815260200161350060599139905090565b60608151600014156127f657505060408051602081019091526000815290565b600060405180606001604052806040815260200161413960409139905060006003845160026128259190612fc5565b61282f919061305d565b61283a906004613071565b90506000612849826020612fc5565b6001600160401b0381111561286057612860612a2a565b6040519080825280601f01601f19166020018201604052801561288a576020820181803683370190505b509050818152600183018586518101602084015b818310156128f6576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161289e565b60038951066001811461291057600281146129215761292d565b613d3d60f01b60011983015261292d565b603d60f81b6000198301525b509398975050505050505050565b82805461294790612e5b565b90600052602060002090601f01602090048101928261296957600085556129af565b82601f1061298257805160ff19168380011785556129af565b828001600101855582156129af579182015b828111156129af578251825591602001919060010190612994565b50610c719291506129e2565b6040518060e001604052806007905b60608152602001906001900390816129ca5790505090565b5b80821115610c7157600081556001016129e3565b6001600160e01b031981168114610bf557600080fd5b600060208284031215612a1f57600080fd5b81356124c3816129f7565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612a5a57612a5a612a2a565b604051601f8501601f19908116603f01168101908282118183101715612a8257612a82612a2a565b81604052809350858152868686011115612a9b57600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612ac657600080fd5b6124c383833560208501612a40565b600060208284031215612ae757600080fd5b81356001600160401b03811115612afd57600080fd5b61212c84828501612ab5565b60005b83811015612b24578181015183820152602001612b0c565b838111156113285750506000910152565b60008151808452612b4d816020860160208601612b09565b601f01601f19169290920160200192915050565b6020815260006124c36020830184612b35565b600060208284031215612b8657600080fd5b5035919050565b80356001600160a01b03811681146110a957600080fd5b60008060408385031215612bb757600080fd5b612bc083612b8d565b946020939093013593505050565b803580151581146110a957600080fd5b600060208284031215612bf057600080fd5b6124c382612bce565b600060208284031215612c0b57600080fd5b6124c382612b8d565b600080600060608486031215612c2957600080fd5b612c3284612b8d565b9250612c4060208501612b8d565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612c8857835183529284019291840191600101612c6c565b50909695505050505050565b60008060208385031215612ca757600080fd5b82356001600160401b0380821115612cbe57600080fd5b818501915085601f830112612cd257600080fd5b813581811115612ce157600080fd5b8660208260051b8501011115612cf657600080fd5b60209290920196919550909350505050565b60008060408385031215612d1b57600080fd5b612d2483612b8d565b9150612d3260208401612bce565b90509250929050565b60008060008060808587031215612d5157600080fd5b612d5a85612b8d565b9350612d6860208601612b8d565b92506040850135915060608501356001600160401b03811115612d8a57600080fd5b8501601f81018713612d9b57600080fd5b612daa87823560208401612a40565b91505092959194509250565b60008060408385031215612dc957600080fd5b8235915060208301356001600160401b03811115612de657600080fd5b612df285828601612ab5565b9150509250929050565b60008060408385031215612e0f57600080fd5b612e1883612b8d565b9150612d3260208401612b8d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612e6f57607f821691505b60208210811415610ee957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612ed057612ed0612ea6565b5060010190565b6020808252601190820152703737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b60008151612f14818560208601612b09565b9290920192915050565b600080845481600182811c915080831680612f3a57607f831692505b6020808410821415612f5a57634e487b7160e01b86526022600452602486fd5b818015612f6e5760018114612f7f57612fac565b60ff19861689528489019650612fac565b60008b81526020902060005b86811015612fa45781548b820152908501908301612f8b565b505084890196505b505050505050612fbc8185612f02565b95945050505050565b60008219821115612fd857612fd8612ea6565b500190565b600082821015612fef57612fef612ea6565b500390565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261306c5761306c613047565b500490565b600081600019048311821515161561308b5761308b612ea6565b500290565b60008261309f5761309f613047565b500690565b7f3c7374796c6520747970653d27746578742f637373273e0000000000000000008152600082516130dc816017850160208701612b09565b671e17b9ba3cb6329f60c11b6017939091019283015250601f01919050565b7f3c66696c7465722069643d27746869735f696d6167652720783d27302527207981527f3d273025272077696474683d273130302527206865696768743d2731303025276020820152753e3c6665496d61676520786c696e6b3a687265663d2760501b604082015260008351613178816056850160208801612b09565b83519083019061318f816056840160208801612b09565b01605601949350505050565b7f272f3e3c2f66696c7465723e3c66696c7465722069643d27637573746f6d5f7481527f6578742720783d2730252720793d273025272077696474683d2731303025272060208201527f6865696768743d2731303025273e3c6665496d61676520786c696e6b3a687265604082015262663d2760e81b60608201526000825161322b816063850160208701612b09565b6b13979f1e17b334b63a32b91f60a11b6063939091019283015250606f01919050565b6000885160206132618285838e01612b09565b8951918401916132748184848e01612b09565b89519201916132868184848d01612b09565b88519201916132988184848c01612b09565b87519201916132aa8184848b01612b09565b86519201916132bc8184848a01612b09565b85519201916132ce8184848901612b09565b919091019a9950505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061331390830184612b35565b9695505050505050565b60006020828403121561332f57600080fd5b81516124c3816129f7565b757b226e616d65223a2022446567656e6172696f73202360501b8152845160009061336c816016850160208a01612b09565b7f222c202265787465726e616c5f75726c223a202268747470733a2f2f646567656016918401918201526c03730b934b7b9973bba3311161609d1b60368201526f113232b9b1b934b83a34b7b7111d101160811b604382015285516133d8816053840160208a01612b09565b7f222c202261747472696275746573223a5b7b2274726169745f74797065223a2060539290910191820152731129b832b2b1b4111610113b30b63ab2911d101160611b60738201528451613433816087840160208901612b09565b7f227d2c7b2274726169745f74797065223a2022437573746f6d20537065656368608792909101918201527f222c202276616c7565223a2022596573227d5d2c2022696d6167655f6461746160a782015263111d101160e11b60c78201526134af6134a160cb830186612f02565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516134f281601d850160208701612b09565b91909101601d019291505056fe3434343420446567656e7320707265706172696e6720746f2074616b65206f7665722074686520657468657265756d20626c6f636b636861696e2e204372656174656420627920446567656e7320666f7220446567656e73213c7376672077696474683d273230303027206865696768743d2732303030272076696577426f783d27302030203230303020323030302720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141423941414141665141674d414141446e56697a71414141414446424d564555414141442f2f2f38414141416448523141543066744141414141585253546c4d41514f62595a6741414342564a52454655654e72733273454a67314141424648546d553359544337705230694a7759446755596933664f65394667623274424d4141414141414141414141414141414141414141414141414141414141414141414141414177463962475a7a6f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f51644e3147344f624c6e73734447362b504f7276686345393134506f476149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f515439483377366668634739746f4e6e584e41386e54487174375550766567746f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68423539453934323572663875357877584e6c72316e33336a525737377330594541414141416743422f363045756861515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b4b58547334625269496f6967363655784e75426c763149393644457155685178424e6e6a70756564304d467a3473336d6942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a48715136454750364139664e3661326a417637722b3862453171507475506b786866385858625257305150456a31493943445267305150456a31493943445267305150456a31493943445267305150456a314939434452672f35464e355172574d5a4c2b3846616267727247584f38746830632b696e637a3569695a3467654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a48715136454769427a324e6269303372325738626638556c32752b64576538622f73556c782f5266555030494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a306f4447706258735766655a5878346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346e2b773834646e54414942554151314d375357666f52306d424158695367676c69424f395043776e31656b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f6b664e6f67654e7a53703679332f6a5257385250556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e474437714b2f783262697359376f56362b4a4a334d6d567a5232712b675a792b346a656f626f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f5a62506f51655077466231694f596c65495871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a446f41414141414141414141414141414141412f4e6944417745414141414149502f58526c42565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565646666267514141414141414179502b314556525656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656685430344541414141414141386e397442465656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565951384f42414141414143412f463862515656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565632494d4441514141414141672f39644755465656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565655563975424141414141414144492f375552564656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656574650546751414141414141447966323045565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656566844773445414141414149443858787442565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656585967774d42414141414143442f31305a5156565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565258323445414141414141414d6a2f7452465556565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565955394f4241414141414141504a2f62515256565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565657455044675141414141416750786647304656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565664714451774941414141415166396665384d41414141414141414141414141414141414141414141414141414141414141426342625134535279704e43446c4141414141456c46546b5375516d43434142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e0000003f3435363738393a3b3c3d00000000000000000102030405060708090a0b0c0d0e0f101112131415161718190000000000001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233000000000040666f6e742d66616365207b20666f6e742d66616d696c793a20275072657373205374617274203250273b207372633a2075726c28646174613a6170706c69636174696f6e2f6f637465742d73747265616d3b6261736536342c643039474d674142414141414142497741417741414141415266774141424865414145414141414141414141414141414141414141414141414141414141414148494a6b426d41416847775243417277564e4a6a43344e434141453241695144673059454941574553676545554274304e4b4f696d6e515873762b65744d5a74632f6172436f4c4d726c546a37734444534b686f556f33516f6b79454275494c6436684a3430463446586f7053352f6e7053302b7666466274466a473072426f35494d6a4a4a6d463532732f39756675596d374a5057706a4b494646764c6b6d74784a4a7042654a396b312b7348743973656f3039776b46394b55414d6464544a3450717255346b3676413863642f2b334634615272736c76495076464734622b4b50474d386a77552f5933366f663732534c6a2f622f67714b5331526f526f456339474b5a42334f4a41372f653050634464514a3363494c4a49576149696c4746515a4e432f4248385954344a74664e39556a42436c706b524b47683477645377554861354f61326d676c4344655377476e6c65632b6e6e553370704c617251496233664b74304b7057333073674f6d4a2f3853694d4e66492b335752674f777979633870396338673655666e496c332b68307261482f33394b557a756a75624d6d3177464a52476b436c505237554867396731702f352b7a3037476b3238367a30317931317556397a505364395a6e643962755a53472f497853476e55757056626b5a3567586d6f354945456b774465423547304d444461426362434a47764b4b2f6c7a58374632686844396d4b78364f7347794846495977786870694f63575435702f3834763263454f4b6b305866526f6b6976696d4a7661636f784c35796471324338436b764566557852626472754844384b474466494c5162502f2f78667367784e7637334854363952773349456d6a53474f446842734d306f672f586a72796f6b6c73774843675167547a55637959614e4474446c526245545746796f52696f4136714a70546357476e3735653347784b7454525452444f6c4a456330503863326d78646778545451336471596b76544456552f436e444a6f712f73464b6a475161396e436d3972476636377149554f6f67525370494343743979643677654a56743471444b55515855565338724b39796341624331764b32397a3167327a6364786c3046556e66674651482f4a756776594171446554544b73536166356943453631736a504b7763696c672f415654714a45662f783568517170334658442f574b454945434e4943434554775167344245554753484846417868676e674b674b62314f61596b3965594a67515a714737592f5a50673877656141507a586758384e42677672436179546d62553032612f377a316e756e344c5076696741475942367a344538736c77673563666d3476383462646c476135313178774f62374c4c6245706573744d38365736797732585658586250656662466375484c6e615a5452786868726f6749494c42774342685932446934654d516b70475955646c74727070613365557a497973624278382f44796953685570455370637655614e576e57716b323348723336444e726d756531754f6d574e3038343734344958486e6e6e4d645142742b7a337841665033444458504b2f64397441796238777834714246466c707367305332374469783538695a47312f5a6375544b4e383534453254436f7941696f5347376a457145543042496a716d466c6f71616e6f614f675a6d4c6e594e54574542516946575a616855713161707952593075375470303674646741463264766659343670676a6f73674838774659414f514679483934376e44672f516177417a45413041424130545331574d454c45796978304a724c4241544a574c57714e6c6653634c7573794e73547346557a4b56504b676f7768674178657631424f77684874697055446366464a7137594542684a7163706730714d4b4f354a4b5148524d4b7844736a34546b612f48436d5462564c75696c41634738785a2b5062315771647a584a6c4c56746b7a567a5a4150493833646d3937784c64544c4b5a41594e6f39546435334641766157732b562f715756775a523539662b52715757334b2f7662495754656c66426b4661322b6a38624e65756a56705242314f785257776d362f64414459306c767a31344859575441324541326e31762b76443033594a35316f43452b507836747337585279374a5a6f697667592b434c2b65706861366d394b6471777954566b4a5a65357a6c54625a5736346a35387a65336a63516e655161714e65577848497435454b6332332f336a3070534369777478796d38624e48716465534678624c3271357263574677384c704172573241493277766b47795350734e433645684d5038526c71767533743132424249734c7058467853546a634b41464e6f524363446e34346a67536f4c6d55476d6830317043674d3958797142624433584869674433416d70652f433532554535473645664a43694f6261725a35677a37654d58495463496d57623041444c4f67524243363749304e44596b62707377382b75675a4b6e6f58536a324c79516d655241345a536d68745875444a367963424f4a716c4374566259746455395778727746396e75586f6b51674d384c5a64534a585a3268415044436d50656853767070667548595738454861714f465566454136394269574c4c486c4a395a6261586257686c35684a537743692b314d465136625747417a5251566149685236616b4b517639646f795478736a477a66436e4264557a624c4e64587a707156764c626655576757506741417546783031706a6f6272474b4741745776683447683159654b553242436e4b685570474743386364557279443057766369656c536835346c42562b5071736b3635774d6a794b6b536d73376a546b777a556c52693062705963566759387661527268686c7045317471726931535156514b364264644e796c7a554e504c733653774c633347736a6842783334716a6d6769464c3031686f5938346b6e46735267494947375346533142427a6331634f676d45535a2f4869446c7067686e794569565331346578755042485738524f51415545536d4779566c7a58786d4b7341554a6948484f69446e50716a735a436b306932324279505674426a6775574d6b4f5867776b546c733141697550585868694c3271575179656e364454534b4b7a4b35484168496d32794a513461413548513568394f3873492b695a37414157415935596b696b3857554a5331565471426e3368697933444149495557484671324e5756347530727355576f6b746d56507a64656268494a75616c3436797368756446414d49664c7744462b514b494a30703248664a69526838596c6149584932746963496752344464414c39307a45693163547064554453545a3042546254766b41745774676241643356763353587733424a394a514d71354b7331507149352f5667702b62616b31514d6c7956516f5a756775697a304432637a42794b75776c4f4743354e7852554a4f75624b34454b345677475744684751374246463930747338475259326e67675255556349754a6c5945685a69725976456d6968424545474f5975556961347977433550486b6a4e7257636f796c3232576f356f39434a47666a564d5756396153314a56344c74767947566437396d7a764c7a517458455a5a504436434e4570356a57426f4a5341514f3562557a5264374a5575764676594a6c6b4164554d45567745697a41575a784e7257595468784735554472556f506a45555a4676756779442b73526775433639687069566d49557267635964762b4b3932795a6c47374c4d4c747a553052644750444671456f546951425a386f5535317368366752336b556c735747534b5776674e424474467938626b6831334b474b67306b6449767752784a4659627737483942374d48566a367a3465324a6d4d5434784146392f564370502b615252726e46444534726f6773397964575969746a68456a386652594f456363514f6563434362423861492b6d3273774c7752495730693465684344534b304b306570586e575945796c3767547a4e7343356b683132496549773871734d566332394876674e52456c6c316764434f7874556170565057747530467a317461747a6d416458415a72707452556c74646a6a2f6e7061696f702b69507358346f63364a69503279416d446d786e324332307658345866705456726b79794f55667a6b6f37717549773236364a454e68427a2f6e7946314c396776716f58306f315843424a456554727462584f70437a4d5664696a306959626f6f554c414b65685764683562362b514853636e6d6848627043766769726c5269556a536173464d393265674c2f7579696b65583469333656756377785232776f6d2f36594a6e566e5675424658353750676b537373347a36346b616c337258436a33685a2f6e686d4537364658422f4e6a705a36624d416a3749553635382f3034374f59645a306c303057614a66746755354b356b394e346d6e43646e2f69315a636431394c644f2f796f30374152776a6b455377415469533968306e616c5a6846386d686e30464d324141687a6a57547065386d4e53794b43685341643836663136375145526f6e7169446b51685935324578722f7079774375776473447a6a2b76525a546f314f766348466b516575502b34625a2f4b636d444f644c39506f3278683369716e453664635973614c5458796354354e364f677a4a662b554d356363363632374a6941676f4e3441414f6c476b4146413341393556594d6e4c47536f4c65685748357559624e316476553863494548342f416431424a3966302f3133386a70584a775a446a48472b3174566c597549493747377552654f65686c6d51644f426f4468504936454d51633979727178525773376a495152466d427958445869317a5a6d50574b583244754c36533866423374365638745a71386b743439396778773436375631787a67646b6e6b7663426a37585830527158322f397876377a6c34466a62654c3468374c4f574d5130744b4241334a3552564b32317936476444687836384b6f6165516641444352503453456c72556c447137575a614c6c496e516f4335766f354d417070426e4f6f614959316436565936713165796542643142623858465462754761456f4436394557433266634138305366766d6b413842644272337276714f5638754e573049684c367159464932334c424a712f36357645674e62346661496f426d6642534e52584a357273457341566c69694f325a48776b4e644c643235354961487844663243714f4c7245434257386c7950776e75396a414a734e315259315a6f4d6d4274766f435459555070552f504b36307644516e325070416169636e7a4569704c4c4d433968683754736479385975557276654261486b636754666c6f63746a43436f7969494f53307a434d4354564f4d5a3547614d6f5a4f554371496a314b71755447676c4a30363552514a7a6869633643665a517a764c4d7a614966454e73666f592b4276785875763065514f4c59463452673375456933797a4779415a6c354a7446436d574c725a724f4a33757a4766375358496d363177557675314d7a4f75643858564138664e564f625361576e506f4e41454567666c43414775647247384264345977444d2f7053554957346663326b59497241592f546d4c7539432f744a6b626464726d666f78754a326245484455744566306441345a775656506136525a716d65526c386e4a6c6d517676432b726f5a374934555848652f527a6e6e504c6677347a6d395831772b3274575a42614d3569723330484343364441627176514257616d2f64314d694870324d4f62482b737668626b356833334f524b3770573139665778674932327a66336879322f446665676c456c496a715477304f7862306d382b796664515877714e593630683258792b4539696539454f46634c7a5a634b4a51476d72693571304e52586d774e6c347973554551796933794146444f466a32495336474e6266546a48556f66646833783835614f6b4e3958446933787761566e474e506a4f3175715a7a53682b514752676965776e62377a7345372f6d6263516a676b535373574b4c767150425264504564777833457a3643567633534756357530514f51663752446b4962696c386a2b5675776a63686c54643837394b595444584542797568616151384d2f4b6d726979486969327169664f6363665875794e536e6f645a7848525634623966616869514378457a59796e575479556e5346796e56356a644c594e3945384b3568354e6841756c2b686d796b32556744317043675945513265436542423351665832762b3554744e6c64353031634c7348636c5a4945497333454c76536656627477584e373134676b6964597745723758477a4d486933704776414d736135546b504e3463714a2b62734d4b674a623272473571385a4b73337a39446c4d71377a48783757456e6b50626c385739692b7769376f5944524b75744c476f6b50543333704f443038312b61447857696676546a4232306166457034754a444c55387a3274664362517670597777573161537a535135634b4234556c6b6d6e43367246586856753539774f584369716e2f38336652664635547a764a376d2f755a4a722b6547704839545341354c69786f6c307a3946304a582f3470484d684d494839524d42657164723733426b45553076756361356b5831675a32516e50612b775245734c41557a434a51613471524d416d46584565765831666f6a6173304f754f74452b5a5a584b6b53796732516169464c433247567056654a6a5554713358623649776b376f7a584135522b6850733450785a394d57717a2b4b75776e74772b62756a36337745706e5967592b7247724c676a752b654a2f42564331593434714353456e337958672b4177574a504e58764a6d3362704e697a38595a4365517a7076375079566246395836316575743931764e705a6d6a2b70743153454e312f32373170716a62416f55666e6e7342324a2f73782f6369334874614c6b4c646462627842676366537537536c325638786848417166526a666436762b4f7a374743766e472b42764344454641417a61474e39363138494c76797355335132687876317061554230384f6376464f433371395a4b6c57566d6c543948703976496439616a6145742b46324f444f6574654843334e6d334243743467437662583644486a6c494353636a7763576332314d554f6736554863746879727331786144344567553056696171363837336e597562416a7a33344c39612f2f622b6c55586b786c357a6b65424234626d624b4d42776c69414b614f64754a4c486d47615674424466583333564979594272636c654e78716b6171506b624e755a583261544a4443726266686b6a4f4d7a45356252526355696a654f324743726471377147426a5639354e6c41673931536a307056426f614b41525378566a41524b4d593935674c756152425142446e72456b4b6f6a38424a474e6b4f452b4446446357504e304170746e57456a5265384d5730474b5a39684a774664757441626f31613154326b6d784e75785370564f44563931704e464f586175367162614c7164687536474e6d356e6171427a39504670317546547432343342693861745470305a7971494f704f2f59486174454c774d4c484c32434b4e4a42724a6277434a612f7a56794f684565426e497a4c74532f30317571744f6d33594472395472314b766c51655158684436796d3339725955576e54754e5656696f7047442b703633774634594c497162616f4e55427630434b3952596f5a366f4734556449672b445272534337724c67366f33645656444746504137584b7130474c507a6d4e7a6732575643762b5076756c796851586b55656e4c47654f4f57796f64554f57677851694971704638526c626a747276756f6143696f62767667596365595742696865676c566374762f746754645a355a34704444654c342f79763569496d4c50765644763551503644356237536b477634644637316368644c54597a754c65707952646d375435375078307372477a7358756e5771302f50342b3831563067503836742b2f6e454744426b32614176554554342f2b4155457a5245534e6d4b794b53593938762f52696e317a566f6e4c727468676f787935386e35666758776b2f3738325a4c4554653348677955396666654f717944577a354d74774b4e6165654a3677746f726a4a45773272564c6c6c4e5253754c68305647626f374e76726f6b74754f4f36456b3036354867616a4c6b69494d324e57686f57624e336351474157577162413962427a694a753545537a4a70706e6e6d6d6d2b614d70396f77725041523638747050505742322b712f2b504c44556d353957524a47726148555665376e6b6b69377172446b72464f736f6a54426e49556a6f6e4152483946397479615834785473333165424b39544f38306e6d39575544722f5053436972476f6b43293b7d3c726563742077696474683d273130302527206865696768743d27313030252720783d2730252720793d273025272066696c7465723d2775726c2823746869735f696d61676529272f3e3c726563742077696474683d273130302527206865696768743d27313030252720783d2730252720793d273025272066696c7465723d2775726c2823637573746f6d5f7465787429272f3e3c7465787420646f6d696e616e742d626173656c696e653d276d6964646c652720746578742d616e63686f723d276d6964646c652720783d273530252720793d2731302e35252720666f6e742d66616d696c793d272671756f743b50726573732053746172742032502671756f743b2c637572736976652720666f6e742d73697a653d273130656d2720746578744c656e6774683d273138303027206c656e67746841646a7573743d2773706163696e67416e64476c79706873273ea2646970667358221220c8e1a04e18f99ebe24df09f9c10f0fe0a6942de22b9bb396d2093395e92394a264736f6c63430008090033

Deployed Bytecode Sourcemap

55026:5548:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27500:372;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27500:372:0;;;;;;;;58018:87;;;;;;:::i;:::-;;:::i;:::-;;29023:100;;;:::i;:::-;;;;;;;:::i;30109:214::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3037:32:1;;;3019:51;;3007:2;2992:18;30109:214:0;2873:203:1;29688:413:0;;;;;;:::i;:::-;;:::i;55222:26::-;;;;;-1:-1:-1;;;55222:26:0;;;;;;56019:76;;;;;;:::i;:::-;;:::i;26182:100::-;26235:7;26262:12;26182:100;;;4014:25:1;;;4002:2;3987:18;26182:100:0;3868:177:1;55531:41:0;;;;;;:::i;:::-;;;;;;;;;;;;;;55629:45;;;;;;:::i;:::-;;;;;;;;;;;;;;30799:162;;;;;;:::i;:::-;;:::i;55683:25::-;;;;;;26485:1007;;;;;;:::i;:::-;;:::i;56185:81::-;;;;;;:::i;:::-;;:::i;58488:79::-;;;;;;:::i;:::-;;:::i;58325:155::-;;;:::i;30969:177::-;;;;;;:::i;:::-;;:::i;55449:31::-;;;;;;26290:187;;;;;;:::i;:::-;;:::i;55413:29::-;;;;;;58113:87;;;;;;:::i;:::-;;:::i;55154:29::-;;;;;-1:-1:-1;;;55154:29:0;;;;;;56103:74;;;;;;:::i;:::-;;:::i;57916:90::-;;;;;;:::i;:::-;;:::i;28891:124::-;;;;;;:::i;:::-;;:::i;55294:32::-;;;;;;27880:221;;;;;;:::i;:::-;;:::i;23991:103::-;;;:::i;58666:92::-;;;;;;:::i;:::-;;:::i;58766:502::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55257:30::-;;;;;;23768:87;23841:6;;-1:-1:-1;;;;;23841:6:0;23768:87;;57214:427;;;;;;:::i;:::-;;:::i;29131:104::-;;;:::i;55190:25::-;;;;;-1:-1:-1;;;55190:25:0;;;;;;57822:86;;;;;;:::i;:::-;;:::i;59276:626::-;;;;;;:::i;:::-;;:::i;30331:288::-;;;;;;:::i;:::-;;:::i;31154:355::-;;;;;;:::i;:::-;;:::i;55335:30::-;;;;;;56835:371;;;;;;:::i;:::-;;:::i;55372:32::-;;;;;;59910:661;;;;;;:::i;:::-;;:::i;55105:40::-;;55141:4;55105:40;;56274:109;;;;;;:::i;:::-;;:::i;56391:436::-;;;;;;:::i;:::-;;:::i;30627:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;30748:25:0;;;30724:4;30748:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30627:164;24102:201;;;;;;:::i;:::-;;:::i;58575:83::-;;;;;;:::i;:::-;;:::i;55579:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;27500:372;27602:4;-1:-1:-1;;;;;;27639:40:0;;-1:-1:-1;;;27639:40:0;;:105;;-1:-1:-1;;;;;;;27696:48:0;;-1:-1:-1;;;27696:48:0;27639:105;:172;;;-1:-1:-1;;;;;;;27761:50:0;;-1:-1:-1;;;27761:50:0;27639:172;:225;;;-1:-1:-1;;;;;;;;;;3446:40:0;;;27828:36;27619:245;27500:372;-1:-1:-1;;27500:372:0:o;58018:87::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;;;;;;;;;58086:11;;::::1;::::0;:7:::1;::::0;:11:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58018:87:::0;:::o;29023:100::-;29077:13;29110:5;29103:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29023:100;:::o;30109:214::-;30177:7;30205:16;30213:7;31574:4;31608:12;-1:-1:-1;31598:22:0;31517:111;30205:16;30197:74;;;;-1:-1:-1;;;30197:74:0;;8737:2:1;30197:74:0;;;8719:21:1;8776:2;8756:18;;;8749:30;8815:34;8795:18;;;8788:62;-1:-1:-1;;;8866:18:1;;;8859:43;8919:19;;30197:74:0;8535:409:1;30197:74:0;-1:-1:-1;30291:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30291:24:0;;30109:214::o;29688:413::-;29761:13;29777:24;29793:7;29777:15;:24::i;:::-;29761:40;;29826:5;-1:-1:-1;;;;;29820:11:0;:2;-1:-1:-1;;;;;29820:11:0;;;29812:58;;;;-1:-1:-1;;;29812:58:0;;9151:2:1;29812:58:0;;;9133:21:1;9190:2;9170:18;;;9163:30;9229:34;9209:18;;;9202:62;-1:-1:-1;;;9280:18:1;;;9273:32;9322:19;;29812:58:0;8949:398:1;29812:58:0;6214:10;-1:-1:-1;;;;;29905:21:0;;;;:62;;-1:-1:-1;29930:37:0;29947:5;6214:10;30627:164;:::i;29930:37::-;29883:169;;;;-1:-1:-1;;;29883:169:0;;9554:2:1;29883:169:0;;;9536:21:1;9593:2;9573:18;;;9566:30;9632:34;9612:18;;;9605:62;9703:27;9683:18;;;9676:55;9748:19;;29883:169:0;9352:421:1;29883:169:0;30065:28;30074:2;30078:7;30087:5;30065:8;:28::i;:::-;29750:351;29688:413;;:::o;56019:76::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;56076:7:::1;:11:::0;;;::::1;;-1:-1:-1::0;;;56076:11:0::1;-1:-1:-1::0;;;;56076:11:0;;::::1;::::0;;;::::1;::::0;;56019:76::o;30799:162::-;30925:28;30935:4;30941:2;30945:7;30925:9;:28::i;26485:1007::-;26574:7;26610:16;26620:5;26610:9;:16::i;:::-;26602:5;:24;26594:71;;;;-1:-1:-1;;;26594:71:0;;9980:2:1;26594:71:0;;;9962:21:1;10019:2;9999:18;;;9992:30;10058:34;10038:18;;;10031:62;-1:-1:-1;;;10109:18:1;;;10102:32;10151:19;;26594:71:0;9778:398:1;26594:71:0;26676:22;26262:12;;;26676:22;;26939:466;26959:14;26955:1;:18;26939:466;;;26999:31;27033:14;;;:11;:14;;;;;;;;;26999:48;;;;;;;;;-1:-1:-1;;;;;26999:48:0;;;;;-1:-1:-1;;;26999:48:0;;;-1:-1:-1;;;;;26999:48:0;;;;;;;;27070:28;27066:111;;27143:14;;;-1:-1:-1;27066:111:0;27220:5;-1:-1:-1;;;;;27199:26:0;:17;-1:-1:-1;;;;;27199:26:0;;27195:195;;;27269:5;27254:11;:20;27250:85;;;-1:-1:-1;27310:1:0;-1:-1:-1;27303:8:0;;-1:-1:-1;;;27303:8:0;27250:85;27357:13;;;;;27195:195;-1:-1:-1;26975:3:0;;26939:466;;;-1:-1:-1;27428:56:0;;-1:-1:-1;;;27428:56:0;;10383:2:1;27428:56:0;;;10365:21:1;10422:2;10402:18;;;10395:30;10461:34;10441:18;;;10434:62;-1:-1:-1;;;10512:18:1;;;10505:44;10566:19;;27428:56:0;10181:410:1;56185:81:0;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;56245:9:::1;:13:::0;;;::::1;;-1:-1:-1::0;;;56245:13:0::1;-1:-1:-1::0;;;;56245:13:0;;::::1;::::0;;;::::1;::::0;;56185:81::o;58488:79::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58547:8:::1;:12:::0;58488:79::o;58325:155::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58393:21:::1;58425:47;58451:10;58393:21:::0;58425:17:::1;:47::i;:::-;58364:116;58325:155::o:0;30969:177::-;31099:39;31116:4;31122:2;31126:7;31099:39;;;;;;;;;;;;:16;:39::i;26290:187::-;26357:7;26262:12;;26385:5;:21;26377:69;;;;-1:-1:-1;;;26377:69:0;;10798:2:1;26377:69:0;;;10780:21:1;10837:2;10817:18;;;10810:30;10876:34;10856:18;;;10849:62;-1:-1:-1;;;10927:18:1;;;10920:33;10970:19;;26377:69:0;10596:399:1;26377:69:0;-1:-1:-1;26464:5:0;26290:187::o;58113:87::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58180:12;;::::1;::::0;:8:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;56103:74::-:0;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;56160:5:::1;:9:::0;;;::::1;;-1:-1:-1::0;;;56160:9:0::1;-1:-1:-1::0;;;;56160:9:0;;::::1;::::0;;;::::1;::::0;;56103:74::o;57916:90::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;57982:12:::1;:16:::0;57916:90::o;28891:124::-;28955:7;28982:20;28994:7;28982:11;:20::i;:::-;:25;;28891:124;-1:-1:-1;;28891:124:0:o;27880:221::-;27944:7;-1:-1:-1;;;;;27972:19:0;;27964:75;;;;-1:-1:-1;;;27964:75:0;;11202:2:1;27964:75:0;;;11184:21:1;11241:2;11221:18;;;11214:30;11280:34;11260:18;;;11253:62;-1:-1:-1;;;11331:18:1;;;11324:41;11382:19;;27964:75:0;11000:407:1;27964:75:0;-1:-1:-1;;;;;;28065:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;28065:27:0;;27880:221::o;23991:103::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;24056:30:::1;24083:1;24056:18;:30::i;:::-;23991:103::o:0;58666:92::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58733:10:::1;:17:::0;58666:92::o;58766:502::-;58828:16;58857:18;58878:17;58888:6;58878:9;:17::i;:::-;58857:38;-1:-1:-1;58910:15:0;58906:355;;58949:16;;;58963:1;58949:16;;;;;;;;;;;-1:-1:-1;58942:23:0;58766:502;-1:-1:-1;;;58766:502:0:o;58906:355::-;58998:23;59038:10;-1:-1:-1;;;;;59024:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59024:25:0;;58998:51;;59064:13;59092:130;59116:10;59108:5;:18;59092:130;;;59172:34;59192:6;59200:5;59172:19;:34::i;:::-;59156:6;59163:5;59156:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;59128:7;;;;:::i;:::-;;;;59092:130;;58906:355;58846:422;58766:502;;;:::o;57214:427::-;57276:13;57333;26235:7;26262:12;;26182:100;57333:13;57324:5;:22;;57302:65;;;;-1:-1:-1;;;57302:65:0;;;;;;;:::i;:::-;57413:1;57389:13;;;:6;:13;;;;;57383:27;;;;;:::i;:::-;;;:31;57380:254;;;57475:13;;;;:6;:13;;;;;57461:28;;57438:80;;57461:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:28::i;:::-;57492:7;57438:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57501:16;:5;:14;:16::i;:::-;57438:15;:80::i;57380:254::-;57591:7;57600:16;:5;:14;:16::i;:::-;57574:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57560:58;;57214:427;;;:::o;57380:254::-;57214:427;;;:::o;29131:104::-;29187:13;29220:7;29213:14;;;;;:::i;57822:86::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;57886:10:::1;:14:::0;57822:86::o;59276:626::-;55978:13;:11;:13::i;:::-;59380:10:::1;59371:20;::::0;;;:8:::1;:20;::::0;;;;;59394:1:::1;-1:-1:-1::0;59363:60:0::1;;;::::0;-1:-1:-1;;;59363:60:0;;13859:2:1;59363:60:0::1;::::0;::::1;13841:21:1::0;13898:2;13878:18;;;13871:30;13937:25;13917:18;;;13910:53;13980:18;;59363:60:0::1;13657:347:1::0;59363:60:0::1;59463:8;::::0;59443:11:::1;::::0;:15:::1;::::0;59457:1:::1;59443:15;:::i;:::-;59442:29;;59434:57;;;::::0;-1:-1:-1;;;59434:57:0;;14344:2:1;59434:57:0::1;::::0;::::1;14326:21:1::0;14383:2;14363:18;;;14356:30;-1:-1:-1;;;14402:18:1;;;14395:45;14457:18;;59434:57:0::1;14142:339:1::0;59434:57:0::1;59529:28;::::0;-1:-1:-1;;59546:10:0::1;14635:2:1::0;14631:15;14627:53;59529:28:0::1;::::0;::::1;14615:66:1::0;59504:12:0::1;::::0;14697::1;;59529:28:0::1;;;;;;;;;;;;59519:39;;;;;;59504:54;;59577:49;59596:11;;59577:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;59609:10:0::1;::::0;;-1:-1:-1;59621:4:0;;-1:-1:-1;59577:18:0::1;:49::i;:::-;59569:78;;;::::0;-1:-1:-1;;;59569:78:0;;14922:2:1;59569:78:0::1;::::0;::::1;14904:21:1::0;14961:2;14941:18;;;14934:30;-1:-1:-1;;;14980:18:1;;;14973:46;15036:18;;59569:78:0::1;14720:340:1::0;59569:78:0::1;59660:13;59702;;59688:11;;55141:4;59676:23;;;;:::i;:::-;:39;;;;:::i;:::-;59660:55;;59742:1;59734:5;:9;59726:31;;;::::0;-1:-1:-1;;;59726:31:0;;15397:2:1;59726:31:0::1;::::0;::::1;15379:21:1::0;15436:1;15416:18;;;15409:29;-1:-1:-1;;;15454:18:1;;;15447:39;15503:18;;59726:31:0::1;15195:332:1::0;59726:31:0::1;59786:1;59771:11;;:16;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;59807:10:0::1;59798:20;::::0;;;:8:::1;:20;::::0;;;;:25;;59822:1:::1;::::0;59798:20;:25:::1;::::0;59822:1;;59798:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;59841:10:0::1;59834:18;::::0;;;:6:::1;:18;::::0;;;;:23;;59856:1:::1;::::0;59834:18;:23:::1;::::0;59856:1;;59834:23:::1;:::i;:::-;::::0;;;-1:-1:-1;59870:24:0::1;::::0;-1:-1:-1;59880:10:0::1;59892:1;59870:9;:24::i;:::-;59350:552;;59276:626:::0;;:::o;30331:288::-;-1:-1:-1;;;;;30426:24:0;;6214:10;30426:24;;30418:63;;;;-1:-1:-1;;;30418:63:0;;15734:2:1;30418:63:0;;;15716:21:1;15773:2;15753:18;;;15746:30;15812:28;15792:18;;;15785:56;15858:18;;30418:63:0;15532:350:1;30418:63:0;6214:10;30494:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30494:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30494:53:0;;;;;;;;;;30563:48;;540:41:1;;;30494:42:0;;6214:10;30563:48;;513:18:1;30563:48:0;;;;;;;30331:288;;:::o;31154:355::-;31313:28;31323:4;31329:2;31333:7;31313:9;:28::i;:::-;31374:48;31397:4;31403:2;31407:7;31416:5;31374:22;:48::i;:::-;31352:149;;;;-1:-1:-1;;;31352:149:0;;;;;;;:::i;56835:371::-;56906:13;56963;26235:7;26262:12;;26182:100;56963:13;56954:5;:22;;56932:65;;;;-1:-1:-1;;;56932:65:0;;;;;;;:::i;:::-;57043:1;57019:13;;;:6;:13;;;;;57013:27;;;;;:::i;:::-;;;:31;57010:189;;;57068:14;57076:5;57068:7;:14::i;57010:189::-;57155:8;57165:16;:5;:14;:16::i;59910:661::-;55978:13;:11;:13::i;:::-;59986:5:::1;::::0;-1:-1:-1;;;59986:5:0;::::1;;;59978:25;;;::::0;-1:-1:-1;;;59978:25:0;;16509:2:1;59978:25:0::1;::::0;::::1;16491:21:1::0;16548:1;16528:18;;;16521:29;-1:-1:-1;;;16566:18:1;;;16559:37;16613:18;;59978:25:0::1;16307:330:1::0;59978:25:0::1;60064:10;::::0;60031:6;;60056:18;::::1;;60048:48;;;::::0;-1:-1:-1;;;60048:48:0;;16844:2:1;60048:48:0::1;::::0;::::1;16826:21:1::0;16883:2;16863:18;;;16856:30;-1:-1:-1;;;16902:18:1;;;16895:47;16959:18;;60048:48:0::1;16642:341:1::0;60048:48:0::1;60141:10;;60132:4;60116:13;;:20;;;;:::i;:::-;60115:36;;60107:66;;;::::0;-1:-1:-1;;;60107:66:0;;17190:2:1;60107:66:0::1;::::0;::::1;17172:21:1::0;17229:2;17209:18;;;17202:30;-1:-1:-1;;;17248:18:1;;;17241:47;17305:18;;60107:66:0::1;16988:341:1::0;60107:66:0::1;60223:12;::::0;60200:10:::1;60193:18;::::0;;;:6:::1;:18;::::0;;;;;:25:::1;::::0;60214:4;;60193:25:::1;:::i;:::-;60192:43;;60184:76;;;::::0;-1:-1:-1;;;60184:76:0;;17536:2:1;60184:76:0::1;::::0;::::1;17518:21:1::0;17575:2;17555:18;;;17548:30;-1:-1:-1;;;17594:18:1;;;17587:50;17654:18;;60184:76:0::1;17334:344:1::0;60184:76:0::1;60273:13;60315;;60301:11;;55141:4;60289:23;;;;:::i;:::-;:39;;;;:::i;:::-;60273:55;;60355:1;60347:5;:9;60339:31;;;::::0;-1:-1:-1;;;60339:31:0;;15397:2:1;60339:31:0::1;::::0;::::1;15379:21:1::0;15436:1;15416:18;;;15409:29;-1:-1:-1;;;15454:18:1;;;15447:39;15503:18;;60339:31:0::1;15195:332:1::0;60339:31:0::1;60390:21;60399:4;60405:5;60390:8;:21::i;:::-;60383:28;;60441:4;60424:13;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;60467:10:0::1;60456:22;::::0;;;:10:::1;:22;::::0;;;;:30;;60482:4;;60456:22;:30:::1;::::0;60482:4;;60456:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;60504:10:0::1;60497:18;::::0;;;:6:::1;:18;::::0;;;;:26;;60519:4;;60497:18;:26:::1;::::0;60519:4;;60497:26:::1;:::i;:::-;::::0;;;-1:-1:-1;60536:27:0::1;::::0;-1:-1:-1;60546:10:0::1;60558:4:::0;60536:9:::1;:27::i;56274:109::-:0;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;56356:13:::1;::::0;;;:6:::1;:13;::::0;;;;;;;:19;;::::1;::::0;;::::1;::::0;::::1;:::i;56391:436::-:0;26235:7;26262:12;56482:5;:22;;56460:65;;;;-1:-1:-1;;;56460:65:0;;;;;;;:::i;:::-;56544:9;;-1:-1:-1;;;56544:9:0;;;;56536:48;;;;-1:-1:-1;;;56536:48:0;;17885:2:1;56536:48:0;;;17867:21:1;17924:2;17904:18;;;17897:30;17963:28;17943:18;;;17936:56;18009:18;;56536:48:0;17683:350:1;56536:48:0;56605:13;56621:22;56637:5;56621:15;:22::i;:::-;56605:38;-1:-1:-1;56662:10:0;-1:-1:-1;;;;;56662:19:0;;;56654:48;;;;-1:-1:-1;;;56654:48:0;;18240:2:1;56654:48:0;;;18222:21:1;18279:2;18259:18;;;18252:30;-1:-1:-1;;;18298:18:1;;;18291:46;18354:18;;56654:48:0;18038:340:1;56654:48:0;56763:2;56757:1;56742:3;56735:19;:23;;;;:::i;:::-;56732:27;;:1;:27;:::i;:::-;56731:34;56723:64;;;;-1:-1:-1;;;56723:64:0;;19015:2:1;56723:64:0;;;18997:21:1;19054:2;19034:18;;;19027:30;-1:-1:-1;;;19073:18:1;;;19066:47;19130:18;;56723:64:0;18813:341:1;56723:64:0;56800:13;;;;:6;:13;;;;;;;;:19;;;;;;;;:::i;24102:201::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24191:22:0;::::1;24183:73;;;::::0;-1:-1:-1;;;24183:73:0;;19361:2:1;24183:73:0::1;::::0;::::1;19343:21:1::0;19400:2;19380:18;;;19373:30;19439:34;19419:18;;;19412:62;-1:-1:-1;;;19490:18:1;;;19483:36;19536:19;;24183:73:0::1;19159:402:1::0;24183:73:0::1;24267:28;24286:8;24267:18;:28::i;58575:83::-:0;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58636:10:::1;:14:::0;58575:83::o;35475:196::-;35590:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;35590:29:0;-1:-1:-1;;;;;35590:29:0;;;;;;;;;35635:28;;35590:24;;35635:28;;;;;;;35475:196;;;:::o;33465:2002::-;33580:35;33618:20;33630:7;33618:11;:20::i;:::-;33693:18;;33580:58;;-1:-1:-1;33651:22:0;;-1:-1:-1;;;;;33677:34:0;6214:10;-1:-1:-1;;;;;33677:34:0;;:87;;;-1:-1:-1;6214:10:0;33728:20;33740:7;33728:11;:20::i;:::-;-1:-1:-1;;;;;33728:36:0;;33677:87;:154;;;-1:-1:-1;33798:18:0;;33781:50;;6214:10;30627:164;:::i;33781:50::-;33651:181;;33853:17;33845:80;;;;-1:-1:-1;;;33845:80:0;;19768:2:1;33845:80:0;;;19750:21:1;19807:2;19787:18;;;19780:30;19846:34;19826:18;;;19819:62;-1:-1:-1;;;19897:18:1;;;19890:48;19955:19;;33845:80:0;19566:414:1;33845:80:0;33968:4;-1:-1:-1;;;;;33946:26:0;:13;:18;;;-1:-1:-1;;;;;33946:26:0;;33938:77;;;;-1:-1:-1;;;33938:77:0;;20187:2:1;33938:77:0;;;20169:21:1;20226:2;20206:18;;;20199:30;20265:34;20245:18;;;20238:62;-1:-1:-1;;;20316:18:1;;;20309:36;20362:19;;33938:77:0;19985:402:1;33938:77:0;-1:-1:-1;;;;;34034:16:0;;34026:66;;;;-1:-1:-1;;;34026:66:0;;20594:2:1;34026:66:0;;;20576:21:1;20633:2;20613:18;;;20606:30;20672:34;20652:18;;;20645:62;-1:-1:-1;;;20723:18:1;;;20716:35;20768:19;;34026:66:0;20392:401:1;34026:66:0;34213:49;34230:1;34234:7;34243:13;:18;;;34213:8;:49::i;:::-;-1:-1:-1;;;;;34558:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;34558:31:0;;;-1:-1:-1;;;;;34558:31:0;;;-1:-1:-1;;34558:31:0;;;;;;;34604:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;34604:29:0;;;;;;;;;;;;;34650:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;34695:61:0;;;;-1:-1:-1;;;34740:15:0;-1:-1:-1;;;;;34695:61:0;;;;;35030:11;;;35060:24;;;;;:29;35030:11;;35060:29;35056:295;;35128:20;35136:11;31574:4;31608:12;-1:-1:-1;31598:22:0;31517:111;35128:20;35124:212;;;35205:18;;;35173:24;;;:11;:24;;;;;;;;:50;;35288:28;;;;-1:-1:-1;;;;;35246:70:0;-1:-1:-1;;;35246:70:0;-1:-1:-1;;;;;;35246:70:0;;;-1:-1:-1;;;;;35173:50:0;;;35246:70;;;;;;;35124:212;34533:829;35398:7;35394:2;-1:-1:-1;;;;;35379:27:0;35388:4;-1:-1:-1;;;;;35379:27:0;;;;;;;;;;;35417:42;33569:1898;;33465:2002;;;:::o;8405:317::-;8520:6;8495:21;:31;;8487:73;;;;-1:-1:-1;;;8487:73:0;;21000:2:1;8487:73:0;;;20982:21:1;21039:2;21019:18;;;21012:30;21078:31;21058:18;;;21051:59;21127:18;;8487:73:0;20798:353:1;8487:73:0;8574:12;8592:9;-1:-1:-1;;;;;8592:14:0;8614:6;8592:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8573:52;;;8644:7;8636:78;;;;-1:-1:-1;;;8636:78:0;;21568:2:1;8636:78:0;;;21550:21:1;21607:2;21587:18;;;21580:30;21646:34;21626:18;;;21619:62;21717:28;21697:18;;;21690:56;21763:19;;8636:78:0;21366:422:1;28346:537:0;-1:-1:-1;;;;;;;;;;;;;;;;;28449:16:0;28457:7;31574:4;31608:12;-1:-1:-1;31598:22:0;31517:111;28449:16;28441:71;;;;-1:-1:-1;;;28441:71:0;;21995:2:1;28441:71:0;;;21977:21:1;22034:2;22014:18;;;22007:30;22073:34;22053:18;;;22046:62;-1:-1:-1;;;22124:18:1;;;22117:40;22174:19;;28441:71:0;21793:406:1;28441:71:0;28570:7;28550:245;28617:31;28651:17;;;:11;:17;;;;;;;;;28617:51;;;;;;;;;-1:-1:-1;;;;;28617:51:0;;;;;-1:-1:-1;;;28617:51:0;;;-1:-1:-1;;;;;28617:51:0;;;;;;;;28691:28;28687:93;;28751:9;28346:537;-1:-1:-1;;;28346:537:0:o;28687:93::-;-1:-1:-1;;;28590:6:0;28550:245;;24311:191;24404:6;;;-1:-1:-1;;;;;24421:17:0;;;-1:-1:-1;;;;;;24421:17:0;;;;;;;24454:40;;24404:6;;;24421:17;24404:6;;24454:40;;24385:16;;24454:40;24374:128;24311:191;:::o;41402:2092::-;41530:11;;41462:12;;41510:5;;41526:41;;41555:12;;;41565:1;41555:12;;;;;;;;;;;;41526:41;41597:1;41583:4;:11;:15;;;;:::i;:::-;:20;41575:61;;;;-1:-1:-1;;;41575:61:0;;22939:2:1;41575:61:0;;;22921:21:1;22978:2;22958:18;;;22951:30;23017;22997:18;;;22990:58;23065:18;;41575:61:0;22737:352:1;41575:61:0;41682:18;41703:12;;;;;;;;;;;;;;;;;41682:33;;41771:18;41807:1;41793:4;:11;:15;;;;:::i;:::-;41792:21;;41812:1;41792:21;:::i;:::-;41771:42;-1:-1:-1;41890:19:0;41922:15;41771:42;41935:2;41922:15;:::i;:::-;-1:-1:-1;;;;;41912:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41912:26:0;;41890:48;;42038:4;42032:11;42026:4;42022:22;42016:29;42084:4;42077;42066:9;42062:20;42059:30;42056:215;;;42136:1;42124:10;42120:18;42106:32;;42183:6;42174;42163:9;42159:22;42156:34;42153:106;;;42241:1;42229:10;42225:18;42211:32;;42153:106;42056:215;42341:10;42333:6;42326:26;42430:1;42423:5;42419:13;42483:4;42531;42525:11;42516:7;42512:25;42621:2;42613:6;42609:15;42693:766;42712:6;42703:7;42700:19;42693:766;;;42806:1;42797:7;42793:15;42782:26;;42841:7;42835:14;43311:4;43302;43294:5;43282:25;43272:8;43268:40;43262:47;43258:58;43221:4;43212;43204:5;43201:1;43196:14;43192:25;43182:8;43178:40;43172:47;43168:58;43165:1;43160:67;43134:202;43108:4;43099;43091:5;43087:2;43083:14;43079:25;43069:8;43065:40;43059:47;43055:58;43051:2;43047:67;43018:4;43009;43001:5;42997:2;42993:14;42989:25;42979:8;42975:40;42969:47;42965:58;42961:2;42957:67;42931:184;42909:443;42895:457;;43394:6;43389:3;43385:16;43374:9;43367:35;;43445:1;43434:9;43430:17;43417:30;;42693:766;;;-1:-1:-1;43483:6:0;;41402:2092;-1:-1:-1;;;;;;;;41402:2092:0:o;3781:723::-;3837:13;4058:10;4054:53;;-1:-1:-1;;4085:10:0;;;;;;;;;;;;-1:-1:-1;;;4085:10:0;;;;;3781:723::o;4054:53::-;4132:5;4117:12;4173:78;4180:9;;4173:78;;4206:8;;;;:::i;:::-;;-1:-1:-1;4229:10:0;;-1:-1:-1;4237:2:0;4229:10;;:::i;:::-;;;4173:78;;;4261:19;4293:6;-1:-1:-1;;;;;4283:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4283:17:0;;4261:39;;4311:154;4318:10;;4311:154;;4345:11;4355:1;4345:11;;:::i;:::-;;-1:-1:-1;4414:10:0;4422:2;4414:5;:10;:::i;:::-;4401:24;;:2;:24;:::i;:::-;4388:39;;4371:6;4378;4371:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4371:56:0;;;;;;;;-1:-1:-1;4442:11:0;4451:2;4442:11;;:::i;:::-;;;4311:154;;;4489:6;3781:723;-1:-1:-1;;;;3781:723:0:o;52920:1286::-;53023:13;53049:22;;:::i;:::-;53076:147;;;;;;;;;;;;;;;;;;;53296:15;:13;:15::i;:::-;53252:72;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;53252:72:0;;;;;;53234:8;;;;:91;;;;53354:122;;;53460:7;;53469:6;;53354:122;;:::i;:::-;;;;;;;-1:-1:-1;;53354:122:0;;;;;;53336:8;;:141;53626:17;:15;:17::i;:::-;53506:154;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;53506:154:0;;;;;;53488:8;;;:173;;;;53672:350;;;;;;;;;;;;;53488:8;53672:350;;;:8;;;:350;;;54033:8;;;:14;;;54058:26;;;;;;;;;;;-1:-1:-1;;;53672:8:0;54058:26;;;;;;;:8;;;:26;;;54128:8;;54138;;;;-1:-1:-1;;;54148:8:0;-1:-1:-1;;;54158:8:0;54168;;54178;;54111:86;;;;54128:8;;54138;;54148;;54158;;54168;;54178;;54111:86;;:::i;:::-;;;;;;;;;;;;;54097:101;;;52920:1286;;;;;:::o;55846:91::-;55902:7;;-1:-1:-1;;;55902:7:0;;;;55901:8;55893:36;;;;-1:-1:-1;;;55893:36:0;;26912:2:1;55893:36:0;;;26894:21:1;26951:2;26931:18;;;26924:30;-1:-1:-1;;;26970:18:1;;;26963:45;27025:18;;55893:36:0;26710:339:1;37270:190:0;37395:4;37448;37419:25;37432:5;37439:4;37419:12;:25::i;:::-;:33;;37270:190;-1:-1:-1;;;;37270:190:0:o;31636:104::-;31705:27;31715:2;31719:8;31705:27;;;;;;;;;;;;:9;:27::i;35679:804::-;35834:4;-1:-1:-1;;;;;35855:13:0;;7406:20;7454:8;35851:625;;35891:72;;-1:-1:-1;;;35891:72:0;;-1:-1:-1;;;;;35891:36:0;;;;;:72;;6214:10;;35942:4;;35948:7;;35957:5;;35891:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35891:72:0;;;;;;;;-1:-1:-1;;35891:72:0;;;;;;;;;;;;:::i;:::-;;;35887:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36137:13:0;;36133:273;;36180:61;;-1:-1:-1;;;36180:61:0;;;;;;;:::i;36133:273::-;36356:6;36350:13;36341:6;36337:2;36333:15;36326:38;35887:534;-1:-1:-1;;;;;;36014:55:0;-1:-1:-1;;;36014:55:0;;-1:-1:-1;36007:62:0;;35851:625;-1:-1:-1;36460:4:0;35679:804;;;;;;:::o;57649:165::-;57703:13;57736:70;57753:5;57760:7;57736:70;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57790:13:0;;;;:6;:13;;;;;57776:28;;;;-1:-1:-1;57790:13:0;;-1:-1:-1;57776:28:0;;;:::i;:::-;57736:16;:70::i;22174:106::-;22232:7;22263:1;22259;:5;:13;;22271:1;22259:13;;;22267:1;22259:13;22252:20;22174:106;-1:-1:-1;;;22174:106:0:o;43531:6383::-;43570:13;43596:6310;;;;;;;;;;;;;;;;;;;43531:6383;:::o;49922:2990::-;49963:13;49989:2915;;;;;;;;;;;;;;;;;;;49922:2990;:::o;37822:675::-;37905:7;37948:4;37905:7;37963:497;37987:5;:12;37983:1;:16;37963:497;;;38021:20;38044:5;38050:1;38044:8;;;;;;;;:::i;:::-;;;;;;;38021:31;;38087:12;38071;:28;38067:382;;38573:13;38623:15;;;38659:4;38652:15;;;38706:4;38690:21;;38199:57;;38067:382;;;38573:13;38623:15;;;38659:4;38652:15;;;38706:4;38690:21;;38376:57;;38067:382;-1:-1:-1;38001:3:0;;;;:::i;:::-;;;;37963:497;;31748:163;31871:32;31877:2;31881:8;31891:5;31898:4;31871:5;:32::i;54393:626::-;54490:13;54526:18;54598:27;54615:9;:5;54623:1;54615:9;:::i;:::-;54598:16;:27::i;:::-;54696:15;:13;:15::i;:::-;54768:3;54845:54;54861:3;54866:7;54875:23;54892:5;54875:16;:23::i;54845:54::-;54555:351;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54526:382;;54983:26;55003:4;54983:13;:26::i;:::-;54933:77;;;;;;;;:::i;31919:1538::-;32058:20;32081:12;-1:-1:-1;;;;;32112:16:0;;32104:62;;;;-1:-1:-1;;;32104:62:0;;30758:2:1;32104:62:0;;;30740:21:1;30797:2;30777:18;;;30770:30;30836:34;30816:18;;;30809:62;-1:-1:-1;;;30887:18:1;;;30880:31;30928:19;;32104:62:0;30556:397:1;32104:62:0;32185:13;32177:66;;;;-1:-1:-1;;;32177:66:0;;31160:2:1;32177:66:0;;;31142:21:1;31199:2;31179:18;;;31172:30;31238:34;31218:18;;;31211:62;-1:-1:-1;;;31289:18:1;;;31282:38;31337:19;;32177:66:0;30958:404:1;32177:66:0;-1:-1:-1;;;;;32595:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;32595:45:0;;-1:-1:-1;;;;;32595:45:0;;;;;;;;;;32655:50;;;;;;;;;;;;;;32722:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;32772:66:0;;;;-1:-1:-1;;;32822:15:0;-1:-1:-1;;;;;32772:66:0;;;;;;32722:25;;32907:415;32927:8;32923:1;:12;32907:415;;;32966:38;;32991:12;;-1:-1:-1;;;;;32966:38:0;;;32983:1;;32966:38;;32983:1;;32966:38;33027:4;33023:249;;;33090:59;33121:1;33125:2;33129:12;33143:5;33090:22;:59::i;:::-;33056:196;;;;-1:-1:-1;;;33056:196:0;;;;;;;:::i;:::-;33292:14;;;;;32937:3;32907:415;;;-1:-1:-1;33338:12:0;:27;33389:60;59276:626;54214:171;54253:13;54279:98;;;;;;;;;;;;;;;;;;;54214:171;:::o;39487:1912::-;39545:13;39575:4;:11;39590:1;39575:16;39571:31;;;-1:-1:-1;;39593:9:0;;;;;;;;;-1:-1:-1;39593:9:0;;;39487:1912::o;39571:31::-;39654:19;39676:12;;;;;;;;;;;;;;;;;39654:34;;39740:18;39786:1;39767:4;:11;39781:1;39767:15;;;;:::i;:::-;39766:21;;;;:::i;:::-;39761:27;;:1;:27;:::i;:::-;39740:48;-1:-1:-1;39871:20:0;39905:15;39740:48;39918:2;39905:15;:::i;:::-;-1:-1:-1;;;;;39894:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39894:27:0;;39871:50;;40018:10;40010:6;40003:26;40113:1;40106:5;40102:13;40172:4;40223;40217:11;40208:7;40204:25;40319:2;40311:6;40307:15;40392:754;40411:6;40402:7;40399:19;40392:754;;;40511:1;40502:7;40498:15;40487:26;;40550:7;40544:14;40676:4;40668:5;40664:2;40660:14;40656:25;40646:8;40642:40;40636:47;40625:9;40617:67;40730:1;40719:9;40715:17;40702:30;;40809:4;40801:5;40797:2;40793:14;40789:25;40779:8;40775:40;40769:47;40758:9;40750:67;40863:1;40852:9;40848:17;40835:30;;40942:4;40934:5;40931:1;40926:14;40922:25;40912:8;40908:40;40902:47;40891:9;40883:67;40996:1;40985:9;40981:17;40968:30;;41075:4;41067:5;41055:25;41045:8;41041:40;41035:47;41024:9;41016:67;-1:-1:-1;41129:1:0;41114:17;40392:754;;;41219:1;41212:4;41206:11;41202:19;41240:1;41235:54;;;;41308:1;41303:52;;;;41195:160;;41235:54;-1:-1:-1;;;;;41251:17:0;;41244:43;41235:54;;41303:52;-1:-1:-1;;;;;41319:17:0;;41312:41;41195:160;-1:-1:-1;41385:6:0;;39487:1912;-1:-1:-1;;;;;;;;39487:1912:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:632;789:5;-1:-1:-1;;;;;860:2:1;852:6;849:14;846:40;;;866:18;;:::i;:::-;941:2;935:9;909:2;995:15;;-1:-1:-1;;991:24:1;;;1017:2;987:33;983:42;971:55;;;1041:18;;;1061:22;;;1038:46;1035:72;;;1087:18;;:::i;:::-;1127:10;1123:2;1116:22;1156:6;1147:15;;1186:6;1178;1171:22;1226:3;1217:6;1212:3;1208:16;1205:25;1202:45;;;1243:1;1240;1233:12;1202:45;1293:6;1288:3;1281:4;1273:6;1269:17;1256:44;1348:1;1341:4;1332:6;1324;1320:19;1316:30;1309:41;;;;724:632;;;;;:::o;1361:222::-;1404:5;1457:3;1450:4;1442:6;1438:17;1434:27;1424:55;;1475:1;1472;1465:12;1424:55;1497:80;1573:3;1564:6;1551:20;1544:4;1536:6;1532:17;1497:80;:::i;1588:322::-;1657:6;1710:2;1698:9;1689:7;1685:23;1681:32;1678:52;;;1726:1;1723;1716:12;1678:52;1766:9;1753:23;-1:-1:-1;;;;;1791:6:1;1788:30;1785:50;;;1831:1;1828;1821:12;1785:50;1854;1896:7;1887:6;1876:9;1872:22;1854:50;:::i;1915:258::-;1987:1;1997:113;2011:6;2008:1;2005:13;1997:113;;;2087:11;;;2081:18;2068:11;;;2061:39;2033:2;2026:10;1997:113;;;2128:6;2125:1;2122:13;2119:48;;;-1:-1:-1;;2163:1:1;2145:16;;2138:27;1915:258::o;2178:269::-;2231:3;2269:5;2263:12;2296:6;2291:3;2284:19;2312:63;2368:6;2361:4;2356:3;2352:14;2345:4;2338:5;2334:16;2312:63;:::i;:::-;2429:2;2408:15;-1:-1:-1;;2404:29:1;2395:39;;;;2436:4;2391:50;;2178:269;-1:-1:-1;;2178:269:1:o;2452:231::-;2601:2;2590:9;2583:21;2564:4;2621:56;2673:2;2662:9;2658:18;2650:6;2621:56;:::i;2688:180::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;-1:-1:-1;2839:23:1;;2688:180;-1:-1:-1;2688:180:1:o;3081:173::-;3149:20;;-1:-1:-1;;;;;3198:31:1;;3188:42;;3178:70;;3244:1;3241;3234:12;3259:254;3327:6;3335;3388:2;3376:9;3367:7;3363:23;3359:32;3356:52;;;3404:1;3401;3394:12;3356:52;3427:29;3446:9;3427:29;:::i;:::-;3417:39;3503:2;3488:18;;;;3475:32;;-1:-1:-1;;;3259:254:1:o;3518:160::-;3583:20;;3639:13;;3632:21;3622:32;;3612:60;;3668:1;3665;3658:12;3683:180;3739:6;3792:2;3780:9;3771:7;3767:23;3763:32;3760:52;;;3808:1;3805;3798:12;3760:52;3831:26;3847:9;3831:26;:::i;4050:186::-;4109:6;4162:2;4150:9;4141:7;4137:23;4133:32;4130:52;;;4178:1;4175;4168:12;4130:52;4201:29;4220:9;4201:29;:::i;4241:328::-;4318:6;4326;4334;4387:2;4375:9;4366:7;4362:23;4358:32;4355:52;;;4403:1;4400;4393:12;4355:52;4426:29;4445:9;4426:29;:::i;:::-;4416:39;;4474:38;4508:2;4497:9;4493:18;4474:38;:::i;:::-;4464:48;;4559:2;4548:9;4544:18;4531:32;4521:42;;4241:328;;;;;:::o;4941:632::-;5112:2;5164:21;;;5234:13;;5137:18;;;5256:22;;;5083:4;;5112:2;5335:15;;;;5309:2;5294:18;;;5083:4;5378:169;5392:6;5389:1;5386:13;5378:169;;;5453:13;;5441:26;;5522:15;;;;5487:12;;;;5414:1;5407:9;5378:169;;;-1:-1:-1;5564:3:1;;4941:632;-1:-1:-1;;;;;;4941:632:1:o;5578:615::-;5664:6;5672;5725:2;5713:9;5704:7;5700:23;5696:32;5693:52;;;5741:1;5738;5731:12;5693:52;5781:9;5768:23;-1:-1:-1;;;;;5851:2:1;5843:6;5840:14;5837:34;;;5867:1;5864;5857:12;5837:34;5905:6;5894:9;5890:22;5880:32;;5950:7;5943:4;5939:2;5935:13;5931:27;5921:55;;5972:1;5969;5962:12;5921:55;6012:2;5999:16;6038:2;6030:6;6027:14;6024:34;;;6054:1;6051;6044:12;6024:34;6107:7;6102:2;6092:6;6089:1;6085:14;6081:2;6077:23;6073:32;6070:45;6067:65;;;6128:1;6125;6118:12;6067:65;6159:2;6151:11;;;;;6181:6;;-1:-1:-1;5578:615:1;;-1:-1:-1;;;;5578:615:1:o;6198:254::-;6263:6;6271;6324:2;6312:9;6303:7;6299:23;6295:32;6292:52;;;6340:1;6337;6330:12;6292:52;6363:29;6382:9;6363:29;:::i;:::-;6353:39;;6411:35;6442:2;6431:9;6427:18;6411:35;:::i;:::-;6401:45;;6198:254;;;;;:::o;6457:667::-;6552:6;6560;6568;6576;6629:3;6617:9;6608:7;6604:23;6600:33;6597:53;;;6646:1;6643;6636:12;6597:53;6669:29;6688:9;6669:29;:::i;:::-;6659:39;;6717:38;6751:2;6740:9;6736:18;6717:38;:::i;:::-;6707:48;;6802:2;6791:9;6787:18;6774:32;6764:42;;6857:2;6846:9;6842:18;6829:32;-1:-1:-1;;;;;6876:6:1;6873:30;6870:50;;;6916:1;6913;6906:12;6870:50;6939:22;;6992:4;6984:13;;6980:27;-1:-1:-1;6970:55:1;;7021:1;7018;7011:12;6970:55;7044:74;7110:7;7105:2;7092:16;7087:2;7083;7079:11;7044:74;:::i;:::-;7034:84;;;6457:667;;;;;;;:::o;7129:390::-;7207:6;7215;7268:2;7256:9;7247:7;7243:23;7239:32;7236:52;;;7284:1;7281;7274:12;7236:52;7320:9;7307:23;7297:33;;7381:2;7370:9;7366:18;7353:32;-1:-1:-1;;;;;7400:6:1;7397:30;7394:50;;;7440:1;7437;7430:12;7394:50;7463;7505:7;7496:6;7485:9;7481:22;7463:50;:::i;:::-;7453:60;;;7129:390;;;;;:::o;7524:260::-;7592:6;7600;7653:2;7641:9;7632:7;7628:23;7624:32;7621:52;;;7669:1;7666;7659:12;7621:52;7692:29;7711:9;7692:29;:::i;:::-;7682:39;;7740:38;7774:2;7763:9;7759:18;7740:38;:::i;7789:356::-;7991:2;7973:21;;;8010:18;;;8003:30;8069:34;8064:2;8049:18;;8042:62;8136:2;8121:18;;7789:356::o;8150:380::-;8229:1;8225:12;;;;8272;;;8293:61;;8347:4;8339:6;8335:17;8325:27;;8293:61;8400:2;8392:6;8389:14;8369:18;8366:38;8363:161;;;8446:10;8441:3;8437:20;8434:1;8427:31;8481:4;8478:1;8471:15;8509:4;8506:1;8499:15;11412:127;11473:10;11468:3;11464:20;11461:1;11454:31;11504:4;11501:1;11494:15;11528:4;11525:1;11518:15;11544:127;11605:10;11600:3;11596:20;11593:1;11586:31;11636:4;11633:1;11626:15;11660:4;11657:1;11650:15;11676:135;11715:3;-1:-1:-1;;11736:17:1;;11733:43;;;11756:18;;:::i;:::-;-1:-1:-1;11803:1:1;11792:13;;11676:135::o;11816:341::-;12018:2;12000:21;;;12057:2;12037:18;;;12030:30;-1:-1:-1;;;12091:2:1;12076:18;;12069:47;12148:2;12133:18;;11816:341::o;12288:185::-;12330:3;12368:5;12362:12;12383:52;12428:6;12423:3;12416:4;12409:5;12405:16;12383:52;:::i;:::-;12451:16;;;;;12288:185;-1:-1:-1;;12288:185:1:o;12478:1174::-;12654:3;12683:1;12716:6;12710:13;12746:3;12768:1;12796:9;12792:2;12788:18;12778:28;;12856:2;12845:9;12841:18;12878;12868:61;;12922:4;12914:6;12910:17;12900:27;;12868:61;12948:2;12996;12988:6;12985:14;12965:18;12962:38;12959:165;;;-1:-1:-1;;;13023:33:1;;13079:4;13076:1;13069:15;13109:4;13030:3;13097:17;12959:165;13140:18;13167:104;;;;13285:1;13280:320;;;;13133:467;;13167:104;-1:-1:-1;;13200:24:1;;13188:37;;13245:16;;;;-1:-1:-1;13167:104:1;;13280:320;12235:1;12228:14;;;12272:4;12259:18;;13375:1;13389:165;13403:6;13400:1;13397:13;13389:165;;;13481:14;;13468:11;;;13461:35;13524:16;;;;13418:10;;13389:165;;;13393:3;;13583:6;13578:3;13574:16;13567:23;;13133:467;;;;;;;13616:30;13642:3;13634:6;13616:30;:::i;:::-;13609:37;12478:1174;-1:-1:-1;;;;;12478:1174:1:o;14009:128::-;14049:3;14080:1;14076:6;14073:1;14070:13;14067:39;;;14086:18;;:::i;:::-;-1:-1:-1;14122:9:1;;14009:128::o;15065:125::-;15105:4;15133:1;15130;15127:8;15124:34;;;15138:18;;:::i;:::-;-1:-1:-1;15175:9:1;;15065:125::o;15887:415::-;16089:2;16071:21;;;16128:2;16108:18;;;16101:30;16167:34;16162:2;16147:18;;16140:62;-1:-1:-1;;;16233:2:1;16218:18;;16211:49;16292:3;16277:19;;15887:415::o;18383:127::-;18444:10;18439:3;18435:20;18432:1;18425:31;18475:4;18472:1;18465:15;18499:4;18496:1;18489:15;18515:120;18555:1;18581;18571:35;;18586:18;;:::i;:::-;-1:-1:-1;18620:9:1;;18515:120::o;18640:168::-;18680:7;18746:1;18742;18738:6;18734:14;18731:1;18728:21;18723:1;18716:9;18709:17;18705:45;18702:71;;;18753:18;;:::i;:::-;-1:-1:-1;18793:9:1;;18640:168::o;22620:112::-;22652:1;22678;22668:35;;22683:18;;:::i;:::-;-1:-1:-1;22717:9:1;;22620:112::o;23094:604::-;23457:25;23452:3;23445:38;23427:3;23512:6;23506:13;23528:62;23583:6;23578:2;23573:3;23569:12;23562:4;23554:6;23550:17;23528:62;:::i;:::-;-1:-1:-1;;;23649:2:1;23609:16;;;;23641:11;;;23634:31;-1:-1:-1;23689:2:1;23681:11;;23094:604;-1:-1:-1;23094:604:1:o;23703:761::-;24013:34;24008:3;24001:47;24078:34;24073:2;24068:3;24064:12;24057:56;-1:-1:-1;;;24138:2:1;24133:3;24129:12;24122:46;23983:3;24197:6;24191:13;24213:60;24266:6;24261:2;24256:3;24252:12;24247:2;24239:6;24235:15;24213:60;:::i;:::-;24333:13;;24292:16;;;;24355:61;24333:13;24402:2;24394:11;;24389:2;24377:15;;24355:61;:::i;:::-;24436:17;24455:2;24432:26;;23703:761;-1:-1:-1;;;;23703:761:1:o;24469:782::-;24832:34;24827:3;24820:47;24897:34;24892:2;24887:3;24883:12;24876:56;24962:34;24957:2;24952:3;24948:12;24941:56;-1:-1:-1;;;25022:2:1;25017:3;25013:12;25006:27;24802:3;25062:6;25056:13;25078:60;25131:6;25126:2;25121:3;25117:12;25112:2;25104:6;25100:15;25078:60;:::i;:::-;-1:-1:-1;;;25197:2:1;25157:16;;;;25189:11;;;25182:35;-1:-1:-1;25241:3:1;25233:12;;24469:782;-1:-1:-1;24469:782:1:o;25256:1449::-;25675:3;25713:6;25707:13;25739:4;25752:51;25796:6;25791:3;25786:2;25778:6;25774:15;25752:51;:::i;:::-;25866:13;;25825:16;;;;25888:55;25866:13;25825:16;25910:15;;;25888:55;:::i;:::-;26010:13;;25965:20;;;26032:55;26010:13;25965:20;26054:15;;;26032:55;:::i;:::-;26154:13;;26109:20;;;26176:55;26154:13;26109:20;26198:15;;;26176:55;:::i;:::-;26298:13;;26253:20;;;26320:55;26298:13;26253:20;26342:15;;;26320:55;:::i;:::-;26442:13;;26397:20;;;26464:55;26442:13;26397:20;26486:15;;;26464:55;:::i;:::-;26586:13;;26541:20;;;26608:55;26586:13;26541:20;26630:15;;;26608:55;:::i;:::-;26679:20;;;;;25256:1449;-1:-1:-1;;;;;;;;;;25256:1449:1:o;27054:500::-;-1:-1:-1;;;;;27323:15:1;;;27305:34;;27375:15;;27370:2;27355:18;;27348:43;27422:2;27407:18;;27400:34;;;27470:3;27465:2;27450:18;;27443:31;;;27248:4;;27491:57;;27528:19;;27520:6;27491:57;:::i;:::-;27483:65;27054:500;-1:-1:-1;;;;;;27054:500:1:o;27559:249::-;27628:6;27681:2;27669:9;27660:7;27656:23;27652:32;27649:52;;;27697:1;27694;27687:12;27649:52;27729:9;27723:16;27748:30;27772:5;27748:30;:::i;27943:2155::-;-1:-1:-1;;;28842:68:1;;28933:13;;28824:3;;28955:62;28933:13;29005:2;28996:12;;28989:4;28977:17;;28955:62;:::i;:::-;29081:66;29076:2;29036:16;;;29068:11;;;29061:87;-1:-1:-1;;;29172:2:1;29164:11;;29157:59;-1:-1:-1;;;29240:2:1;29232:11;;29225:65;29315:13;;29337:63;29315:13;29386:2;29378:11;;29371:4;29359:17;;29337:63;:::i;:::-;29465:66;29460:2;29419:17;;;;29452:11;;;29445:87;-1:-1:-1;;;29556:3:1;29548:12;;29541:73;29639:13;;29661:64;29639:13;29710:3;29702:12;;29695:4;29683:17;;29661:64;:::i;:::-;29791:66;29785:3;29744:17;;;;29777:12;;;29770:88;29888:66;29882:3;29874:12;;29867:88;-1:-1:-1;;;29979:3:1;29971:12;;29964:42;30022:70;30052:39;30086:3;30078:12;;30070:6;30052:39;:::i;:::-;-1:-1:-1;;;27878:27:1;;27930:1;27921:11;;27813:125;30022:70;30015:77;27943:2155;-1:-1:-1;;;;;;;27943:2155:1:o;30103:448::-;30365:31;30360:3;30353:44;30335:3;30426:6;30420:13;30442:62;30497:6;30492:2;30487:3;30483:12;30476:4;30468:6;30464:17;30442:62;:::i;:::-;30524:16;;;;30542:2;30520:25;;30103:448;-1:-1:-1;;30103:448:1:o

Swarm Source

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