ETH Price: $3,415.13 (+3.11%)
Gas: 9.54 Gwei

Token

Bloot Character (BLOOTCHAR)
 

Overview

Max Total Supply

149 BLOOTCHAR

Holders

81

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
0x2144.eth
Balance
2 BLOOTCHAR
0xb29210773ae62cb687e68b4b4397acf1f126d722
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:
BlootCharacter

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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







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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface LootInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract BlootCharacter is ERC721Enumerable, ReentrancyGuard, Ownable {
    //Loot Contract
    address public lootAddress = 0x4F8730E0b32B04beaa5757e5aea3aeF970E5B613;
    LootInterface public lootContract = LootInterface(lootAddress);

    string[] private iam = [
        "Baller",
        "Bearish",
        "Broke",
        "Bullish",
        "Chill",
        "Drunk",
        "Fine",
        "Hungover",
        "Horny",
        "King",
        "Shitfaced",
        "Sick",
        "Smart",
        "Sober",
        "Stoned",
        "Wild",
        "Woke",
        "Zen"
    ];
    
    string[] private chartype = [
        "Ape",
        "Alien",
        "Blob",
        "Bloot",
        "Bread",
        "Cock",
        "Degen",
        "Dog",
        "Human",
        "Maxi",
        "Monster",
        "Mutant",
        "Pepe",
        "Piece of rock",
        "Robot",
        "Tree",
        "Turtle",
        "Unicorn"
    ];


    string[] private currently = [
        "Apeing",
        "Blooting",
        "Coping",
        "Dancing",
        "Doomping",
        "FOMOing",
        "Holding",
        "Hoping",
        "Jerking",
        "Mooning",
        "Napping",
        "Partying",
        "Poomping",
        "Shilling",
        "Sleeping",
        "Working",
        "Zooming"
    ];

    string[] private vibecheck = [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12",
        "13",
        "14",
        "15",
        "16",
        "17",
        "18",
        "19",
        "20"
    ];

    string[] private gmi = [
        "maybe",
        "almost",
        "sure",
        "ya",
        "ye",
        "yep",
        "yes",
        "you bet",
        "certainly",
        "definitely",
        "indubitably",
        "hell yeah",
        "fuck yeah",
        "ofc i have fucking bloot"
    ];    

    //generating a random number
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getIam(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "I am a", iam);
    }

    function getChartype(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Type", chartype);
    }
    
    function getCurrently(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Currently", currently);
    }

    function getVibecheck(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Vibe check", vibecheck);
    }    
    
    function getGmi(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "gmi?", gmi);
    }    

    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        output = string(abi.encodePacked(keyPrefix, ": ", output));

        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[11] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: black; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="#01ff01" /><text x="10" y="20" class="base">';

        parts[1] = getIam(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getChartype(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getCurrently(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getVibecheck(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getGmi(tokenId);

        parts[10] = '</text></svg>';            

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8], parts[9], parts[10]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Bloot Character #', toString(tokenId), '", "description": "Bloot Characters are randomized RPG style characters generated and stored on chain. Feel free to use Bloot Characters in any way you want. Inspired by and compatible with Bloot.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function mint(uint256 tokenId) public nonReentrant {
        require(tokenId > 8008 && tokenId <= 20000, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }

    function multiMint(uint256[] memory tokenIds) public nonReentrant {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(tokenIds[i] > 8008 && tokenIds[i] < 20000, "Token ID invalid");
            _safeMint(msg.sender, tokenIds[i]);
        }
    }

    function mintWithBloot(uint256 lootId) public nonReentrant {
        require(lootId > 0 && lootId <= 8008, "Token ID invalid");
        require(lootContract.ownerOf(lootId) == msg.sender, "Not the owner of this Bloot");
        _safeMint(_msgSender(), lootId);
    }

    function multiMintWithBloot(uint256[] memory lootIds) public nonReentrant {
        for (uint256 i = 0; i < lootIds.length; i++) {
            require(lootContract.ownerOf(lootIds[i]) == msg.sender, "Not the owner of this Bloot");
            _safeMint(_msgSender(), lootIds[i]);
        }
    }

    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Bloot Character", "BLOOTCHAR") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getChartype","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCurrently","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getGmi","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getIam","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getVibecheck","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"lootAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lootContract","outputs":[{"internalType":"contract LootInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootId","type":"uint256"}],"name":"mintWithBloot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"multiMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"lootIds","type":"uint256[]"}],"name":"multiMintWithBloot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052734f8730e0b32b04beaa5757e5aea3aef970e5b613600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518061024001604052806040518060400160405280600681526020017f42616c6c6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f426561726973680000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42726f6b6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f42756c6c6973680000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4368696c6c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4472756e6b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f46696e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f48756e676f76657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486f726e7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b696e670000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f536869746661636564000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5369636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536d61727400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536f62657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53746f6e6564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f57696c640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f576f6b650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f5a656e0000000000000000000000000000000000000000000000000000000000815250815250600e906012620004fe92919062001704565b506040518061024001604052806040518060400160405280600381526020017f417065000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416c69656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426c6f620000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426c6f6f7400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f427265616400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436f636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f446567656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f446f67000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f48756d616e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d6178690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d6f6e737465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d7574616e74000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f506570650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f5069656365206f6620726f636b0000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f526f626f7400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f547265650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f547572746c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f556e69636f726e00000000000000000000000000000000000000000000000000815250815250600f9060126200094192919062001704565b506040518061022001604052806040518060400160405280600681526020017f417065696e67000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f426c6f6f74696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f70696e67000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f44616e63696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f446f6f6d70696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f464f4d4f696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f486f6c64696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f486f70696e67000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4a65726b696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d6f6f6e696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4e617070696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5061727479696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f506f6f6d70696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5368696c6c696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536c656570696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f576f726b696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5a6f6f6d696e6700000000000000000000000000000000000000000000000000815250815250601090601162000d499291906200176b565b506040518061028001604052806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f330000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f340000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f360000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f370000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f380000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f390000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313100000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313200000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313300000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313400000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313500000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313600000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313700000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313800000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f313900000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f3230000000000000000000000000000000000000000000000000000000000000815250815250601190601462001202929190620017d2565b50604051806101c001604052806040518060400160405280600581526020017f6d6179626500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f616c6d6f7374000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f737572650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f796100000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f796500000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f796570000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f796573000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f796f75206265740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6365727461696e6c79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f646566696e6974656c790000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f696e647562697461626c7900000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f68656c6c2079656168000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6675636b2079656168000000000000000000000000000000000000000000000081525081526020016040518060400160405280601881526020017f6f666320692068617665206675636b696e6720626c6f6f740000000000000000815250815250601290600e6200155992919062001839565b503480156200156757600080fd5b506040518060400160405280600f81526020017f426c6f6f742043686172616374657200000000000000000000000000000000008152506040518060400160405280600981526020017f424c4f4f544348415200000000000000000000000000000000000000000000008152508160009080519060200190620015ec929190620018a0565b50806001908051906020019062001605929190620018a0565b5050506001600a8190555062001630620016246200163660201b60201c565b6200163e60201b60201c565b62001a23565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562001758579160200282015b828111156200175757825182908051906020019062001746929190620018a0565b509160200191906001019062001725565b5b50905062001767919062001931565b5090565b828054828255906000526020600020908101928215620017bf579160200282015b82811115620017be578251829080519060200190620017ad929190620018a0565b50916020019190600101906200178c565b5b509050620017ce919062001931565b5090565b82805482825590600052602060002090810192821562001826579160200282015b828111156200182557825182908051906020019062001814929190620018a0565b5091602001919060010190620017f3565b5b50905062001835919062001931565b5090565b8280548282559060005260206000209081019282156200188d579160200282015b828111156200188c5782518290805190602001906200187b929190620018a0565b50916020019190600101906200185a565b5b5090506200189c919062001931565b5090565b828054620018ae90620019be565b90600052602060002090601f016020900481019282620018d257600085556200191e565b82601f10620018ed57805160ff19168380011785556200191e565b828001600101855582156200191e579182015b828111156200191d57825182559160200191906001019062001900565b5b5090506200192d919062001959565b5090565b5b808211156200195557600081816200194b919062001978565b5060010162001932565b5090565b5b80821115620019745760008160009055506001016200195a565b5090565b5080546200198690620019be565b6000825580601f106200199a5750620019bb565b601f016020900490600052602060002090810190620019ba919062001959565b5b50565b60006002820490506001821680620019d757607f821691505b60208210811415620019ee57620019ed620019f4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6151388062001a336000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063b40c25d2116100a2578063e985e9c511610071578063e985e9c514610579578063ec41968c146105a9578063f2fde38b146105d9578063ff5fe0c8146105f5576101da565b8063b40c25d2146104e1578063b88d4fde146104fd578063bf9d879d14610519578063c87b56dd14610549576101da565b806395d89b41116100de57806395d89b411461046f5780639a0e4ebb1461048d578063a0712d68146104a9578063a22cb465146104c5576101da565b806370a0823114610417578063715018a6146104475780638da5cb5b14610451576101da565b80632f745c591161017c57806352dbc0431161014b57806352dbc0431461036b5780636352211e1461039b578063635364ed146103cb57806363812e9a146103fb576101da565b80632f745c59146102d157806335b48afd1461030157806342842e0e1461031f5780634f6ccce71461033b576101da565b8063095ea7b3116101b8578063095ea7b31461025d5780630e4393261461027957806318160ddd1461029757806323b872dd146102b5576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190613b38565b610625565b604051610206919061479b565b60405180910390f35b61021761069f565b60405161022491906147d1565b60405180910390f35b61024760048036038101906102429190613b8a565b610731565b6040516102549190614734565b60405180910390f35b61027760048036038101906102729190613abb565b6107b6565b005b6102816108ce565b60405161028e9190614734565b60405180910390f35b61029f6108f4565b6040516102ac9190614a73565b60405180910390f35b6102cf60048036038101906102ca91906139b5565b610901565b005b6102eb60048036038101906102e69190613abb565b610961565b6040516102f89190614a73565b60405180910390f35b610309610a06565b60405161031691906147b6565b60405180910390f35b610339600480360381019061033491906139b5565b610a2c565b005b61035560048036038101906103509190613b8a565b610a4c565b6040516103629190614a73565b60405180910390f35b61038560048036038101906103809190613b8a565b610ae3565b60405161039291906147d1565b60405180910390f35b6103b560048036038101906103b09190613b8a565b610bfd565b6040516103c29190614734565b60405180910390f35b6103e560048036038101906103e09190613b8a565b610caf565b6040516103f291906147d1565b60405180910390f35b61041560048036038101906104109190613af7565b610dc9565b005b610431600480360381019061042c9190613927565b610feb565b60405161043e9190614a73565b60405180910390f35b61044f6110a3565b005b61045961112b565b6040516104669190614734565b60405180910390f35b610477611155565b60405161048491906147d1565b60405180910390f35b6104a760048036038101906104a29190613af7565b6111e7565b005b6104c360048036038101906104be9190613b8a565b61137b565b005b6104df60048036038101906104da9190613a7f565b611437565b005b6104fb60048036038101906104f69190613b8a565b6115b8565b005b61051760048036038101906105129190613a04565b61178b565b005b610533600480360381019061052e9190613b8a565b6117ed565b60405161054091906147d1565b60405180910390f35b610563600480360381019061055e9190613b8a565b611907565b60405161057091906147d1565b60405180910390f35b610593600480360381019061058e9190613979565b612015565b6040516105a0919061479b565b60405180910390f35b6105c360048036038101906105be9190613b8a565b6120a9565b6040516105d091906147d1565b60405180910390f35b6105f360048036038101906105ee9190613927565b6121c3565b005b61060f600480360381019061060a9190613b8a565b6122bb565b60405161061c91906147d1565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106985750610697826123d5565b5b9050919050565b6060600080546106ae90614d4d565b80601f01602080910402602001604051908101604052809291908181526020018280546106da90614d4d565b80156107275780601f106106fc57610100808354040283529160200191610727565b820191906000526020600020905b81548152906001019060200180831161070a57829003601f168201915b5050505050905090565b600061073c826124b7565b61077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077290614973565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c182610bfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610832576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610829906149f3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610851612523565b73ffffffffffffffffffffffffffffffffffffffff161480610880575061087f8161087a612523565b612015565b5b6108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b6906148f3565b60405180910390fd5b6108c9838361252b565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b61091261090c612523565b826125e4565b610951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094890614a13565b60405180910390fd5b61095c8383836126c2565b505050565b600061096c83610feb565b82106109ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a4906147f3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a478383836040518060200160405280600081525061178b565b505050565b6000610a566108f4565b8210610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90614a33565b60405180910390fd5b60088281548110610ad1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6060610bf6826040518060400160405280600481526020017f5479706500000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610bed578382906000526020600020018054610b6090614d4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8c90614d4d565b8015610bd95780601f10610bae57610100808354040283529160200191610bd9565b820191906000526020600020905b815481529060010190602001808311610bbc57829003601f168201915b505050505081526020019060010190610b41565b5050505061291e565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90614933565b60405180910390fd5b80915050919050565b6060610dc2826040518060400160405280600981526020017f43757272656e746c7900000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610db9578382906000526020600020018054610d2c90614d4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5890614d4d565b8015610da55780601f10610d7a57610100808354040283529160200191610da5565b820191906000526020600020905b815481529060010190602001808311610d8857829003601f168201915b505050505081526020019060010190610d0d565b5050505061291e565b9050919050565b6002600a541415610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0690614a53565b60405180910390fd5b6002600a8190555060005b8151811015610fdf573373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610eb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610ed59190614a73565b60206040518083038186803b158015610eed57600080fd5b505afa158015610f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f259190613950565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290614833565b60405180910390fd5b610fcc610f86612523565b838381518110610fbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516129d7565b8080610fd790614d7f565b915050610e1a565b506001600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105390614913565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110ab612523565b73ffffffffffffffffffffffffffffffffffffffff166110c961112b565b73ffffffffffffffffffffffffffffffffffffffff161461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690614993565b60405180910390fd5b61112960006129f5565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116490614d4d565b80601f016020809104026020016040519081016040528092919081815260200182805461119090614d4d565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b5050505050905090565b6002600a54141561122d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122490614a53565b60405180910390fd5b6002600a8190555060005b815181101561136f57611f4882828151811061127d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511180156112d35750614e208282815181106112c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151105b611312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611309906149b3565b60405180910390fd5b61135c3383838151811061134f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516129d7565b808061136790614d7f565b915050611238565b506001600a8190555050565b6002600a5414156113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890614a53565b60405180910390fd5b6002600a81905550611f48811180156113dc5750614e208111155b61141b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611412906149b3565b60405180910390fd5b61142c611426612523565b826129d7565b6001600a8190555050565b61143f612523565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a4906148b3565b60405180910390fd5b80600560006114ba612523565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611567612523565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115ac919061479b565b60405180910390a35050565b6002600a5414156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614a53565b60405180910390fd5b6002600a819055506000811180156116185750611f488111155b611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e906149b3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016116c99190614a73565b60206040518083038186803b1580156116e157600080fd5b505afa1580156116f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117199190613950565b73ffffffffffffffffffffffffffffffffffffffff161461176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614833565b60405180910390fd5b61178061177a612523565b826129d7565b6001600a8190555050565b61179c611796612523565b836125e4565b6117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614a13565b60405180910390fd5b6117e784848484612abb565b50505050565b6060611900826040518060400160405280600a81526020017f5669626520636865636b000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b828210156118f757838290600052602060002001805461186a90614d4d565b80601f016020809104026020016040519081016040528092919081815260200182805461189690614d4d565b80156118e35780601f106118b8576101008083540402835291602001916118e3565b820191906000526020600020905b8154815290600101906020018083116118c657829003601f168201915b50505050508152602001906001019061184b565b5050505061291e565b9050919050565b6060611911613783565b60405180610120016040528060ff8152602001614f9c60ff9139816000600b8110611965577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611976836122bb565b816001600b81106119b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602881526020016150db60289139816002600b8110611a0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611a1c83610ae3565b816003600b8110611a56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614f2360289139816004600b8110611ab1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611ac283610caf565b816005600b8110611afc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614f4b60289139816006600b8110611b57577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611b68836117ed565b816007600b8110611ba2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614f7360299139816008600b8110611bfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611c0e836120a9565b816009600b8110611c48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600a600b8110611cc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600b8110611d04577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600b8110611d43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151836002600b8110611d82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003600b8110611dc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600b8110611e00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600b8110611e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151876006600b8110611e7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151886007600b8110611ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008600b8110611efc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518a6009600b8110611f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518b600a600b8110611f7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611f999b9a99989796959493929190614605565b60405160208183030381529060405290506000611fe6611fb886612b17565b611fc184612cc4565b604051602001611fd29291906146cd565b604051602081830303815290604052612cc4565b905080604051602001611ff99190614712565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606121bc826040518060400160405280600481526020017f676d693f000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b828210156121b357838290600052602060002001805461212690614d4d565b80601f016020809104026020016040519081016040528092919081815260200182805461215290614d4d565b801561219f5780601f106121745761010080835404028352916020019161219f565b820191906000526020600020905b81548152906001019060200180831161218257829003601f168201915b505050505081526020019060010190612107565b5050505061291e565b9050919050565b6121cb612523565b73ffffffffffffffffffffffffffffffffffffffff166121e961112b565b73ffffffffffffffffffffffffffffffffffffffff161461223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690614993565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a690614853565b60405180910390fd5b6122b8816129f5565b50565b60606123ce826040518060400160405280600681526020017f4920616d20610000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156123c557838290600052602060002001805461233890614d4d565b80601f016020809104026020016040519081016040528092919081815260200182805461236490614d4d565b80156123b15780601f10612386576101008083540402835291602001916123b1565b820191906000526020600020905b81548152906001019060200180831161239457829003601f168201915b505050505081526020019060010190612319565b5050505061291e565b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124b057506124af82612e82565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661259e83610bfd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125ef826124b7565b61262e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612625906148d3565b60405180910390fd5b600061263983610bfd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126a857508373ffffffffffffffffffffffffffffffffffffffff1661269084610731565b73ffffffffffffffffffffffffffffffffffffffff16145b806126b957506126b88185612015565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126e282610bfd565b73ffffffffffffffffffffffffffffffffffffffff1614612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f906149d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279f90614893565b60405180910390fd5b6127b3838383612eec565b6127be60008261252b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280e9190614c3f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128659190614b5e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060006129548461292f87612b17565b6040516020016129409291906145e1565b604051602081830303815290604052613000565b90506000838451836129669190614dc8565b8151811061299d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905084816040516020016129ba92919061469e565b604051602081830303815290604052905080925050509392505050565b6129f1828260405180602001604052806000815250613033565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ac68484846126c2565b612ad28484848461308e565b612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890614813565b60405180910390fd5b50505050565b60606000821415612b5f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cbf565b600082905060005b60008214612b91578080612b7a90614d7f565b915050600a82612b8a9190614bb4565b9150612b67565b60008167ffffffffffffffff811115612bd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c055781602001600182028036833780820191505090505b5090505b60008514612cb857600182612c1e9190614c3f565b9150600a85612c2d9190614dc8565b6030612c399190614b5e565b60f81b818381518110612c75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cb19190614bb4565b9450612c09565b8093505050505b919050565b60606000825190506000811415612ced5760405180602001604052806000815250915050612e7d565b60006003600283612cfe9190614b5e565b612d089190614bb4565b6004612d149190614be5565b90506000602082612d259190614b5e565b67ffffffffffffffff811115612d64577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612d965781602001600182028036833780820191505090505b509050600060405180606001604052806040815260200161509b604091399050600181016020830160005b86811015612e3a5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612dc1565b506003860660018114612e545760028114612e6457612e6f565b613d3d60f01b6002830352612e6f565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ef7838383613225565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f3a57612f358161322a565b612f79565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f7857612f778382613273565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fbc57612fb7816133e0565b612ffb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ffa57612ff98282613523565b5b5b505050565b60008160405160200161301391906145ca565b6040516020818303038152906040528051906020012060001c9050919050565b61303d83836135a2565b61304a600084848461308e565b613089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308090614813565b60405180910390fd5b505050565b60006130af8473ffffffffffffffffffffffffffffffffffffffff16613770565b15613218578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130d8612523565b8786866040518563ffffffff1660e01b81526004016130fa949392919061474f565b602060405180830381600087803b15801561311457600080fd5b505af192505050801561314557506040513d601f19601f820116820180604052508101906131429190613b61565b60015b6131c8573d8060008114613175576040519150601f19603f3d011682016040523d82523d6000602084013e61317a565b606091505b506000815114156131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b790614813565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061321d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161328084610feb565b61328a9190614c3f565b905060006007600084815260200190815260200160002054905081811461336f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133f49190614c3f565b905060006009600084815260200190815260200160002054905060006008838154811061344a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613492577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613507577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061352e83610feb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360990614953565b60405180910390fd5b61361b816124b7565b1561365b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365290614873565b60405180910390fd5b61366760008383612eec565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136b79190614b5e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101600160405280600b905b60608152602001906001900390816137935790505090565b60006137be6137b984614abf565b614a8e565b905080838252602082019050828560208602820111156137dd57600080fd5b60005b8581101561380d57816137f38882613912565b8452602084019350602083019250506001810190506137e0565b5050509392505050565b600061382a61382584614aeb565b614a8e565b90508281526020810184848401111561384257600080fd5b61384d848285614d0b565b509392505050565b60008135905061386481614ec6565b92915050565b60008151905061387981614ec6565b92915050565b600082601f83011261389057600080fd5b81356138a08482602086016137ab565b91505092915050565b6000813590506138b881614edd565b92915050565b6000813590506138cd81614ef4565b92915050565b6000815190506138e281614ef4565b92915050565b600082601f8301126138f957600080fd5b8135613909848260208601613817565b91505092915050565b60008135905061392181614f0b565b92915050565b60006020828403121561393957600080fd5b600061394784828501613855565b91505092915050565b60006020828403121561396257600080fd5b60006139708482850161386a565b91505092915050565b6000806040838503121561398c57600080fd5b600061399a85828601613855565b92505060206139ab85828601613855565b9150509250929050565b6000806000606084860312156139ca57600080fd5b60006139d886828701613855565b93505060206139e986828701613855565b92505060406139fa86828701613912565b9150509250925092565b60008060008060808587031215613a1a57600080fd5b6000613a2887828801613855565b9450506020613a3987828801613855565b9350506040613a4a87828801613912565b925050606085013567ffffffffffffffff811115613a6757600080fd5b613a73878288016138e8565b91505092959194509250565b60008060408385031215613a9257600080fd5b6000613aa085828601613855565b9250506020613ab1858286016138a9565b9150509250929050565b60008060408385031215613ace57600080fd5b6000613adc85828601613855565b9250506020613aed85828601613912565b9150509250929050565b600060208284031215613b0957600080fd5b600082013567ffffffffffffffff811115613b2357600080fd5b613b2f8482850161387f565b91505092915050565b600060208284031215613b4a57600080fd5b6000613b58848285016138be565b91505092915050565b600060208284031215613b7357600080fd5b6000613b81848285016138d3565b91505092915050565b600060208284031215613b9c57600080fd5b6000613baa84828501613912565b91505092915050565b613bbc81614c73565b82525050565b613bcb81614c85565b82525050565b6000613bdc82614b1b565b613be68185614b31565b9350613bf6818560208601614d1a565b613bff81614eb5565b840191505092915050565b613c1381614ce7565b82525050565b6000613c2482614b26565b613c2e8185614b42565b9350613c3e818560208601614d1a565b613c4781614eb5565b840191505092915050565b6000613c5d82614b26565b613c678185614b53565b9350613c77818560208601614d1a565b80840191505092915050565b6000613c90602b83614b42565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613cf6603283614b42565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d5c601b83614b42565b91507f4e6f7420746865206f776e6572206f66207468697320426c6f6f7400000000006000830152602082019050919050565b6000613d9c602683614b42565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e02601c83614b42565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e42602483614b42565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ea8601983614b42565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613ee8601b83614b53565b91507f7b226e616d65223a2022426c6f6f7420436861726163746572202300000000006000830152601b82019050919050565b6000613f28602c83614b42565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f8e603883614b42565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613ff460eb83614b53565b91507f222c20226465736372697074696f6e223a2022426c6f6f74204368617261637460008301527f657273206172652072616e646f6d697a656420525047207374796c652063686160208301527f726163746572732067656e65726174656420616e642073746f726564206f6e2060408301527f636861696e2e204665656c206672656520746f2075736520426c6f6f7420436860608301527f617261637465727320696e20616e792077617920796f752077616e742e20496e60808301527f73706972656420627920616e6420636f6d70617469626c65207769746820426c60a08301527f6f6f742e222c2022696d616765223a2022646174613a696d6167652f7376672b60c08301527f786d6c3b6261736536342c00000000000000000000000000000000000000000060e083015260eb82019050919050565b600061413e602a83614b42565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141a4602983614b42565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061420a600283614b53565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061424a602083614b42565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061428a602c83614b42565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142f0602083614b42565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614330601083614b42565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b6000614370602983614b42565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006143d6602183614b42565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061443c601d83614b53565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b600061447c603183614b42565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006144e2602c83614b42565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614548600283614b53565b91507f3a200000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614588601f83614b42565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6145c481614cdd565b82525050565b60006145d68284613c52565b915081905092915050565b60006145ed8285613c52565b91506145f98284613c52565b91508190509392505050565b6000614611828e613c52565b915061461d828d613c52565b9150614629828c613c52565b9150614635828b613c52565b9150614641828a613c52565b915061464d8289613c52565b91506146598288613c52565b91506146658287613c52565b91506146718286613c52565b915061467d8285613c52565b91506146898284613c52565b91508190509c9b505050505050505050505050565b60006146aa8285613c52565b91506146b58261453b565b91506146c18284613c52565b91508190509392505050565b60006146d882613edb565b91506146e48285613c52565b91506146ef82613fe7565b91506146fb8284613c52565b9150614706826141fd565b91508190509392505050565b600061471d8261442f565b91506147298284613c52565b915081905092915050565b60006020820190506147496000830184613bb3565b92915050565b60006080820190506147646000830187613bb3565b6147716020830186613bb3565b61477e60408301856145bb565b81810360608301526147908184613bd1565b905095945050505050565b60006020820190506147b06000830184613bc2565b92915050565b60006020820190506147cb6000830184613c0a565b92915050565b600060208201905081810360008301526147eb8184613c19565b905092915050565b6000602082019050818103600083015261480c81613c83565b9050919050565b6000602082019050818103600083015261482c81613ce9565b9050919050565b6000602082019050818103600083015261484c81613d4f565b9050919050565b6000602082019050818103600083015261486c81613d8f565b9050919050565b6000602082019050818103600083015261488c81613df5565b9050919050565b600060208201905081810360008301526148ac81613e35565b9050919050565b600060208201905081810360008301526148cc81613e9b565b9050919050565b600060208201905081810360008301526148ec81613f1b565b9050919050565b6000602082019050818103600083015261490c81613f81565b9050919050565b6000602082019050818103600083015261492c81614131565b9050919050565b6000602082019050818103600083015261494c81614197565b9050919050565b6000602082019050818103600083015261496c8161423d565b9050919050565b6000602082019050818103600083015261498c8161427d565b9050919050565b600060208201905081810360008301526149ac816142e3565b9050919050565b600060208201905081810360008301526149cc81614323565b9050919050565b600060208201905081810360008301526149ec81614363565b9050919050565b60006020820190508181036000830152614a0c816143c9565b9050919050565b60006020820190508181036000830152614a2c8161446f565b9050919050565b60006020820190508181036000830152614a4c816144d5565b9050919050565b60006020820190508181036000830152614a6c8161457b565b9050919050565b6000602082019050614a8860008301846145bb565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ab557614ab4614e86565b5b8060405250919050565b600067ffffffffffffffff821115614ada57614ad9614e86565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b0657614b05614e86565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b6982614cdd565b9150614b7483614cdd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ba957614ba8614df9565b5b828201905092915050565b6000614bbf82614cdd565b9150614bca83614cdd565b925082614bda57614bd9614e28565b5b828204905092915050565b6000614bf082614cdd565b9150614bfb83614cdd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c3457614c33614df9565b5b828202905092915050565b6000614c4a82614cdd565b9150614c5583614cdd565b925082821015614c6857614c67614df9565b5b828203905092915050565b6000614c7e82614cbd565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614cf282614cf9565b9050919050565b6000614d0482614cbd565b9050919050565b82818337600083830152505050565b60005b83811015614d38578082015181840152602081019050614d1d565b83811115614d47576000848401525b50505050565b60006002820490506001821680614d6557607f821691505b60208210811415614d7957614d78614e57565b5b50919050565b6000614d8a82614cdd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614dbd57614dbc614df9565b5b600182019050919050565b6000614dd382614cdd565b9150614dde83614cdd565b925082614dee57614ded614e28565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ecf81614c73565b8114614eda57600080fd5b50565b614ee681614c85565b8114614ef157600080fd5b50565b614efd81614c91565b8114614f0857600080fd5b50565b614f1481614cdd565b8114614f1f57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330316666303122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212207a96f2e5fa6a8bd4e019a3811247c248a4afedfcb54c806e3c39956e8d27a56f64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063b40c25d2116100a2578063e985e9c511610071578063e985e9c514610579578063ec41968c146105a9578063f2fde38b146105d9578063ff5fe0c8146105f5576101da565b8063b40c25d2146104e1578063b88d4fde146104fd578063bf9d879d14610519578063c87b56dd14610549576101da565b806395d89b41116100de57806395d89b411461046f5780639a0e4ebb1461048d578063a0712d68146104a9578063a22cb465146104c5576101da565b806370a0823114610417578063715018a6146104475780638da5cb5b14610451576101da565b80632f745c591161017c57806352dbc0431161014b57806352dbc0431461036b5780636352211e1461039b578063635364ed146103cb57806363812e9a146103fb576101da565b80632f745c59146102d157806335b48afd1461030157806342842e0e1461031f5780634f6ccce71461033b576101da565b8063095ea7b3116101b8578063095ea7b31461025d5780630e4393261461027957806318160ddd1461029757806323b872dd146102b5576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190613b38565b610625565b604051610206919061479b565b60405180910390f35b61021761069f565b60405161022491906147d1565b60405180910390f35b61024760048036038101906102429190613b8a565b610731565b6040516102549190614734565b60405180910390f35b61027760048036038101906102729190613abb565b6107b6565b005b6102816108ce565b60405161028e9190614734565b60405180910390f35b61029f6108f4565b6040516102ac9190614a73565b60405180910390f35b6102cf60048036038101906102ca91906139b5565b610901565b005b6102eb60048036038101906102e69190613abb565b610961565b6040516102f89190614a73565b60405180910390f35b610309610a06565b60405161031691906147b6565b60405180910390f35b610339600480360381019061033491906139b5565b610a2c565b005b61035560048036038101906103509190613b8a565b610a4c565b6040516103629190614a73565b60405180910390f35b61038560048036038101906103809190613b8a565b610ae3565b60405161039291906147d1565b60405180910390f35b6103b560048036038101906103b09190613b8a565b610bfd565b6040516103c29190614734565b60405180910390f35b6103e560048036038101906103e09190613b8a565b610caf565b6040516103f291906147d1565b60405180910390f35b61041560048036038101906104109190613af7565b610dc9565b005b610431600480360381019061042c9190613927565b610feb565b60405161043e9190614a73565b60405180910390f35b61044f6110a3565b005b61045961112b565b6040516104669190614734565b60405180910390f35b610477611155565b60405161048491906147d1565b60405180910390f35b6104a760048036038101906104a29190613af7565b6111e7565b005b6104c360048036038101906104be9190613b8a565b61137b565b005b6104df60048036038101906104da9190613a7f565b611437565b005b6104fb60048036038101906104f69190613b8a565b6115b8565b005b61051760048036038101906105129190613a04565b61178b565b005b610533600480360381019061052e9190613b8a565b6117ed565b60405161054091906147d1565b60405180910390f35b610563600480360381019061055e9190613b8a565b611907565b60405161057091906147d1565b60405180910390f35b610593600480360381019061058e9190613979565b612015565b6040516105a0919061479b565b60405180910390f35b6105c360048036038101906105be9190613b8a565b6120a9565b6040516105d091906147d1565b60405180910390f35b6105f360048036038101906105ee9190613927565b6121c3565b005b61060f600480360381019061060a9190613b8a565b6122bb565b60405161061c91906147d1565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106985750610697826123d5565b5b9050919050565b6060600080546106ae90614d4d565b80601f01602080910402602001604051908101604052809291908181526020018280546106da90614d4d565b80156107275780601f106106fc57610100808354040283529160200191610727565b820191906000526020600020905b81548152906001019060200180831161070a57829003601f168201915b5050505050905090565b600061073c826124b7565b61077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077290614973565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c182610bfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610832576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610829906149f3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610851612523565b73ffffffffffffffffffffffffffffffffffffffff161480610880575061087f8161087a612523565b612015565b5b6108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b6906148f3565b60405180910390fd5b6108c9838361252b565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b61091261090c612523565b826125e4565b610951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094890614a13565b60405180910390fd5b61095c8383836126c2565b505050565b600061096c83610feb565b82106109ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a4906147f3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a478383836040518060200160405280600081525061178b565b505050565b6000610a566108f4565b8210610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90614a33565b60405180910390fd5b60088281548110610ad1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6060610bf6826040518060400160405280600481526020017f5479706500000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610bed578382906000526020600020018054610b6090614d4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8c90614d4d565b8015610bd95780601f10610bae57610100808354040283529160200191610bd9565b820191906000526020600020905b815481529060010190602001808311610bbc57829003601f168201915b505050505081526020019060010190610b41565b5050505061291e565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90614933565b60405180910390fd5b80915050919050565b6060610dc2826040518060400160405280600981526020017f43757272656e746c7900000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610db9578382906000526020600020018054610d2c90614d4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5890614d4d565b8015610da55780601f10610d7a57610100808354040283529160200191610da5565b820191906000526020600020905b815481529060010190602001808311610d8857829003601f168201915b505050505081526020019060010190610d0d565b5050505061291e565b9050919050565b6002600a541415610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0690614a53565b60405180910390fd5b6002600a8190555060005b8151811015610fdf573373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610eb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610ed59190614a73565b60206040518083038186803b158015610eed57600080fd5b505afa158015610f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f259190613950565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290614833565b60405180910390fd5b610fcc610f86612523565b838381518110610fbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516129d7565b8080610fd790614d7f565b915050610e1a565b506001600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105390614913565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110ab612523565b73ffffffffffffffffffffffffffffffffffffffff166110c961112b565b73ffffffffffffffffffffffffffffffffffffffff161461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690614993565b60405180910390fd5b61112960006129f5565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116490614d4d565b80601f016020809104026020016040519081016040528092919081815260200182805461119090614d4d565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b5050505050905090565b6002600a54141561122d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122490614a53565b60405180910390fd5b6002600a8190555060005b815181101561136f57611f4882828151811061127d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511180156112d35750614e208282815181106112c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151105b611312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611309906149b3565b60405180910390fd5b61135c3383838151811061134f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516129d7565b808061136790614d7f565b915050611238565b506001600a8190555050565b6002600a5414156113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890614a53565b60405180910390fd5b6002600a81905550611f48811180156113dc5750614e208111155b61141b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611412906149b3565b60405180910390fd5b61142c611426612523565b826129d7565b6001600a8190555050565b61143f612523565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a4906148b3565b60405180910390fd5b80600560006114ba612523565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611567612523565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115ac919061479b565b60405180910390a35050565b6002600a5414156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614a53565b60405180910390fd5b6002600a819055506000811180156116185750611f488111155b611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e906149b3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016116c99190614a73565b60206040518083038186803b1580156116e157600080fd5b505afa1580156116f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117199190613950565b73ffffffffffffffffffffffffffffffffffffffff161461176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614833565b60405180910390fd5b61178061177a612523565b826129d7565b6001600a8190555050565b61179c611796612523565b836125e4565b6117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614a13565b60405180910390fd5b6117e784848484612abb565b50505050565b6060611900826040518060400160405280600a81526020017f5669626520636865636b000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b828210156118f757838290600052602060002001805461186a90614d4d565b80601f016020809104026020016040519081016040528092919081815260200182805461189690614d4d565b80156118e35780601f106118b8576101008083540402835291602001916118e3565b820191906000526020600020905b8154815290600101906020018083116118c657829003601f168201915b50505050508152602001906001019061184b565b5050505061291e565b9050919050565b6060611911613783565b60405180610120016040528060ff8152602001614f9c60ff9139816000600b8110611965577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611976836122bb565b816001600b81106119b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602881526020016150db60289139816002600b8110611a0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611a1c83610ae3565b816003600b8110611a56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614f2360289139816004600b8110611ab1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611ac283610caf565b816005600b8110611afc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614f4b60289139816006600b8110611b57577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611b68836117ed565b816007600b8110611ba2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614f7360299139816008600b8110611bfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611c0e836120a9565b816009600b8110611c48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600a600b8110611cc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600b8110611d04577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600b8110611d43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151836002600b8110611d82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003600b8110611dc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600b8110611e00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600b8110611e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151876006600b8110611e7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151886007600b8110611ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008600b8110611efc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518a6009600b8110611f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518b600a600b8110611f7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611f999b9a99989796959493929190614605565b60405160208183030381529060405290506000611fe6611fb886612b17565b611fc184612cc4565b604051602001611fd29291906146cd565b604051602081830303815290604052612cc4565b905080604051602001611ff99190614712565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606121bc826040518060400160405280600481526020017f676d693f000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b828210156121b357838290600052602060002001805461212690614d4d565b80601f016020809104026020016040519081016040528092919081815260200182805461215290614d4d565b801561219f5780601f106121745761010080835404028352916020019161219f565b820191906000526020600020905b81548152906001019060200180831161218257829003601f168201915b505050505081526020019060010190612107565b5050505061291e565b9050919050565b6121cb612523565b73ffffffffffffffffffffffffffffffffffffffff166121e961112b565b73ffffffffffffffffffffffffffffffffffffffff161461223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690614993565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a690614853565b60405180910390fd5b6122b8816129f5565b50565b60606123ce826040518060400160405280600681526020017f4920616d20610000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156123c557838290600052602060002001805461233890614d4d565b80601f016020809104026020016040519081016040528092919081815260200182805461236490614d4d565b80156123b15780601f10612386576101008083540402835291602001916123b1565b820191906000526020600020905b81548152906001019060200180831161239457829003601f168201915b505050505081526020019060010190612319565b5050505061291e565b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124b057506124af82612e82565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661259e83610bfd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125ef826124b7565b61262e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612625906148d3565b60405180910390fd5b600061263983610bfd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126a857508373ffffffffffffffffffffffffffffffffffffffff1661269084610731565b73ffffffffffffffffffffffffffffffffffffffff16145b806126b957506126b88185612015565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126e282610bfd565b73ffffffffffffffffffffffffffffffffffffffff1614612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f906149d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279f90614893565b60405180910390fd5b6127b3838383612eec565b6127be60008261252b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280e9190614c3f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128659190614b5e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060006129548461292f87612b17565b6040516020016129409291906145e1565b604051602081830303815290604052613000565b90506000838451836129669190614dc8565b8151811061299d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905084816040516020016129ba92919061469e565b604051602081830303815290604052905080925050509392505050565b6129f1828260405180602001604052806000815250613033565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ac68484846126c2565b612ad28484848461308e565b612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890614813565b60405180910390fd5b50505050565b60606000821415612b5f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cbf565b600082905060005b60008214612b91578080612b7a90614d7f565b915050600a82612b8a9190614bb4565b9150612b67565b60008167ffffffffffffffff811115612bd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c055781602001600182028036833780820191505090505b5090505b60008514612cb857600182612c1e9190614c3f565b9150600a85612c2d9190614dc8565b6030612c399190614b5e565b60f81b818381518110612c75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cb19190614bb4565b9450612c09565b8093505050505b919050565b60606000825190506000811415612ced5760405180602001604052806000815250915050612e7d565b60006003600283612cfe9190614b5e565b612d089190614bb4565b6004612d149190614be5565b90506000602082612d259190614b5e565b67ffffffffffffffff811115612d64577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612d965781602001600182028036833780820191505090505b509050600060405180606001604052806040815260200161509b604091399050600181016020830160005b86811015612e3a5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612dc1565b506003860660018114612e545760028114612e6457612e6f565b613d3d60f01b6002830352612e6f565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ef7838383613225565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f3a57612f358161322a565b612f79565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f7857612f778382613273565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fbc57612fb7816133e0565b612ffb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ffa57612ff98282613523565b5b5b505050565b60008160405160200161301391906145ca565b6040516020818303038152906040528051906020012060001c9050919050565b61303d83836135a2565b61304a600084848461308e565b613089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308090614813565b60405180910390fd5b505050565b60006130af8473ffffffffffffffffffffffffffffffffffffffff16613770565b15613218578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130d8612523565b8786866040518563ffffffff1660e01b81526004016130fa949392919061474f565b602060405180830381600087803b15801561311457600080fd5b505af192505050801561314557506040513d601f19601f820116820180604052508101906131429190613b61565b60015b6131c8573d8060008114613175576040519150601f19603f3d011682016040523d82523d6000602084013e61317a565b606091505b506000815114156131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b790614813565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061321d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161328084610feb565b61328a9190614c3f565b905060006007600084815260200190815260200160002054905081811461336f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133f49190614c3f565b905060006009600084815260200190815260200160002054905060006008838154811061344a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613492577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613507577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061352e83610feb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360990614953565b60405180910390fd5b61361b816124b7565b1561365b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365290614873565b60405180910390fd5b61366760008383612eec565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136b79190614b5e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101600160405280600b905b60608152602001906001900390816137935790505090565b60006137be6137b984614abf565b614a8e565b905080838252602082019050828560208602820111156137dd57600080fd5b60005b8581101561380d57816137f38882613912565b8452602084019350602083019250506001810190506137e0565b5050509392505050565b600061382a61382584614aeb565b614a8e565b90508281526020810184848401111561384257600080fd5b61384d848285614d0b565b509392505050565b60008135905061386481614ec6565b92915050565b60008151905061387981614ec6565b92915050565b600082601f83011261389057600080fd5b81356138a08482602086016137ab565b91505092915050565b6000813590506138b881614edd565b92915050565b6000813590506138cd81614ef4565b92915050565b6000815190506138e281614ef4565b92915050565b600082601f8301126138f957600080fd5b8135613909848260208601613817565b91505092915050565b60008135905061392181614f0b565b92915050565b60006020828403121561393957600080fd5b600061394784828501613855565b91505092915050565b60006020828403121561396257600080fd5b60006139708482850161386a565b91505092915050565b6000806040838503121561398c57600080fd5b600061399a85828601613855565b92505060206139ab85828601613855565b9150509250929050565b6000806000606084860312156139ca57600080fd5b60006139d886828701613855565b93505060206139e986828701613855565b92505060406139fa86828701613912565b9150509250925092565b60008060008060808587031215613a1a57600080fd5b6000613a2887828801613855565b9450506020613a3987828801613855565b9350506040613a4a87828801613912565b925050606085013567ffffffffffffffff811115613a6757600080fd5b613a73878288016138e8565b91505092959194509250565b60008060408385031215613a9257600080fd5b6000613aa085828601613855565b9250506020613ab1858286016138a9565b9150509250929050565b60008060408385031215613ace57600080fd5b6000613adc85828601613855565b9250506020613aed85828601613912565b9150509250929050565b600060208284031215613b0957600080fd5b600082013567ffffffffffffffff811115613b2357600080fd5b613b2f8482850161387f565b91505092915050565b600060208284031215613b4a57600080fd5b6000613b58848285016138be565b91505092915050565b600060208284031215613b7357600080fd5b6000613b81848285016138d3565b91505092915050565b600060208284031215613b9c57600080fd5b6000613baa84828501613912565b91505092915050565b613bbc81614c73565b82525050565b613bcb81614c85565b82525050565b6000613bdc82614b1b565b613be68185614b31565b9350613bf6818560208601614d1a565b613bff81614eb5565b840191505092915050565b613c1381614ce7565b82525050565b6000613c2482614b26565b613c2e8185614b42565b9350613c3e818560208601614d1a565b613c4781614eb5565b840191505092915050565b6000613c5d82614b26565b613c678185614b53565b9350613c77818560208601614d1a565b80840191505092915050565b6000613c90602b83614b42565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613cf6603283614b42565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d5c601b83614b42565b91507f4e6f7420746865206f776e6572206f66207468697320426c6f6f7400000000006000830152602082019050919050565b6000613d9c602683614b42565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e02601c83614b42565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e42602483614b42565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ea8601983614b42565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613ee8601b83614b53565b91507f7b226e616d65223a2022426c6f6f7420436861726163746572202300000000006000830152601b82019050919050565b6000613f28602c83614b42565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f8e603883614b42565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613ff460eb83614b53565b91507f222c20226465736372697074696f6e223a2022426c6f6f74204368617261637460008301527f657273206172652072616e646f6d697a656420525047207374796c652063686160208301527f726163746572732067656e65726174656420616e642073746f726564206f6e2060408301527f636861696e2e204665656c206672656520746f2075736520426c6f6f7420436860608301527f617261637465727320696e20616e792077617920796f752077616e742e20496e60808301527f73706972656420627920616e6420636f6d70617469626c65207769746820426c60a08301527f6f6f742e222c2022696d616765223a2022646174613a696d6167652f7376672b60c08301527f786d6c3b6261736536342c00000000000000000000000000000000000000000060e083015260eb82019050919050565b600061413e602a83614b42565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141a4602983614b42565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061420a600283614b53565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061424a602083614b42565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061428a602c83614b42565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142f0602083614b42565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614330601083614b42565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b6000614370602983614b42565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006143d6602183614b42565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061443c601d83614b53565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b600061447c603183614b42565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006144e2602c83614b42565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614548600283614b53565b91507f3a200000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614588601f83614b42565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6145c481614cdd565b82525050565b60006145d68284613c52565b915081905092915050565b60006145ed8285613c52565b91506145f98284613c52565b91508190509392505050565b6000614611828e613c52565b915061461d828d613c52565b9150614629828c613c52565b9150614635828b613c52565b9150614641828a613c52565b915061464d8289613c52565b91506146598288613c52565b91506146658287613c52565b91506146718286613c52565b915061467d8285613c52565b91506146898284613c52565b91508190509c9b505050505050505050505050565b60006146aa8285613c52565b91506146b58261453b565b91506146c18284613c52565b91508190509392505050565b60006146d882613edb565b91506146e48285613c52565b91506146ef82613fe7565b91506146fb8284613c52565b9150614706826141fd565b91508190509392505050565b600061471d8261442f565b91506147298284613c52565b915081905092915050565b60006020820190506147496000830184613bb3565b92915050565b60006080820190506147646000830187613bb3565b6147716020830186613bb3565b61477e60408301856145bb565b81810360608301526147908184613bd1565b905095945050505050565b60006020820190506147b06000830184613bc2565b92915050565b60006020820190506147cb6000830184613c0a565b92915050565b600060208201905081810360008301526147eb8184613c19565b905092915050565b6000602082019050818103600083015261480c81613c83565b9050919050565b6000602082019050818103600083015261482c81613ce9565b9050919050565b6000602082019050818103600083015261484c81613d4f565b9050919050565b6000602082019050818103600083015261486c81613d8f565b9050919050565b6000602082019050818103600083015261488c81613df5565b9050919050565b600060208201905081810360008301526148ac81613e35565b9050919050565b600060208201905081810360008301526148cc81613e9b565b9050919050565b600060208201905081810360008301526148ec81613f1b565b9050919050565b6000602082019050818103600083015261490c81613f81565b9050919050565b6000602082019050818103600083015261492c81614131565b9050919050565b6000602082019050818103600083015261494c81614197565b9050919050565b6000602082019050818103600083015261496c8161423d565b9050919050565b6000602082019050818103600083015261498c8161427d565b9050919050565b600060208201905081810360008301526149ac816142e3565b9050919050565b600060208201905081810360008301526149cc81614323565b9050919050565b600060208201905081810360008301526149ec81614363565b9050919050565b60006020820190508181036000830152614a0c816143c9565b9050919050565b60006020820190508181036000830152614a2c8161446f565b9050919050565b60006020820190508181036000830152614a4c816144d5565b9050919050565b60006020820190508181036000830152614a6c8161457b565b9050919050565b6000602082019050614a8860008301846145bb565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ab557614ab4614e86565b5b8060405250919050565b600067ffffffffffffffff821115614ada57614ad9614e86565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b0657614b05614e86565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b6982614cdd565b9150614b7483614cdd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ba957614ba8614df9565b5b828201905092915050565b6000614bbf82614cdd565b9150614bca83614cdd565b925082614bda57614bd9614e28565b5b828204905092915050565b6000614bf082614cdd565b9150614bfb83614cdd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c3457614c33614df9565b5b828202905092915050565b6000614c4a82614cdd565b9150614c5583614cdd565b925082821015614c6857614c67614df9565b5b828203905092915050565b6000614c7e82614cbd565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614cf282614cf9565b9050919050565b6000614d0482614cbd565b9050919050565b82818337600083830152505050565b60005b83811015614d38578082015181840152602081019050614d1d565b83811115614d47576000848401525b50505050565b60006002820490506001821680614d6557607f821691505b60208210811415614d7957614d78614e57565b5b50919050565b6000614d8a82614cdd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614dbd57614dbc614df9565b5b600182019050919050565b6000614dd382614cdd565b9150614dde83614cdd565b925082614dee57614ded614e28565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ecf81614c73565b8114614eda57600080fd5b50565b614ee681614c85565b8114614ef157600080fd5b50565b614efd81614c91565b8114614f0857600080fd5b50565b614f1481614cdd565b8114614f1f57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330316666303122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212207a96f2e5fa6a8bd4e019a3811247c248a4afedfcb54c806e3c39956e8d27a56f64736f6c63430008000033

Deployed Bytecode Sourcemap

44571:6826:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38313:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25427:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26986:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26509:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44669:71;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38953:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27876:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38621:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44747:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28286:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39143:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46935:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25121:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47079:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50288:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24851:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9889:94;;;:::i;:::-;;9238:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25596:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49726:276;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49542:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27279:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50010:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28542:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47226:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47911:1623;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27645:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47382:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10138:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46803:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38313:224;38415:4;38454:35;38439:50;;;:11;:50;;;;:90;;;;38493:36;38517:11;38493:23;:36::i;:::-;38439:90;38432:97;;38313:224;;;:::o;25427:100::-;25481:13;25514:5;25507:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25427:100;:::o;26986:221::-;27062:7;27090:16;27098:7;27090;:16::i;:::-;27082:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27175:15;:24;27191:7;27175:24;;;;;;;;;;;;;;;;;;;;;27168:31;;26986:221;;;:::o;26509:411::-;26590:13;26606:23;26621:7;26606:14;:23::i;:::-;26590:39;;26654:5;26648:11;;:2;:11;;;;26640:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26748:5;26732:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26757:37;26774:5;26781:12;:10;:12::i;:::-;26757:16;:37::i;:::-;26732:62;26710:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26891:21;26900:2;26904:7;26891:8;:21::i;:::-;26509:411;;;:::o;44669:71::-;;;;;;;;;;;;;:::o;38953:113::-;39014:7;39041:10;:17;;;;39034:24;;38953:113;:::o;27876:339::-;28071:41;28090:12;:10;:12::i;:::-;28104:7;28071:18;:41::i;:::-;28063:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28179:28;28189:4;28195:2;28199:7;28179:9;:28::i;:::-;27876:339;;;:::o;38621:256::-;38718:7;38754:23;38771:5;38754:16;:23::i;:::-;38746:5;:31;38738:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38843:12;:19;38856:5;38843:19;;;;;;;;;;;;;;;:26;38863:5;38843:26;;;;;;;;;;;;38836:33;;38621:256;;;;:::o;44747:62::-;;;;;;;;;;;;;:::o;28286:185::-;28424:39;28441:4;28447:2;28451:7;28424:39;;;;;;;;;;;;:16;:39::i;:::-;28286:185;;;:::o;39143:233::-;39218:7;39254:30;:28;:30::i;:::-;39246:5;:38;39238:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39351:10;39362:5;39351:17;;;;;;;;;;;;;;;;;;;;;;;;39344:24;;39143:233;;;:::o;46935:132::-;46994:13;47027:32;47033:7;47027:32;;;;;;;;;;;;;;;;;47050:8;47027:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;:::-;47020:39;;46935:132;;;:::o;25121:239::-;25193:7;25213:13;25229:7;:16;25237:7;25229:16;;;;;;;;;;;;;;;;;;;;;25213:32;;25281:1;25264:19;;:5;:19;;;;25256:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25347:5;25340:12;;;25121:239;;;:::o;47079:139::-;47139:13;47172:38;47178:7;47172:38;;;;;;;;;;;;;;;;;47200:9;47172:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:38::i;:::-;47165:45;;47079:139;;;:::o;50288:300::-;12169:1;12765:7;;:19;;12757:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12169:1;12898:7;:18;;;;50378:9:::1;50373:208;50397:7;:14;50393:1;:18;50373:208;;;50477:10;50441:46;;:12;;;;;;;;;;;:20;;;50462:7;50470:1;50462:10;;;;;;;;;;;;;;;;;;;;;;50441:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;50433:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;50534:35;50544:12;:10;:12::i;:::-;50558:7;50566:1;50558:10;;;;;;;;;;;;;;;;;;;;;;50534:9;:35::i;:::-;50413:3;;;;;:::i;:::-;;;;50373:208;;;;12125:1:::0;13077:7;:22;;;;50288:300;:::o;24851:208::-;24923:7;24968:1;24951:19;;:5;:19;;;;24943:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25035:9;:16;25045:5;25035:16;;;;;;;;;;;;;;;;25028:23;;24851:208;;;:::o;9889:94::-;9469:12;:10;:12::i;:::-;9458:23;;:7;:5;:7::i;:::-;:23;;;9450:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9954:21:::1;9972:1;9954:9;:21::i;:::-;9889:94::o:0;9238:87::-;9284:7;9311:6;;;;;;;;;;;9304:13;;9238:87;:::o;25596:104::-;25652:13;25685:7;25678:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25596:104;:::o;49726:276::-;12169:1;12765:7;;:19;;12757:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12169:1;12898:7;:18;;;;49808:9:::1;49803:192;49827:8;:15;49823:1;:19;49803:192;;;49886:4;49872:8;49881:1;49872:11;;;;;;;;;;;;;;;;;;;;;;:18;:41;;;;;49908:5;49894:8;49903:1;49894:11;;;;;;;;;;;;;;;;;;;;;;:19;49872:41;49864:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49949:34;49959:10;49971:8;49980:1;49971:11;;;;;;;;;;;;;;;;;;;;;;49949:9;:34::i;:::-;49844:3;;;;;:::i;:::-;;;;49803:192;;;;12125:1:::0;13077:7;:22;;;;49726:276;:::o;49542:176::-;12169:1;12765:7;;:19;;12757:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12169:1;12898:7;:18;;;;49622:4:::1;49612:7;:14;:34;;;;;49641:5;49630:7;:16;;49612:34;49604:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49678:32;49688:12;:10;:12::i;:::-;49702:7;49678:9;:32::i;:::-;12125:1:::0;13077:7;:22;;;;49542:176;:::o;27279:295::-;27394:12;:10;:12::i;:::-;27382:24;;:8;:24;;;;27374:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27494:8;27449:18;:32;27468:12;:10;:12::i;:::-;27449:32;;;;;;;;;;;;;;;:42;27482:8;27449:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27547:8;27518:48;;27533:12;:10;:12::i;:::-;27518:48;;;27557:8;27518:48;;;;;;:::i;:::-;;;;;;;;27279:295;;:::o;50010:270::-;12169:1;12765:7;;:19;;12757:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12169:1;12898:7;:18;;;;50097:1:::1;50088:6;:10;:28;;;;;50112:4;50102:6;:14;;50088:28;50080:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50188:10;50156:42;;:12;;;;;;;;;;;:20;;;50177:6;50156:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;50148:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50241:31;50251:12;:10;:12::i;:::-;50265:6;50241:9;:31::i;:::-;12125:1:::0;13077:7;:22;;;;50010:270;:::o;28542:328::-;28717:41;28736:12;:10;:12::i;:::-;28750:7;28717:18;:41::i;:::-;28709:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28823:39;28837:4;28843:2;28847:7;28856:5;28823:13;:39::i;:::-;28542:328;;;;:::o;47226:140::-;47286:13;47319:39;47325:7;47319:39;;;;;;;;;;;;;;;;;47348:9;47319:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:39::i;:::-;47312:46;;47226:140;;;:::o;47911:1623::-;47976:13;48002:23;;:::i;:::-;48036:268;;;;;;;;;;;;;;;;;:5;48042:1;48036:8;;;;;;;;;;;;;;;;;;:268;;;;48328:15;48335:7;48328:6;:15::i;:::-;48317:5;48323:1;48317:8;;;;;;;;;;;;;;;;;;:26;;;;48356:53;;;;;;;;;;;;;;;;;:5;48362:1;48356:8;;;;;;;;;;;;;;;;;;:53;;;;48433:20;48445:7;48433:11;:20::i;:::-;48422:5;48428:1;48422:8;;;;;;;;;;;;;;;;;;:31;;;;48466:53;;;;;;;;;;;;;;;;;:5;48472:1;48466:8;;;;;;;;;;;;;;;;;;:53;;;;48543:21;48556:7;48543:12;:21::i;:::-;48532:5;48538:1;48532:8;;;;;;;;;;;;;;;;;;:32;;;;48577:53;;;;;;;;;;;;;;;;;:5;48583:1;48577:8;;;;;;;;;;;;;;;;;;:53;;;;48654:21;48667:7;48654:12;:21::i;:::-;48643:5;48649:1;48643:8;;;;;;;;;;;;;;;;;;:32;;;;48688:54;;;;;;;;;;;;;;;;;:5;48694:1;48688:8;;;;;;;;;;;;;;;;;;:54;;;;48766:15;48773:7;48766:6;:15::i;:::-;48755:5;48761:1;48755:8;;;;;;;;;;;;;;;;;;:26;;;;48794:27;;;;;;;;;;;;;;;;;:5;48800:2;48794:9;;;;;;;;;;;;;;;;;;:27;;;;48846:20;48893:5;48899:1;48893:8;;;;;;;;;;;;;;;;;;;48903:5;48909:1;48903:8;;;;;;;;;;;;;;;;;;;48913:5;48919:1;48913:8;;;;;;;;;;;;;;;;;;;48923:5;48929:1;48923:8;;;;;;;;;;;;;;;;;;;48933:5;48939:1;48933:8;;;;;;;;;;;;;;;;;;;48943:5;48949:1;48943:8;;;;;;;;;;;;;;;;;;;48953:5;48959:1;48953:8;;;;;;;;;;;;;;;;;;;48963:5;48969:1;48963:8;;;;;;;;;;;;;;;;;;;48973:5;48979:1;48973:8;;;;;;;;;;;;;;;;;;;48983:5;48989:1;48983:8;;;;;;;;;;;;;;;;;;;48993:5;48999:2;48993:9;;;;;;;;;;;;;;;;;;;48876:127;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48846:158;;49025:18;49046:371;49121:17;49130:7;49121:8;:17::i;:::-;49379:28;49399:6;49379:13;:28::i;:::-;49073:341;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49046:13;:371::i;:::-;49025:392;;49494:4;49444:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;49428:72;;49520:6;49513:13;;;;;47911:1623;;;:::o;27645:164::-;27742:4;27766:18;:25;27785:5;27766:25;;;;;;;;;;;;;;;:35;27792:8;27766:35;;;;;;;;;;;;;;;;;;;;;;;;;27759:42;;27645:164;;;;:::o;47382:122::-;47436:13;47469:27;47475:7;47469:27;;;;;;;;;;;;;;;;;47492:3;47469:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:27::i;:::-;47462:34;;47382:122;;;:::o;10138:192::-;9469:12;:10;:12::i;:::-;9458:23;;:7;:5;:7::i;:::-;:23;;;9450:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10247:1:::1;10227:22;;:8;:22;;;;10219:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10303:19;10313:8;10303:9;:19::i;:::-;10138:192:::0;:::o;46803:124::-;46857:13;46890:29;46896:7;46890:29;;;;;;;;;;;;;;;;;46915:3;46890:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:29::i;:::-;46883:36;;46803:124;;;:::o;24482:305::-;24584:4;24636:25;24621:40;;;:11;:40;;;;:105;;;;24693:33;24678:48;;;:11;:48;;;;24621:105;:158;;;;24743:36;24767:11;24743:23;:36::i;:::-;24621:158;24601:178;;24482:305;;;:::o;30380:127::-;30445:4;30497:1;30469:30;;:7;:16;30477:7;30469:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30462:37;;30380:127;;;:::o;8114:98::-;8167:7;8194:10;8187:17;;8114:98;:::o;34362:174::-;34464:2;34437:15;:24;34453:7;34437:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34520:7;34516:2;34482:46;;34491:23;34506:7;34491:14;:23::i;:::-;34482:46;;;;;;;;;;;;34362:174;;:::o;30674:348::-;30767:4;30792:16;30800:7;30792;:16::i;:::-;30784:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30868:13;30884:23;30899:7;30884:14;:23::i;:::-;30868:39;;30937:5;30926:16;;:7;:16;;;:51;;;;30970:7;30946:31;;:20;30958:7;30946:11;:20::i;:::-;:31;;;30926:51;:87;;;;30981:32;30998:5;31005:7;30981:16;:32::i;:::-;30926:87;30918:96;;;30674:348;;;;:::o;33666:578::-;33825:4;33798:31;;:23;33813:7;33798:14;:23::i;:::-;:31;;;33790:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33908:1;33894:16;;:2;:16;;;;33886:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33964:39;33985:4;33991:2;33995:7;33964:20;:39::i;:::-;34068:29;34085:1;34089:7;34068:8;:29::i;:::-;34129:1;34110:9;:15;34120:4;34110:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34158:1;34141:9;:13;34151:2;34141:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34189:2;34170:7;:16;34178:7;34170:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34228:7;34224:2;34209:27;;34218:4;34209:27;;;;;;;;;;;;33666:578;;;:::o;47516:387::-;47625:13;47651:12;47666:62;47697:9;47708:17;47717:7;47708:8;:17::i;:::-;47680:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47666:6;:62::i;:::-;47651:77;;47739:20;47762:11;47781;:18;47774:4;:25;;;;:::i;:::-;47762:38;;;;;;;;;;;;;;;;;;;;;;47739:61;;47844:9;47861:6;47827:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47811:58;;47889:6;47882:13;;;;47516:387;;;;;:::o;31364:110::-;31440:26;31450:2;31454:7;31440:26;;;;;;;;;;;;:9;:26::i;:::-;31364:110;;:::o;10338:173::-;10394:16;10413:6;;;;;;;;;;;10394:25;;10439:8;10430:6;;:17;;;;;;;;;;;;;;;;;;10494:8;10463:40;;10484:8;10463:40;;;;;;;;;;;;10338:173;;:::o;29752:315::-;29909:28;29919:4;29925:2;29929:7;29909:9;:28::i;:::-;29956:48;29979:4;29985:2;29989:7;29998:5;29956:22;:48::i;:::-;29948:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29752:315;;;;:::o;50602:715::-;50658:13;50880:1;50871:5;:10;50867:53;;;50898:10;;;;;;;;;;;;;;;;;;;;;50867:53;50930:12;50945:5;50930:20;;50961:14;50986:78;51001:1;50993:4;:9;50986:78;;51019:8;;;;;:::i;:::-;;;;51050:2;51042:10;;;;;:::i;:::-;;;50986:78;;;51074:19;51106:6;51096:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51074:39;;51124:154;51140:1;51131:5;:10;51124:154;;51168:1;51158:11;;;;;:::i;:::-;;;51235:2;51227:5;:10;;;;:::i;:::-;51214:2;:24;;;;:::i;:::-;51201:39;;51184:6;51191;51184:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;51264:2;51255:11;;;;;:::i;:::-;;;51124:154;;;51302:6;51288:21;;;;;50602:715;;;;:::o;51748:1607::-;51806:13;51832:11;51846:4;:11;51832:25;;51879:1;51872:3;:8;51868:23;;;51882:9;;;;;;;;;;;;;;;;;51868:23;51943:18;51981:1;51976;51970:3;:7;;;;:::i;:::-;51969:13;;;;:::i;:::-;51964:1;:19;;;;:::i;:::-;51943:40;;52041:19;52086:2;52073:10;:15;;;;:::i;:::-;52063:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52041:48;;52102:18;52123:5;;;;;;;;;;;;;;;;;52102:26;;52192:1;52185:5;52181:13;52237:2;52229:6;52225:15;52288:1;52256:777;52311:3;52308:1;52305:10;52256:777;;;52366:1;52363;52359:9;52354:14;;52424:8;52419:1;52413:4;52409:12;52403:19;52399:34;52504:4;52496:5;52492:2;52488:14;52484:25;52474:8;52470:40;52464:47;52543:3;52540:1;52536:11;52529:18;;52634:4;52625;52617:5;52613:2;52609:14;52605:25;52595:8;52591:40;52585:47;52581:58;52576:3;52572:68;52565:75;;52672:3;52669:1;52665:11;52658:18;;52762:4;52753;52745:5;52742:1;52738:13;52734:24;52724:8;52720:39;52714:46;52710:57;52705:3;52701:67;52694:74;;52800:3;52797:1;52793:11;52786:18;;52882:4;52873;52866:5;52862:16;52852:8;52848:31;52842:38;52838:49;52833:3;52829:59;52822:66;;52922:3;52917;52913:13;52906:20;;52964:3;52953:9;52946:22;53016:1;53005:9;53001:17;52988:30;;52335:698;;52256:777;;;52260:44;53065:1;53060:3;53056:11;53086:1;53081:84;;;;53184:1;53179:82;;;;53049:212;;53081:84;53142:6;53137:3;53133:16;53129:1;53118:9;53114:17;53107:43;53081:84;;53179:82;53240:4;53235:3;53231:14;53227:1;53216:9;53212:17;53205:41;53049:212;;53292:10;53284:6;53277:26;52150:1164;;53340:6;53326:21;;;;;;51748:1607;;;;:::o;23089:157::-;23174:4;23213:25;23198:40;;;:11;:40;;;;23191:47;;23089:157;;;:::o;39989:589::-;40133:45;40160:4;40166:2;40170:7;40133:26;:45::i;:::-;40211:1;40195:18;;:4;:18;;;40191:187;;;40230:40;40262:7;40230:31;:40::i;:::-;40191:187;;;40300:2;40292:10;;:4;:10;;;40288:90;;40319:47;40352:4;40358:7;40319:32;:47::i;:::-;40288:90;40191:187;40406:1;40392:16;;:2;:16;;;40388:183;;;40425:45;40462:7;40425:36;:45::i;:::-;40388:183;;;40498:4;40492:10;;:2;:10;;;40488:83;;40519:40;40547:2;40551:7;40519:27;:40::i;:::-;40488:83;40388:183;39989:589;;;:::o;46653:138::-;46713:7;46775:5;46758:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;46748:34;;;;;;46740:43;;46733:50;;46653:138;;;:::o;31701:321::-;31831:18;31837:2;31841:7;31831:5;:18::i;:::-;31882:54;31913:1;31917:2;31921:7;31930:5;31882:22;:54::i;:::-;31860:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31701:321;;;:::o;35101:803::-;35256:4;35277:15;:2;:13;;;:15::i;:::-;35273:624;;;35329:2;35313:36;;;35350:12;:10;:12::i;:::-;35364:4;35370:7;35379:5;35313:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35309:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35576:1;35559:6;:13;:18;35555:272;;;35602:60;;;;;;;;;;:::i;:::-;;;;;;;;35555:272;35777:6;35771:13;35762:6;35758:2;35754:15;35747:38;35309:533;35446:45;;;35436:55;;;:6;:55;;;;35429:62;;;;;35273:624;35881:4;35874:11;;35101:803;;;;;;;:::o;36476:126::-;;;;:::o;41301:164::-;41405:10;:17;;;;41378:15;:24;41394:7;41378:24;;;;;;;;;;;:44;;;;41433:10;41449:7;41433:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41301:164;:::o;42092:988::-;42358:22;42408:1;42383:22;42400:4;42383:16;:22::i;:::-;:26;;;;:::i;:::-;42358:51;;42420:18;42441:17;:26;42459:7;42441:26;;;;;;;;;;;;42420:47;;42588:14;42574:10;:28;42570:328;;42619:19;42641:12;:18;42654:4;42641:18;;;;;;;;;;;;;;;:34;42660:14;42641:34;;;;;;;;;;;;42619:56;;42725:11;42692:12;:18;42705:4;42692:18;;;;;;;;;;;;;;;:30;42711:10;42692:30;;;;;;;;;;;:44;;;;42842:10;42809:17;:30;42827:11;42809:30;;;;;;;;;;;:43;;;;42570:328;;42994:17;:26;43012:7;42994:26;;;;;;;;;;;42987:33;;;43038:12;:18;43051:4;43038:18;;;;;;;;;;;;;;;:34;43057:14;43038:34;;;;;;;;;;;43031:41;;;42092:988;;;;:::o;43375:1079::-;43628:22;43673:1;43653:10;:17;;;;:21;;;;:::i;:::-;43628:46;;43685:18;43706:15;:24;43722:7;43706:24;;;;;;;;;;;;43685:45;;44057:19;44079:10;44090:14;44079:26;;;;;;;;;;;;;;;;;;;;;;;;44057:48;;44143:11;44118:10;44129;44118:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44254:10;44223:15;:28;44239:11;44223:28;;;;;;;;;;;:41;;;;44395:15;:24;44411:7;44395:24;;;;;;;;;;;44388:31;;;44430:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43375:1079;;;;:::o;40879:221::-;40964:14;40981:20;40998:2;40981:16;:20::i;:::-;40964:37;;41039:7;41012:12;:16;41025:2;41012:16;;;;;;;;;;;;;;;:24;41029:6;41012:24;;;;;;;;;;;:34;;;;41086:6;41057:17;:26;41075:7;41057:26;;;;;;;;;;;:35;;;;40879:221;;;:::o;32358:382::-;32452:1;32438:16;;:2;:16;;;;32430:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32511:16;32519:7;32511;:16::i;:::-;32510:17;32502:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32573:45;32602:1;32606:2;32610:7;32573:20;:45::i;:::-;32648:1;32631:9;:13;32641:2;32631:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32679:2;32660:7;:16;32668:7;32660:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32724:7;32720:2;32699:33;;32716:1;32699:33;;;;;;;;;;;;32358:382;;:::o;15277:387::-;15337:4;15545:12;15612:7;15600:20;15592:28;;15655:1;15648:4;:8;15641:15;;;15277:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:139::-;;1084:6;1071:20;1062:29;;1100:33;1127:5;1100:33;:::i;:::-;1052:87;;;;:::o;1145:143::-;;1233:6;1227:13;1218:22;;1249:33;1276:5;1249:33;:::i;:::-;1208:80;;;;:::o;1311:303::-;;1431:3;1424:4;1416:6;1412:17;1408:27;1398:2;;1449:1;1446;1439:12;1398:2;1489:6;1476:20;1514:94;1604:3;1596:6;1589:4;1581:6;1577:17;1514:94;:::i;:::-;1505:103;;1388:226;;;;;:::o;1620:133::-;;1701:6;1688:20;1679:29;;1717:30;1741:5;1717:30;:::i;:::-;1669:84;;;;:::o;1759:137::-;;1842:6;1829:20;1820:29;;1858:32;1884:5;1858:32;:::i;:::-;1810:86;;;;:::o;1902:141::-;;1989:6;1983:13;1974:22;;2005:32;2031:5;2005:32;:::i;:::-;1964:79;;;;:::o;2062:271::-;;2166:3;2159:4;2151:6;2147:17;2143:27;2133:2;;2184:1;2181;2174:12;2133:2;2224:6;2211:20;2249:78;2323:3;2315:6;2308:4;2300:6;2296:17;2249:78;:::i;:::-;2240:87;;2123:210;;;;;:::o;2339:139::-;;2423:6;2410:20;2401:29;;2439:33;2466:5;2439:33;:::i;:::-;2391:87;;;;:::o;2484:262::-;;2592:2;2580:9;2571:7;2567:23;2563:32;2560:2;;;2608:1;2605;2598:12;2560:2;2651:1;2676:53;2721:7;2712:6;2701:9;2697:22;2676:53;:::i;:::-;2666:63;;2622:117;2550:196;;;;:::o;2752:284::-;;2871:2;2859:9;2850:7;2846:23;2842:32;2839:2;;;2887:1;2884;2877:12;2839:2;2930:1;2955:64;3011:7;3002:6;2991:9;2987:22;2955:64;:::i;:::-;2945:74;;2901:128;2829:207;;;;:::o;3042:407::-;;;3167:2;3155:9;3146:7;3142:23;3138:32;3135:2;;;3183:1;3180;3173:12;3135:2;3226:1;3251:53;3296:7;3287:6;3276:9;3272:22;3251:53;:::i;:::-;3241:63;;3197:117;3353:2;3379:53;3424:7;3415:6;3404:9;3400:22;3379:53;:::i;:::-;3369:63;;3324:118;3125:324;;;;;:::o;3455:552::-;;;;3597:2;3585:9;3576:7;3572:23;3568:32;3565:2;;;3613:1;3610;3603:12;3565:2;3656:1;3681:53;3726:7;3717:6;3706:9;3702:22;3681:53;:::i;:::-;3671:63;;3627:117;3783:2;3809:53;3854:7;3845:6;3834:9;3830:22;3809:53;:::i;:::-;3799:63;;3754:118;3911:2;3937:53;3982:7;3973:6;3962:9;3958:22;3937:53;:::i;:::-;3927:63;;3882:118;3555:452;;;;;:::o;4013:809::-;;;;;4181:3;4169:9;4160:7;4156:23;4152:33;4149:2;;;4198:1;4195;4188:12;4149:2;4241:1;4266:53;4311:7;4302:6;4291:9;4287:22;4266:53;:::i;:::-;4256:63;;4212:117;4368:2;4394:53;4439:7;4430:6;4419:9;4415:22;4394:53;:::i;:::-;4384:63;;4339:118;4496:2;4522:53;4567:7;4558:6;4547:9;4543:22;4522:53;:::i;:::-;4512:63;;4467:118;4652:2;4641:9;4637:18;4624:32;4683:18;4675:6;4672:30;4669:2;;;4715:1;4712;4705:12;4669:2;4743:62;4797:7;4788:6;4777:9;4773:22;4743:62;:::i;:::-;4733:72;;4595:220;4139:683;;;;;;;:::o;4828:401::-;;;4950:2;4938:9;4929:7;4925:23;4921:32;4918:2;;;4966:1;4963;4956:12;4918:2;5009:1;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4980:117;5136:2;5162:50;5204:7;5195:6;5184:9;5180:22;5162:50;:::i;:::-;5152:60;;5107:115;4908:321;;;;;:::o;5235:407::-;;;5360:2;5348:9;5339:7;5335:23;5331:32;5328:2;;;5376:1;5373;5366:12;5328:2;5419:1;5444:53;5489:7;5480:6;5469:9;5465:22;5444:53;:::i;:::-;5434:63;;5390:117;5546:2;5572:53;5617:7;5608:6;5597:9;5593:22;5572:53;:::i;:::-;5562:63;;5517:118;5318:324;;;;;:::o;5648:405::-;;5781:2;5769:9;5760:7;5756:23;5752:32;5749:2;;;5797:1;5794;5787:12;5749:2;5868:1;5857:9;5853:17;5840:31;5898:18;5890:6;5887:30;5884:2;;;5930:1;5927;5920:12;5884:2;5958:78;6028:7;6019:6;6008:9;6004:22;5958:78;:::i;:::-;5948:88;;5811:235;5739:314;;;;:::o;6059:260::-;;6166:2;6154:9;6145:7;6141:23;6137:32;6134:2;;;6182:1;6179;6172:12;6134:2;6225:1;6250:52;6294:7;6285:6;6274:9;6270:22;6250:52;:::i;:::-;6240:62;;6196:116;6124:195;;;;:::o;6325:282::-;;6443:2;6431:9;6422:7;6418:23;6414:32;6411:2;;;6459:1;6456;6449:12;6411:2;6502:1;6527:63;6582:7;6573:6;6562:9;6558:22;6527:63;:::i;:::-;6517:73;;6473:127;6401:206;;;;:::o;6613:262::-;;6721:2;6709:9;6700:7;6696:23;6692:32;6689:2;;;6737:1;6734;6727:12;6689:2;6780:1;6805:53;6850:7;6841:6;6830:9;6826:22;6805:53;:::i;:::-;6795:63;;6751:117;6679:196;;;;:::o;6881:118::-;6968:24;6986:5;6968:24;:::i;:::-;6963:3;6956:37;6946:53;;:::o;7005:109::-;7086:21;7101:5;7086:21;:::i;:::-;7081:3;7074:34;7064:50;;:::o;7120:360::-;;7234:38;7266:5;7234:38;:::i;:::-;7288:70;7351:6;7346:3;7288:70;:::i;:::-;7281:77;;7367:52;7412:6;7407:3;7400:4;7393:5;7389:16;7367:52;:::i;:::-;7444:29;7466:6;7444:29;:::i;:::-;7439:3;7435:39;7428:46;;7210:270;;;;;:::o;7486:175::-;7595:59;7648:5;7595:59;:::i;:::-;7590:3;7583:72;7573:88;;:::o;7667:364::-;;7783:39;7816:5;7783:39;:::i;:::-;7838:71;7902:6;7897:3;7838:71;:::i;:::-;7831:78;;7918:52;7963:6;7958:3;7951:4;7944:5;7940:16;7918:52;:::i;:::-;7995:29;8017:6;7995:29;:::i;:::-;7990:3;7986:39;7979:46;;7759:272;;;;;:::o;8037:377::-;;8171:39;8204:5;8171:39;:::i;:::-;8226:89;8308:6;8303:3;8226:89;:::i;:::-;8219:96;;8324:52;8369:6;8364:3;8357:4;8350:5;8346:16;8324:52;:::i;:::-;8401:6;8396:3;8392:16;8385:23;;8147:267;;;;;:::o;8420:375::-;;8583:67;8647:2;8642:3;8583:67;:::i;:::-;8576:74;;8680:34;8676:1;8671:3;8667:11;8660:55;8746:13;8741:2;8736:3;8732:12;8725:35;8786:2;8781:3;8777:12;8770:19;;8566:229;;;:::o;8801:382::-;;8964:67;9028:2;9023:3;8964:67;:::i;:::-;8957:74;;9061:34;9057:1;9052:3;9048:11;9041:55;9127:20;9122:2;9117:3;9113:12;9106:42;9174:2;9169:3;9165:12;9158:19;;8947:236;;;:::o;9189:325::-;;9352:67;9416:2;9411:3;9352:67;:::i;:::-;9345:74;;9449:29;9445:1;9440:3;9436:11;9429:50;9505:2;9500:3;9496:12;9489:19;;9335:179;;;:::o;9520:370::-;;9683:67;9747:2;9742:3;9683:67;:::i;:::-;9676:74;;9780:34;9776:1;9771:3;9767:11;9760:55;9846:8;9841:2;9836:3;9832:12;9825:30;9881:2;9876:3;9872:12;9865:19;;9666:224;;;:::o;9896:326::-;;10059:67;10123:2;10118:3;10059:67;:::i;:::-;10052:74;;10156:30;10152:1;10147:3;10143:11;10136:51;10213:2;10208:3;10204:12;10197:19;;10042:180;;;:::o;10228:368::-;;10391:67;10455:2;10450:3;10391:67;:::i;:::-;10384:74;;10488:34;10484:1;10479:3;10475:11;10468:55;10554:6;10549:2;10544:3;10540:12;10533:28;10587:2;10582:3;10578:12;10571:19;;10374:222;;;:::o;10602:323::-;;10765:67;10829:2;10824:3;10765:67;:::i;:::-;10758:74;;10862:27;10858:1;10853:3;10849:11;10842:48;10916:2;10911:3;10907:12;10900:19;;10748:177;;;:::o;10931:398::-;;11112:85;11194:2;11189:3;11112:85;:::i;:::-;11105:92;;11227:66;11223:1;11218:3;11214:11;11207:87;11320:2;11315:3;11311:12;11304:19;;11095:234;;;:::o;11335:376::-;;11498:67;11562:2;11557:3;11498:67;:::i;:::-;11491:74;;11595:34;11591:1;11586:3;11582:11;11575:55;11661:14;11656:2;11651:3;11647:12;11640:36;11702:2;11697:3;11693:12;11686:19;;11481:230;;;:::o;11717:388::-;;11880:67;11944:2;11939:3;11880:67;:::i;:::-;11873:74;;11977:34;11973:1;11968:3;11964:11;11957:55;12043:26;12038:2;12033:3;12029:12;12022:48;12096:2;12091:3;12087:12;12080:19;;11863:242;;;:::o;12111:877::-;;12292:86;12374:3;12369;12292:86;:::i;:::-;12285:93;;12408:66;12404:1;12399:3;12395:11;12388:87;12506:34;12501:2;12496:3;12492:12;12485:56;12572:34;12567:2;12562:3;12558:12;12551:56;12638:34;12633:2;12628:3;12624:12;12617:56;12705:34;12699:3;12694;12690:13;12683:57;12772:34;12766:3;12761;12757:13;12750:57;12839:66;12833:3;12828;12824:13;12817:89;12938:13;12932:3;12927;12923:13;12916:36;12978:3;12973;12969:13;12962:20;;12275:713;;;:::o;12994:374::-;;13157:67;13221:2;13216:3;13157:67;:::i;:::-;13150:74;;13254:34;13250:1;13245:3;13241:11;13234:55;13320:12;13315:2;13310:3;13306:12;13299:34;13359:2;13354:3;13350:12;13343:19;;13140:228;;;:::o;13374:373::-;;13537:67;13601:2;13596:3;13537:67;:::i;:::-;13530:74;;13634:34;13630:1;13625:3;13621:11;13614:55;13700:11;13695:2;13690:3;13686:12;13679:33;13738:2;13733:3;13729:12;13722:19;;13520:227;;;:::o;13753:396::-;;13934:84;14016:1;14011:3;13934:84;:::i;:::-;13927:91;;14048:66;14044:1;14039:3;14035:11;14028:87;14141:1;14136:3;14132:11;14125:18;;13917:232;;;:::o;14155:330::-;;14318:67;14382:2;14377:3;14318:67;:::i;:::-;14311:74;;14415:34;14411:1;14406:3;14402:11;14395:55;14476:2;14471:3;14467:12;14460:19;;14301:184;;;:::o;14491:376::-;;14654:67;14718:2;14713:3;14654:67;:::i;:::-;14647:74;;14751:34;14747:1;14742:3;14738:11;14731:55;14817:14;14812:2;14807:3;14803:12;14796:36;14858:2;14853:3;14849:12;14842:19;;14637:230;;;:::o;14873:330::-;;15036:67;15100:2;15095:3;15036:67;:::i;:::-;15029:74;;15133:34;15129:1;15124:3;15120:11;15113:55;15194:2;15189:3;15185:12;15178:19;;15019:184;;;:::o;15209:314::-;;15372:67;15436:2;15431:3;15372:67;:::i;:::-;15365:74;;15469:18;15465:1;15460:3;15456:11;15449:39;15514:2;15509:3;15505:12;15498:19;;15355:168;;;:::o;15529:373::-;;15692:67;15756:2;15751:3;15692:67;:::i;:::-;15685:74;;15789:34;15785:1;15780:3;15776:11;15769:55;15855:11;15850:2;15845:3;15841:12;15834:33;15893:2;15888:3;15884:12;15877:19;;15675:227;;;:::o;15908:365::-;;16071:67;16135:2;16130:3;16071:67;:::i;:::-;16064:74;;16168:34;16164:1;16159:3;16155:11;16148:55;16234:3;16229:2;16224:3;16220:12;16213:25;16264:2;16259:3;16255:12;16248:19;;16054:219;;;:::o;16279:363::-;;16460:85;16542:2;16537:3;16460:85;:::i;:::-;16453:92;;16575:31;16571:1;16566:3;16562:11;16555:52;16633:2;16628:3;16624:12;16617:19;;16443:199;;;:::o;16648:381::-;;16811:67;16875:2;16870:3;16811:67;:::i;:::-;16804:74;;16908:34;16904:1;16899:3;16895:11;16888:55;16974:19;16969:2;16964:3;16960:12;16953:41;17020:2;17015:3;17011:12;17004:19;;16794:235;;;:::o;17035:376::-;;17198:67;17262:2;17257:3;17198:67;:::i;:::-;17191:74;;17295:34;17291:1;17286:3;17282:11;17275:55;17361:14;17356:2;17351:3;17347:12;17340:36;17402:2;17397:3;17393:12;17386:19;;17181:230;;;:::o;17417:334::-;;17598:84;17680:1;17675:3;17598:84;:::i;:::-;17591:91;;17712:4;17708:1;17703:3;17699:11;17692:25;17743:1;17738:3;17734:11;17727:18;;17581:170;;;:::o;17757:329::-;;17920:67;17984:2;17979:3;17920:67;:::i;:::-;17913:74;;18017:33;18013:1;18008:3;18004:11;17997:54;18077:2;18072:3;18068:12;18061:19;;17903:183;;;:::o;18092:118::-;18179:24;18197:5;18179:24;:::i;:::-;18174:3;18167:37;18157:53;;:::o;18216:275::-;;18370:95;18461:3;18452:6;18370:95;:::i;:::-;18363:102;;18482:3;18475:10;;18352:139;;;;:::o;18497:435::-;;18699:95;18790:3;18781:6;18699:95;:::i;:::-;18692:102;;18811:95;18902:3;18893:6;18811:95;:::i;:::-;18804:102;;18923:3;18916:10;;18681:251;;;;;:::o;18938:1877::-;;19573:95;19664:3;19655:6;19573:95;:::i;:::-;19566:102;;19685:95;19776:3;19767:6;19685:95;:::i;:::-;19678:102;;19797:95;19888:3;19879:6;19797:95;:::i;:::-;19790:102;;19909:95;20000:3;19991:6;19909:95;:::i;:::-;19902:102;;20021:95;20112:3;20103:6;20021:95;:::i;:::-;20014:102;;20133:95;20224:3;20215:6;20133:95;:::i;:::-;20126:102;;20245:95;20336:3;20327:6;20245:95;:::i;:::-;20238:102;;20357:95;20448:3;20439:6;20357:95;:::i;:::-;20350:102;;20469:95;20560:3;20551:6;20469:95;:::i;:::-;20462:102;;20581:95;20672:3;20663:6;20581:95;:::i;:::-;20574:102;;20693:96;20785:3;20775:7;20693:96;:::i;:::-;20686:103;;20806:3;20799:10;;19555:1260;;;;;;;;;;;;;;:::o;20821:701::-;;21124:95;21215:3;21206:6;21124:95;:::i;:::-;21117:102;;21236:148;21380:3;21236:148;:::i;:::-;21229:155;;21401:95;21492:3;21483:6;21401:95;:::i;:::-;21394:102;;21513:3;21506:10;;21106:416;;;;;:::o;21528:1233::-;;22033:148;22177:3;22033:148;:::i;:::-;22026:155;;22198:95;22289:3;22280:6;22198:95;:::i;:::-;22191:102;;22310:148;22454:3;22310:148;:::i;:::-;22303:155;;22475:95;22566:3;22557:6;22475:95;:::i;:::-;22468:102;;22587:148;22731:3;22587:148;:::i;:::-;22580:155;;22752:3;22745:10;;22015:746;;;;;:::o;22767:541::-;;23022:148;23166:3;23022:148;:::i;:::-;23015:155;;23187:95;23278:3;23269:6;23187:95;:::i;:::-;23180:102;;23299:3;23292:10;;23004:304;;;;:::o;23314:222::-;;23445:2;23434:9;23430:18;23422:26;;23458:71;23526:1;23515:9;23511:17;23502:6;23458:71;:::i;:::-;23412:124;;;;:::o;23542:640::-;;23775:3;23764:9;23760:19;23752:27;;23789:71;23857:1;23846:9;23842:17;23833:6;23789:71;:::i;:::-;23870:72;23938:2;23927:9;23923:18;23914:6;23870:72;:::i;:::-;23952;24020:2;24009:9;24005:18;23996:6;23952:72;:::i;:::-;24071:9;24065:4;24061:20;24056:2;24045:9;24041:18;24034:48;24099:76;24170:4;24161:6;24099:76;:::i;:::-;24091:84;;23742:440;;;;;;;:::o;24188:210::-;;24313:2;24302:9;24298:18;24290:26;;24326:65;24388:1;24377:9;24373:17;24364:6;24326:65;:::i;:::-;24280:118;;;;:::o;24404:266::-;;24557:2;24546:9;24542:18;24534:26;;24570:93;24660:1;24649:9;24645:17;24636:6;24570:93;:::i;:::-;24524:146;;;;:::o;24676:313::-;;24827:2;24816:9;24812:18;24804:26;;24876:9;24870:4;24866:20;24862:1;24851:9;24847:17;24840:47;24904:78;24977:4;24968:6;24904:78;:::i;:::-;24896:86;;24794:195;;;;:::o;24995:419::-;;25199:2;25188:9;25184:18;25176:26;;25248:9;25242:4;25238:20;25234:1;25223:9;25219:17;25212:47;25276:131;25402:4;25276:131;:::i;:::-;25268:139;;25166:248;;;:::o;25420:419::-;;25624:2;25613:9;25609:18;25601:26;;25673:9;25667:4;25663:20;25659:1;25648:9;25644:17;25637:47;25701:131;25827:4;25701:131;:::i;:::-;25693:139;;25591:248;;;:::o;25845:419::-;;26049:2;26038:9;26034:18;26026:26;;26098:9;26092:4;26088:20;26084:1;26073:9;26069:17;26062:47;26126:131;26252:4;26126:131;:::i;:::-;26118:139;;26016:248;;;:::o;26270:419::-;;26474:2;26463:9;26459:18;26451:26;;26523:9;26517:4;26513:20;26509:1;26498:9;26494:17;26487:47;26551:131;26677:4;26551:131;:::i;:::-;26543:139;;26441:248;;;:::o;26695:419::-;;26899:2;26888:9;26884:18;26876:26;;26948:9;26942:4;26938:20;26934:1;26923:9;26919:17;26912:47;26976:131;27102:4;26976:131;:::i;:::-;26968:139;;26866:248;;;:::o;27120:419::-;;27324:2;27313:9;27309:18;27301:26;;27373:9;27367:4;27363:20;27359:1;27348:9;27344:17;27337:47;27401:131;27527:4;27401:131;:::i;:::-;27393:139;;27291:248;;;:::o;27545:419::-;;27749:2;27738:9;27734:18;27726:26;;27798:9;27792:4;27788:20;27784:1;27773:9;27769:17;27762:47;27826:131;27952:4;27826:131;:::i;:::-;27818:139;;27716:248;;;:::o;27970:419::-;;28174:2;28163:9;28159:18;28151:26;;28223:9;28217:4;28213:20;28209:1;28198:9;28194:17;28187:47;28251:131;28377:4;28251:131;:::i;:::-;28243:139;;28141:248;;;:::o;28395:419::-;;28599:2;28588:9;28584:18;28576:26;;28648:9;28642:4;28638:20;28634:1;28623:9;28619:17;28612:47;28676:131;28802:4;28676:131;:::i;:::-;28668:139;;28566:248;;;:::o;28820:419::-;;29024:2;29013:9;29009:18;29001:26;;29073:9;29067:4;29063:20;29059:1;29048:9;29044:17;29037:47;29101:131;29227:4;29101:131;:::i;:::-;29093:139;;28991:248;;;:::o;29245:419::-;;29449:2;29438:9;29434:18;29426:26;;29498:9;29492:4;29488:20;29484:1;29473:9;29469:17;29462:47;29526:131;29652:4;29526:131;:::i;:::-;29518:139;;29416:248;;;:::o;29670:419::-;;29874:2;29863:9;29859:18;29851:26;;29923:9;29917:4;29913:20;29909:1;29898:9;29894:17;29887:47;29951:131;30077:4;29951:131;:::i;:::-;29943:139;;29841:248;;;:::o;30095:419::-;;30299:2;30288:9;30284:18;30276:26;;30348:9;30342:4;30338:20;30334:1;30323:9;30319:17;30312:47;30376:131;30502:4;30376:131;:::i;:::-;30368:139;;30266:248;;;:::o;30520:419::-;;30724:2;30713:9;30709:18;30701:26;;30773:9;30767:4;30763:20;30759:1;30748:9;30744:17;30737:47;30801:131;30927:4;30801:131;:::i;:::-;30793:139;;30691:248;;;:::o;30945:419::-;;31149:2;31138:9;31134:18;31126:26;;31198:9;31192:4;31188:20;31184:1;31173:9;31169:17;31162:47;31226:131;31352:4;31226:131;:::i;:::-;31218:139;;31116:248;;;:::o;31370:419::-;;31574:2;31563:9;31559:18;31551:26;;31623:9;31617:4;31613:20;31609:1;31598:9;31594:17;31587:47;31651:131;31777:4;31651:131;:::i;:::-;31643:139;;31541:248;;;:::o;31795:419::-;;31999:2;31988:9;31984:18;31976:26;;32048:9;32042:4;32038:20;32034:1;32023:9;32019:17;32012:47;32076:131;32202:4;32076:131;:::i;:::-;32068:139;;31966:248;;;:::o;32220:419::-;;32424:2;32413:9;32409:18;32401:26;;32473:9;32467:4;32463:20;32459:1;32448:9;32444:17;32437:47;32501:131;32627:4;32501:131;:::i;:::-;32493:139;;32391:248;;;:::o;32645:419::-;;32849:2;32838:9;32834:18;32826:26;;32898:9;32892:4;32888:20;32884:1;32873:9;32869:17;32862:47;32926:131;33052:4;32926:131;:::i;:::-;32918:139;;32816:248;;;:::o;33070:419::-;;33274:2;33263:9;33259:18;33251:26;;33323:9;33317:4;33313:20;33309:1;33298:9;33294:17;33287:47;33351:131;33477:4;33351:131;:::i;:::-;33343:139;;33241:248;;;:::o;33495:222::-;;33626:2;33615:9;33611:18;33603:26;;33639:71;33707:1;33696:9;33692:17;33683:6;33639:71;:::i;:::-;33593:124;;;;:::o;33723:283::-;;33789:2;33783:9;33773:19;;33831:4;33823:6;33819:17;33938:6;33926:10;33923:22;33902:18;33890:10;33887:34;33884:62;33881:2;;;33949:18;;:::i;:::-;33881:2;33989:10;33985:2;33978:22;33763:243;;;;:::o;34012:311::-;;34179:18;34171:6;34168:30;34165:2;;;34201:18;;:::i;:::-;34165:2;34251:4;34243:6;34239:17;34231:25;;34311:4;34305;34301:15;34293:23;;34094:229;;;:::o;34329:331::-;;34480:18;34472:6;34469:30;34466:2;;;34502:18;;:::i;:::-;34466:2;34587:4;34583:9;34576:4;34568:6;34564:17;34560:33;34552:41;;34648:4;34642;34638:15;34630:23;;34395:265;;;:::o;34666:98::-;;34751:5;34745:12;34735:22;;34724:40;;;:::o;34770:99::-;;34856:5;34850:12;34840:22;;34829:40;;;:::o;34875:168::-;;34992:6;34987:3;34980:19;35032:4;35027:3;35023:14;35008:29;;34970:73;;;;:::o;35049:169::-;;35167:6;35162:3;35155:19;35207:4;35202:3;35198:14;35183:29;;35145:73;;;;:::o;35224:148::-;;35363:3;35348:18;;35338:34;;;;:::o;35378:305::-;;35437:20;35455:1;35437:20;:::i;:::-;35432:25;;35471:20;35489:1;35471:20;:::i;:::-;35466:25;;35625:1;35557:66;35553:74;35550:1;35547:81;35544:2;;;35631:18;;:::i;:::-;35544:2;35675:1;35672;35668:9;35661:16;;35422:261;;;;:::o;35689:185::-;;35746:20;35764:1;35746:20;:::i;:::-;35741:25;;35780:20;35798:1;35780:20;:::i;:::-;35775:25;;35819:1;35809:2;;35824:18;;:::i;:::-;35809:2;35866:1;35863;35859:9;35854:14;;35731:143;;;;:::o;35880:348::-;;35943:20;35961:1;35943:20;:::i;:::-;35938:25;;35977:20;35995:1;35977:20;:::i;:::-;35972:25;;36165:1;36097:66;36093:74;36090:1;36087:81;36082:1;36075:9;36068:17;36064:105;36061:2;;;36172:18;;:::i;:::-;36061:2;36220:1;36217;36213:9;36202:20;;35928:300;;;;:::o;36234:191::-;;36294:20;36312:1;36294:20;:::i;:::-;36289:25;;36328:20;36346:1;36328:20;:::i;:::-;36323:25;;36367:1;36364;36361:8;36358:2;;;36372:18;;:::i;:::-;36358:2;36417:1;36414;36410:9;36402:17;;36279:146;;;;:::o;36431:96::-;;36497:24;36515:5;36497:24;:::i;:::-;36486:35;;36476:51;;;:::o;36533:90::-;;36610:5;36603:13;36596:21;36585:32;;36575:48;;;:::o;36629:149::-;;36705:66;36698:5;36694:78;36683:89;;36673:105;;;:::o;36784:126::-;;36861:42;36854:5;36850:54;36839:65;;36829:81;;;:::o;36916:77::-;;36982:5;36971:16;;36961:32;;;:::o;36999:170::-;;37104:59;37157:5;37104:59;:::i;:::-;37091:72;;37081:88;;;:::o;37175:135::-;;37280:24;37298:5;37280:24;:::i;:::-;37267:37;;37257:53;;;:::o;37316:154::-;37400:6;37395:3;37390;37377:30;37462:1;37453:6;37448:3;37444:16;37437:27;37367:103;;;:::o;37476:307::-;37544:1;37554:113;37568:6;37565:1;37562:13;37554:113;;;37653:1;37648:3;37644:11;37638:18;37634:1;37629:3;37625:11;37618:39;37590:2;37587:1;37583:10;37578:15;;37554:113;;;37685:6;37682:1;37679:13;37676:2;;;37765:1;37756:6;37751:3;37747:16;37740:27;37676:2;37525:258;;;;:::o;37789:320::-;;37870:1;37864:4;37860:12;37850:22;;37917:1;37911:4;37907:12;37938:18;37928:2;;37994:4;37986:6;37982:17;37972:27;;37928:2;38056;38048:6;38045:14;38025:18;38022:38;38019:2;;;38075:18;;:::i;:::-;38019:2;37840:269;;;;:::o;38115:233::-;;38177:24;38195:5;38177:24;:::i;:::-;38168:33;;38223:66;38216:5;38213:77;38210:2;;;38293:18;;:::i;:::-;38210:2;38340:1;38333:5;38329:13;38322:20;;38158:190;;;:::o;38354:176::-;;38403:20;38421:1;38403:20;:::i;:::-;38398:25;;38437:20;38455:1;38437:20;:::i;:::-;38432:25;;38476:1;38466:2;;38481:18;;:::i;:::-;38466:2;38522:1;38519;38515:9;38510:14;;38388:142;;;;:::o;38536:180::-;38584:77;38581:1;38574:88;38681:4;38678:1;38671:15;38705:4;38702:1;38695:15;38722:180;38770:77;38767:1;38760:88;38867:4;38864:1;38857:15;38891:4;38888:1;38881:15;38908:180;38956:77;38953:1;38946:88;39053:4;39050:1;39043:15;39077:4;39074:1;39067:15;39094:180;39142:77;39139:1;39132:88;39239:4;39236:1;39229:15;39263:4;39260:1;39253:15;39280:102;;39372:2;39368:7;39363:2;39356:5;39352:14;39348:28;39338:38;;39328:54;;;:::o;39388:122::-;39461:24;39479:5;39461:24;:::i;:::-;39454:5;39451:35;39441:2;;39500:1;39497;39490:12;39441:2;39431:79;:::o;39516:116::-;39586:21;39601:5;39586:21;:::i;:::-;39579:5;39576:32;39566:2;;39622:1;39619;39612:12;39566:2;39556:76;:::o;39638:120::-;39710:23;39727:5;39710:23;:::i;:::-;39703:5;39700:34;39690:2;;39748:1;39745;39738:12;39690:2;39680:78;:::o;39764:122::-;39837:24;39855:5;39837:24;:::i;:::-;39830:5;39827:35;39817:2;;39876:1;39873;39866:12;39817:2;39807:79;:::o

Swarm Source

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