FTM Price: $0.569292 (-12.38%)
Gas: 11 GWei
 

Overview

Max Total Supply

0 PSYCAT

Holders

0

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Balance
0 PSYCAT
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
psychedelicCat

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2021-10-15
*/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8ea06b75aa45d7a7b9b7a18c835490d6503a45c9/contracts/utils/Counters.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8ea06b75aa45d7a7b9b7a18c835490d6503a45c9/contracts/mocks/CountersImpl.sol



pragma solidity ^0.8.0;


contract CountersImpl {
    using Counters for Counters.Counter;

    Counters.Counter private _counter;

    function current() public view returns (uint256) {
        return _counter.current();
    }

    function increment() public {
        _counter.increment();
    }

    function decrement() public {
        _counter.decrement();
    }

    function reset() public {
        _counter.reset();
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/interfaces/IERC165.sol



pragma solidity ^0.8.0;


// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/interfaces/IERC2981.sol



pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || 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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol



pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

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

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

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

        return super.tokenURI(tokenId);
    }

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

    /**
     * @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 override {
        super._burn(tokenId);

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Burnable.sol



pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: contracts/psycat.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

//ERC721 token

//Burnable in case an NFT needs to be destroyed.

// Royalty standard

//Making sure only I can mint and burn

// In order to be able to set the URI for a token.

// Incrementing IDs


// Daddy Catman's wallet.
address constant CATMAN = address(0x23c0d2461f83374150E008cFb3A016491f6424A1);

contract psychedelicCat is ERC721, ERC721URIStorage, ERC721Burnable, Ownable, IERC2981{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    mapping(uint => address) public royaltyRecipient;

    /* Constructor to create the NFT collection */
    constructor() ERC721("Psychedelic Cats", "PSYCAT") {}

    /* function to mint a new NFT in the psychedelic cats collection. Can only be called by the owner of the contract. */
    function CreateCat(address owner, string memory uri) external onlyOwner{
        _tokenIds.increment();
        uint256 newCatId = _tokenIds.current();
        _mint(owner, newCatId);

        //This URI should contain a JSON object, that JSON object should contain an IPFS link to a .png file where the picture is contained.
        _setTokenURI(newCatId, uri);
        royaltyRecipient[newCatId] = CATMAN;
    }

    /* Burn an NFT in case a mistake was made. */
    function BurnCat(uint256 tokenId) external onlyOwner{
        burn(tokenId);
    }

    /* Set the royalties according to the ERC2981 standard */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override
    returns (address receiver, uint256 royaltyAmount) {
        uint256 amount = (_salePrice * 250) / 10000;
        return (royaltyRecipient[_tokenId], amount);
    }
    
    function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage) onlyOwner {
        super._burn(tokenId);
    }
    function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);   
    }
}

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":"uint256","name":"tokenId","type":"uint256"}],"name":"BurnCat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"CreateCat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"royaltyRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601081526020017f50737963686564656c69632043617473000000000000000000000000000000008152506040518060400160405280600681526020017f5053594341540000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61361080620002cb6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80636ebc04b3116100b8578063a22cb4651161007c578063a22cb4651461034d578063b88d4fde14610369578063c87b56dd14610385578063e985e9c5146103b5578063ec6e2035146103e5578063f2fde38b1461040157610137565b80636ebc04b3146102bb57806370a08231146102d7578063715018a6146103075780638da5cb5b1461031157806395d89b411461032f57610137565b80632a55205a116100ff5780632a55205a146101f257806342842e0e1461022357806342966c681461023f578063480eb2871461025b5780636352211e1461028b57610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b6101566004803603810190610151919061241b565b61041d565b60405161016391906128ff565b60405180910390f35b6101746104ff565b604051610181919061291a565b60405180910390f35b6101a4600480360381019061019f9190612475565b610591565b6040516101b1919061286f565b60405180910390f35b6101d460048036038101906101cf91906123db565b610616565b005b6101f060048036038101906101eb9190612269565b61072e565b005b61020c600480360381019061020791906124a2565b61078e565b60405161021a9291906128d6565b60405180910390f35b61023d60048036038101906102389190612269565b6107f0565b005b61025960048036038101906102549190612475565b610810565b005b61027560048036038101906102709190612475565b61086c565b604051610282919061286f565b60405180910390f35b6102a560048036038101906102a09190612475565b61089f565b6040516102b2919061286f565b60405180910390f35b6102d560048036038101906102d09190612475565b610951565b005b6102f160048036038101906102ec91906121fc565b6109d9565b6040516102fe9190612b9c565b60405180910390f35b61030f610a91565b005b610319610b19565b604051610326919061286f565b60405180910390f35b610337610b43565b604051610344919061291a565b60405180910390f35b6103676004803603810190610362919061233f565b610bd5565b005b610383600480360381019061037e91906122bc565b610beb565b005b61039f600480360381019061039a9190612475565b610c4d565b6040516103ac919061291a565b60405180910390f35b6103cf60048036038101906103ca9190612229565b610c5f565b6040516103dc91906128ff565b60405180910390f35b6103ff60048036038101906103fa919061237f565b610cf3565b005b61041b600480360381019061041691906121fc565b610e06565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104e857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104f857506104f782610efe565b5b9050919050565b60606000805461050e90612e4c565b80601f016020809104026020016040519081016040528092919081815260200182805461053a90612e4c565b80156105875780601f1061055c57610100808354040283529160200191610587565b820191906000526020600020905b81548152906001019060200180831161056a57829003601f168201915b5050505050905090565b600061059c82610f68565b6105db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d290612abc565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106218261089f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068990612b3c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106b1610fd4565b73ffffffffffffffffffffffffffffffffffffffff1614806106e057506106df816106da610fd4565b610c5f565b5b61071f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610716906129fc565b60405180910390fd5b6107298383610fdc565b505050565b61073f610739610fd4565b82611095565b61077e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077590612b5c565b60405180910390fd5b610789838383611173565b505050565b600080600061271060fa856107a39190612d08565b6107ad9190612cd7565b90506009600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b61080b83838360405180602001604052806000815250610beb565b505050565b61082161081b610fd4565b82611095565b610860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085790612b7c565b60405180910390fd5b610869816113cf565b50565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093f90612a3c565b60405180910390fd5b80915050919050565b610959610fd4565b73ffffffffffffffffffffffffffffffffffffffff16610977610b19565b73ffffffffffffffffffffffffffffffffffffffff16146109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c490612adc565b60405180910390fd5b6109d681610810565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190612a1c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a99610fd4565b73ffffffffffffffffffffffffffffffffffffffff16610ab7610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490612adc565b60405180910390fd5b610b176000611457565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b5290612e4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e90612e4c565b8015610bcb5780601f10610ba057610100808354040283529160200191610bcb565b820191906000526020600020905b815481529060010190602001808311610bae57829003601f168201915b5050505050905090565b610be7610be0610fd4565b838361151d565b5050565b610bfc610bf6610fd4565b83611095565b610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3290612b5c565b60405180910390fd5b610c478484848461168a565b50505050565b6060610c58826116e6565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610cfb610fd4565b73ffffffffffffffffffffffffffffffffffffffff16610d19610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690612adc565b60405180910390fd5b610d796008611838565b6000610d85600861184e565b9050610d91838261185c565b610d9b8183611a2a565b7323c0d2461f83374150e008cfb3a016491f6424a16009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b610e0e610fd4565b73ffffffffffffffffffffffffffffffffffffffff16610e2c610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990612adc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee99061295c565b60405180910390fd5b610efb81611457565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661104f8361089f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006110a082610f68565b6110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d6906129dc565b60405180910390fd5b60006110ea8361089f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061115957508373ffffffffffffffffffffffffffffffffffffffff1661114184610591565b73ffffffffffffffffffffffffffffffffffffffff16145b8061116a57506111698185610c5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111938261089f565b73ffffffffffffffffffffffffffffffffffffffff16146111e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e090612afc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611259576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112509061299c565b60405180910390fd5b611264838383611a9e565b61126f600082610fdc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112bf9190612d62565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113169190612c81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6113d7610fd4565b73ffffffffffffffffffffffffffffffffffffffff166113f5610b19565b73ffffffffffffffffffffffffffffffffffffffff161461144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290612adc565b60405180910390fd5b61145481611aa3565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561158c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611583906129bc565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161167d91906128ff565b60405180910390a3505050565b611695848484611173565b6116a184848484611af6565b6116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d79061293c565b60405180910390fd5b50505050565b60606116f182610f68565b611730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172790612a9c565b60405180910390fd5b600060066000848152602001908152602001600020805461175090612e4c565b80601f016020809104026020016040519081016040528092919081815260200182805461177c90612e4c565b80156117c95780601f1061179e576101008083540402835291602001916117c9565b820191906000526020600020905b8154815290600101906020018083116117ac57829003601f168201915b5050505050905060006117da611c8d565b90506000815114156117f0578192505050611833565b60008251111561182557808260405160200161180d92919061284b565b60405160208183030381529060405292505050611833565b61182e84611ca4565b925050505b919050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390612a7c565b60405180910390fd5b6118d581610f68565b15611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c9061297c565b60405180910390fd5b61192160008383611a9e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119719190612c81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611a3382610f68565b611a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6990612a5c565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611a99929190611fd0565b505050565b505050565b611aac81611d4b565b6000600660008381526020019081526020016000208054611acc90612e4c565b905014611af357600660008281526020019081526020016000206000611af29190612056565b5b50565b6000611b178473ffffffffffffffffffffffffffffffffffffffff16611e5c565b15611c80578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b40610fd4565b8786866040518563ffffffff1660e01b8152600401611b62949392919061288a565b602060405180830381600087803b158015611b7c57600080fd5b505af1925050508015611bad57506040513d601f19601f82011682018060405250810190611baa9190612448565b60015b611c30573d8060008114611bdd576040519150601f19603f3d011682016040523d82523d6000602084013e611be2565b606091505b50600081511415611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f9061293c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c85565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611caf82610f68565b611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590612b1c565b60405180910390fd5b6000611cf8611c8d565b90506000815111611d185760405180602001604052806000815250611d43565b80611d2284611e6f565b604051602001611d3392919061284b565b6040516020818303038152906040525b915050919050565b6000611d568261089f565b9050611d6481600084611a9e565b611d6f600083610fdc565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbf9190612d62565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415611eb7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fcb565b600082905060005b60008214611ee9578080611ed290612eaf565b915050600a82611ee29190612cd7565b9150611ebf565b60008167ffffffffffffffff811115611f0557611f04612fe5565b5b6040519080825280601f01601f191660200182016040528015611f375781602001600182028036833780820191505090505b5090505b60008514611fc457600182611f509190612d62565b9150600a85611f5f9190612ef8565b6030611f6b9190612c81565b60f81b818381518110611f8157611f80612fb6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fbd9190612cd7565b9450611f3b565b8093505050505b919050565b828054611fdc90612e4c565b90600052602060002090601f016020900481019282611ffe5760008555612045565b82601f1061201757805160ff1916838001178555612045565b82800160010185558215612045579182015b82811115612044578251825591602001919060010190612029565b5b5090506120529190612096565b5090565b50805461206290612e4c565b6000825580601f106120745750612093565b601f0160209004906000526020600020908101906120929190612096565b5b50565b5b808211156120af576000816000905550600101612097565b5090565b60006120c66120c184612bdc565b612bb7565b9050828152602081018484840111156120e2576120e1613019565b5b6120ed848285612e0a565b509392505050565b600061210861210384612c0d565b612bb7565b90508281526020810184848401111561212457612123613019565b5b61212f848285612e0a565b509392505050565b6000813590506121468161357e565b92915050565b60008135905061215b81613595565b92915050565b600081359050612170816135ac565b92915050565b600081519050612185816135ac565b92915050565b600082601f8301126121a05761219f613014565b5b81356121b08482602086016120b3565b91505092915050565b600082601f8301126121ce576121cd613014565b5b81356121de8482602086016120f5565b91505092915050565b6000813590506121f6816135c3565b92915050565b60006020828403121561221257612211613023565b5b600061222084828501612137565b91505092915050565b600080604083850312156122405761223f613023565b5b600061224e85828601612137565b925050602061225f85828601612137565b9150509250929050565b60008060006060848603121561228257612281613023565b5b600061229086828701612137565b93505060206122a186828701612137565b92505060406122b2868287016121e7565b9150509250925092565b600080600080608085870312156122d6576122d5613023565b5b60006122e487828801612137565b94505060206122f587828801612137565b9350506040612306878288016121e7565b925050606085013567ffffffffffffffff8111156123275761232661301e565b5b6123338782880161218b565b91505092959194509250565b6000806040838503121561235657612355613023565b5b600061236485828601612137565b92505060206123758582860161214c565b9150509250929050565b6000806040838503121561239657612395613023565b5b60006123a485828601612137565b925050602083013567ffffffffffffffff8111156123c5576123c461301e565b5b6123d1858286016121b9565b9150509250929050565b600080604083850312156123f2576123f1613023565b5b600061240085828601612137565b9250506020612411858286016121e7565b9150509250929050565b60006020828403121561243157612430613023565b5b600061243f84828501612161565b91505092915050565b60006020828403121561245e5761245d613023565b5b600061246c84828501612176565b91505092915050565b60006020828403121561248b5761248a613023565b5b6000612499848285016121e7565b91505092915050565b600080604083850312156124b9576124b8613023565b5b60006124c7858286016121e7565b92505060206124d8858286016121e7565b9150509250929050565b6124eb81612d96565b82525050565b6124fa81612da8565b82525050565b600061250b82612c3e565b6125158185612c54565b9350612525818560208601612e19565b61252e81613028565b840191505092915050565b600061254482612c49565b61254e8185612c65565b935061255e818560208601612e19565b61256781613028565b840191505092915050565b600061257d82612c49565b6125878185612c76565b9350612597818560208601612e19565b80840191505092915050565b60006125b0603283612c65565b91506125bb82613039565b604082019050919050565b60006125d3602683612c65565b91506125de82613088565b604082019050919050565b60006125f6601c83612c65565b9150612601826130d7565b602082019050919050565b6000612619602483612c65565b915061262482613100565b604082019050919050565b600061263c601983612c65565b91506126478261314f565b602082019050919050565b600061265f602c83612c65565b915061266a82613178565b604082019050919050565b6000612682603883612c65565b915061268d826131c7565b604082019050919050565b60006126a5602a83612c65565b91506126b082613216565b604082019050919050565b60006126c8602983612c65565b91506126d382613265565b604082019050919050565b60006126eb602e83612c65565b91506126f6826132b4565b604082019050919050565b600061270e602083612c65565b915061271982613303565b602082019050919050565b6000612731603183612c65565b915061273c8261332c565b604082019050919050565b6000612754602c83612c65565b915061275f8261337b565b604082019050919050565b6000612777602083612c65565b9150612782826133ca565b602082019050919050565b600061279a602983612c65565b91506127a5826133f3565b604082019050919050565b60006127bd602f83612c65565b91506127c882613442565b604082019050919050565b60006127e0602183612c65565b91506127eb82613491565b604082019050919050565b6000612803603183612c65565b915061280e826134e0565b604082019050919050565b6000612826603083612c65565b91506128318261352f565b604082019050919050565b61284581612e00565b82525050565b60006128578285612572565b91506128638284612572565b91508190509392505050565b600060208201905061288460008301846124e2565b92915050565b600060808201905061289f60008301876124e2565b6128ac60208301866124e2565b6128b9604083018561283c565b81810360608301526128cb8184612500565b905095945050505050565b60006040820190506128eb60008301856124e2565b6128f8602083018461283c565b9392505050565b600060208201905061291460008301846124f1565b92915050565b600060208201905081810360008301526129348184612539565b905092915050565b60006020820190508181036000830152612955816125a3565b9050919050565b60006020820190508181036000830152612975816125c6565b9050919050565b60006020820190508181036000830152612995816125e9565b9050919050565b600060208201905081810360008301526129b58161260c565b9050919050565b600060208201905081810360008301526129d58161262f565b9050919050565b600060208201905081810360008301526129f581612652565b9050919050565b60006020820190508181036000830152612a1581612675565b9050919050565b60006020820190508181036000830152612a3581612698565b9050919050565b60006020820190508181036000830152612a55816126bb565b9050919050565b60006020820190508181036000830152612a75816126de565b9050919050565b60006020820190508181036000830152612a9581612701565b9050919050565b60006020820190508181036000830152612ab581612724565b9050919050565b60006020820190508181036000830152612ad581612747565b9050919050565b60006020820190508181036000830152612af58161276a565b9050919050565b60006020820190508181036000830152612b158161278d565b9050919050565b60006020820190508181036000830152612b35816127b0565b9050919050565b60006020820190508181036000830152612b55816127d3565b9050919050565b60006020820190508181036000830152612b75816127f6565b9050919050565b60006020820190508181036000830152612b9581612819565b9050919050565b6000602082019050612bb1600083018461283c565b92915050565b6000612bc1612bd2565b9050612bcd8282612e7e565b919050565b6000604051905090565b600067ffffffffffffffff821115612bf757612bf6612fe5565b5b612c0082613028565b9050602081019050919050565b600067ffffffffffffffff821115612c2857612c27612fe5565b5b612c3182613028565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c8c82612e00565b9150612c9783612e00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ccc57612ccb612f29565b5b828201905092915050565b6000612ce282612e00565b9150612ced83612e00565b925082612cfd57612cfc612f58565b5b828204905092915050565b6000612d1382612e00565b9150612d1e83612e00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d5757612d56612f29565b5b828202905092915050565b6000612d6d82612e00565b9150612d7883612e00565b925082821015612d8b57612d8a612f29565b5b828203905092915050565b6000612da182612de0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612e37578082015181840152602081019050612e1c565b83811115612e46576000848401525b50505050565b60006002820490506001821680612e6457607f821691505b60208210811415612e7857612e77612f87565b5b50919050565b612e8782613028565b810181811067ffffffffffffffff82111715612ea657612ea5612fe5565b5b80604052505050565b6000612eba82612e00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612eed57612eec612f29565b5b600182019050919050565b6000612f0382612e00565b9150612f0e83612e00565b925082612f1e57612f1d612f58565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61358781612d96565b811461359257600080fd5b50565b61359e81612da8565b81146135a957600080fd5b50565b6135b581612db4565b81146135c057600080fd5b50565b6135cc81612e00565b81146135d757600080fd5b5056fea2646970667358221220bb3c5f7cadbef05394f1637622e4399ec03de7c18fa629582c39ec7ffbd8a9ad64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c80636ebc04b3116100b8578063a22cb4651161007c578063a22cb4651461034d578063b88d4fde14610369578063c87b56dd14610385578063e985e9c5146103b5578063ec6e2035146103e5578063f2fde38b1461040157610137565b80636ebc04b3146102bb57806370a08231146102d7578063715018a6146103075780638da5cb5b1461031157806395d89b411461032f57610137565b80632a55205a116100ff5780632a55205a146101f257806342842e0e1461022357806342966c681461023f578063480eb2871461025b5780636352211e1461028b57610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b6101566004803603810190610151919061241b565b61041d565b60405161016391906128ff565b60405180910390f35b6101746104ff565b604051610181919061291a565b60405180910390f35b6101a4600480360381019061019f9190612475565b610591565b6040516101b1919061286f565b60405180910390f35b6101d460048036038101906101cf91906123db565b610616565b005b6101f060048036038101906101eb9190612269565b61072e565b005b61020c600480360381019061020791906124a2565b61078e565b60405161021a9291906128d6565b60405180910390f35b61023d60048036038101906102389190612269565b6107f0565b005b61025960048036038101906102549190612475565b610810565b005b61027560048036038101906102709190612475565b61086c565b604051610282919061286f565b60405180910390f35b6102a560048036038101906102a09190612475565b61089f565b6040516102b2919061286f565b60405180910390f35b6102d560048036038101906102d09190612475565b610951565b005b6102f160048036038101906102ec91906121fc565b6109d9565b6040516102fe9190612b9c565b60405180910390f35b61030f610a91565b005b610319610b19565b604051610326919061286f565b60405180910390f35b610337610b43565b604051610344919061291a565b60405180910390f35b6103676004803603810190610362919061233f565b610bd5565b005b610383600480360381019061037e91906122bc565b610beb565b005b61039f600480360381019061039a9190612475565b610c4d565b6040516103ac919061291a565b60405180910390f35b6103cf60048036038101906103ca9190612229565b610c5f565b6040516103dc91906128ff565b60405180910390f35b6103ff60048036038101906103fa919061237f565b610cf3565b005b61041b600480360381019061041691906121fc565b610e06565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104e857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104f857506104f782610efe565b5b9050919050565b60606000805461050e90612e4c565b80601f016020809104026020016040519081016040528092919081815260200182805461053a90612e4c565b80156105875780601f1061055c57610100808354040283529160200191610587565b820191906000526020600020905b81548152906001019060200180831161056a57829003601f168201915b5050505050905090565b600061059c82610f68565b6105db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d290612abc565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106218261089f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068990612b3c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106b1610fd4565b73ffffffffffffffffffffffffffffffffffffffff1614806106e057506106df816106da610fd4565b610c5f565b5b61071f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610716906129fc565b60405180910390fd5b6107298383610fdc565b505050565b61073f610739610fd4565b82611095565b61077e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077590612b5c565b60405180910390fd5b610789838383611173565b505050565b600080600061271060fa856107a39190612d08565b6107ad9190612cd7565b90506009600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b61080b83838360405180602001604052806000815250610beb565b505050565b61082161081b610fd4565b82611095565b610860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085790612b7c565b60405180910390fd5b610869816113cf565b50565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093f90612a3c565b60405180910390fd5b80915050919050565b610959610fd4565b73ffffffffffffffffffffffffffffffffffffffff16610977610b19565b73ffffffffffffffffffffffffffffffffffffffff16146109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c490612adc565b60405180910390fd5b6109d681610810565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190612a1c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a99610fd4565b73ffffffffffffffffffffffffffffffffffffffff16610ab7610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490612adc565b60405180910390fd5b610b176000611457565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b5290612e4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e90612e4c565b8015610bcb5780601f10610ba057610100808354040283529160200191610bcb565b820191906000526020600020905b815481529060010190602001808311610bae57829003601f168201915b5050505050905090565b610be7610be0610fd4565b838361151d565b5050565b610bfc610bf6610fd4565b83611095565b610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3290612b5c565b60405180910390fd5b610c478484848461168a565b50505050565b6060610c58826116e6565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610cfb610fd4565b73ffffffffffffffffffffffffffffffffffffffff16610d19610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690612adc565b60405180910390fd5b610d796008611838565b6000610d85600861184e565b9050610d91838261185c565b610d9b8183611a2a565b7323c0d2461f83374150e008cfb3a016491f6424a16009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b610e0e610fd4565b73ffffffffffffffffffffffffffffffffffffffff16610e2c610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990612adc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee99061295c565b60405180910390fd5b610efb81611457565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661104f8361089f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006110a082610f68565b6110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d6906129dc565b60405180910390fd5b60006110ea8361089f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061115957508373ffffffffffffffffffffffffffffffffffffffff1661114184610591565b73ffffffffffffffffffffffffffffffffffffffff16145b8061116a57506111698185610c5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111938261089f565b73ffffffffffffffffffffffffffffffffffffffff16146111e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e090612afc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611259576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112509061299c565b60405180910390fd5b611264838383611a9e565b61126f600082610fdc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112bf9190612d62565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113169190612c81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6113d7610fd4565b73ffffffffffffffffffffffffffffffffffffffff166113f5610b19565b73ffffffffffffffffffffffffffffffffffffffff161461144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290612adc565b60405180910390fd5b61145481611aa3565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561158c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611583906129bc565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161167d91906128ff565b60405180910390a3505050565b611695848484611173565b6116a184848484611af6565b6116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d79061293c565b60405180910390fd5b50505050565b60606116f182610f68565b611730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172790612a9c565b60405180910390fd5b600060066000848152602001908152602001600020805461175090612e4c565b80601f016020809104026020016040519081016040528092919081815260200182805461177c90612e4c565b80156117c95780601f1061179e576101008083540402835291602001916117c9565b820191906000526020600020905b8154815290600101906020018083116117ac57829003601f168201915b5050505050905060006117da611c8d565b90506000815114156117f0578192505050611833565b60008251111561182557808260405160200161180d92919061284b565b60405160208183030381529060405292505050611833565b61182e84611ca4565b925050505b919050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390612a7c565b60405180910390fd5b6118d581610f68565b15611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c9061297c565b60405180910390fd5b61192160008383611a9e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119719190612c81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611a3382610f68565b611a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6990612a5c565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611a99929190611fd0565b505050565b505050565b611aac81611d4b565b6000600660008381526020019081526020016000208054611acc90612e4c565b905014611af357600660008281526020019081526020016000206000611af29190612056565b5b50565b6000611b178473ffffffffffffffffffffffffffffffffffffffff16611e5c565b15611c80578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b40610fd4565b8786866040518563ffffffff1660e01b8152600401611b62949392919061288a565b602060405180830381600087803b158015611b7c57600080fd5b505af1925050508015611bad57506040513d601f19601f82011682018060405250810190611baa9190612448565b60015b611c30573d8060008114611bdd576040519150601f19603f3d011682016040523d82523d6000602084013e611be2565b606091505b50600081511415611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f9061293c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c85565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611caf82610f68565b611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590612b1c565b60405180910390fd5b6000611cf8611c8d565b90506000815111611d185760405180602001604052806000815250611d43565b80611d2284611e6f565b604051602001611d3392919061284b565b6040516020818303038152906040525b915050919050565b6000611d568261089f565b9050611d6481600084611a9e565b611d6f600083610fdc565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbf9190612d62565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415611eb7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fcb565b600082905060005b60008214611ee9578080611ed290612eaf565b915050600a82611ee29190612cd7565b9150611ebf565b60008167ffffffffffffffff811115611f0557611f04612fe5565b5b6040519080825280601f01601f191660200182016040528015611f375781602001600182028036833780820191505090505b5090505b60008514611fc457600182611f509190612d62565b9150600a85611f5f9190612ef8565b6030611f6b9190612c81565b60f81b818381518110611f8157611f80612fb6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fbd9190612cd7565b9450611f3b565b8093505050505b919050565b828054611fdc90612e4c565b90600052602060002090601f016020900481019282611ffe5760008555612045565b82601f1061201757805160ff1916838001178555612045565b82800160010185558215612045579182015b82811115612044578251825591602001919060010190612029565b5b5090506120529190612096565b5090565b50805461206290612e4c565b6000825580601f106120745750612093565b601f0160209004906000526020600020908101906120929190612096565b5b50565b5b808211156120af576000816000905550600101612097565b5090565b60006120c66120c184612bdc565b612bb7565b9050828152602081018484840111156120e2576120e1613019565b5b6120ed848285612e0a565b509392505050565b600061210861210384612c0d565b612bb7565b90508281526020810184848401111561212457612123613019565b5b61212f848285612e0a565b509392505050565b6000813590506121468161357e565b92915050565b60008135905061215b81613595565b92915050565b600081359050612170816135ac565b92915050565b600081519050612185816135ac565b92915050565b600082601f8301126121a05761219f613014565b5b81356121b08482602086016120b3565b91505092915050565b600082601f8301126121ce576121cd613014565b5b81356121de8482602086016120f5565b91505092915050565b6000813590506121f6816135c3565b92915050565b60006020828403121561221257612211613023565b5b600061222084828501612137565b91505092915050565b600080604083850312156122405761223f613023565b5b600061224e85828601612137565b925050602061225f85828601612137565b9150509250929050565b60008060006060848603121561228257612281613023565b5b600061229086828701612137565b93505060206122a186828701612137565b92505060406122b2868287016121e7565b9150509250925092565b600080600080608085870312156122d6576122d5613023565b5b60006122e487828801612137565b94505060206122f587828801612137565b9350506040612306878288016121e7565b925050606085013567ffffffffffffffff8111156123275761232661301e565b5b6123338782880161218b565b91505092959194509250565b6000806040838503121561235657612355613023565b5b600061236485828601612137565b92505060206123758582860161214c565b9150509250929050565b6000806040838503121561239657612395613023565b5b60006123a485828601612137565b925050602083013567ffffffffffffffff8111156123c5576123c461301e565b5b6123d1858286016121b9565b9150509250929050565b600080604083850312156123f2576123f1613023565b5b600061240085828601612137565b9250506020612411858286016121e7565b9150509250929050565b60006020828403121561243157612430613023565b5b600061243f84828501612161565b91505092915050565b60006020828403121561245e5761245d613023565b5b600061246c84828501612176565b91505092915050565b60006020828403121561248b5761248a613023565b5b6000612499848285016121e7565b91505092915050565b600080604083850312156124b9576124b8613023565b5b60006124c7858286016121e7565b92505060206124d8858286016121e7565b9150509250929050565b6124eb81612d96565b82525050565b6124fa81612da8565b82525050565b600061250b82612c3e565b6125158185612c54565b9350612525818560208601612e19565b61252e81613028565b840191505092915050565b600061254482612c49565b61254e8185612c65565b935061255e818560208601612e19565b61256781613028565b840191505092915050565b600061257d82612c49565b6125878185612c76565b9350612597818560208601612e19565b80840191505092915050565b60006125b0603283612c65565b91506125bb82613039565b604082019050919050565b60006125d3602683612c65565b91506125de82613088565b604082019050919050565b60006125f6601c83612c65565b9150612601826130d7565b602082019050919050565b6000612619602483612c65565b915061262482613100565b604082019050919050565b600061263c601983612c65565b91506126478261314f565b602082019050919050565b600061265f602c83612c65565b915061266a82613178565b604082019050919050565b6000612682603883612c65565b915061268d826131c7565b604082019050919050565b60006126a5602a83612c65565b91506126b082613216565b604082019050919050565b60006126c8602983612c65565b91506126d382613265565b604082019050919050565b60006126eb602e83612c65565b91506126f6826132b4565b604082019050919050565b600061270e602083612c65565b915061271982613303565b602082019050919050565b6000612731603183612c65565b915061273c8261332c565b604082019050919050565b6000612754602c83612c65565b915061275f8261337b565b604082019050919050565b6000612777602083612c65565b9150612782826133ca565b602082019050919050565b600061279a602983612c65565b91506127a5826133f3565b604082019050919050565b60006127bd602f83612c65565b91506127c882613442565b604082019050919050565b60006127e0602183612c65565b91506127eb82613491565b604082019050919050565b6000612803603183612c65565b915061280e826134e0565b604082019050919050565b6000612826603083612c65565b91506128318261352f565b604082019050919050565b61284581612e00565b82525050565b60006128578285612572565b91506128638284612572565b91508190509392505050565b600060208201905061288460008301846124e2565b92915050565b600060808201905061289f60008301876124e2565b6128ac60208301866124e2565b6128b9604083018561283c565b81810360608301526128cb8184612500565b905095945050505050565b60006040820190506128eb60008301856124e2565b6128f8602083018461283c565b9392505050565b600060208201905061291460008301846124f1565b92915050565b600060208201905081810360008301526129348184612539565b905092915050565b60006020820190508181036000830152612955816125a3565b9050919050565b60006020820190508181036000830152612975816125c6565b9050919050565b60006020820190508181036000830152612995816125e9565b9050919050565b600060208201905081810360008301526129b58161260c565b9050919050565b600060208201905081810360008301526129d58161262f565b9050919050565b600060208201905081810360008301526129f581612652565b9050919050565b60006020820190508181036000830152612a1581612675565b9050919050565b60006020820190508181036000830152612a3581612698565b9050919050565b60006020820190508181036000830152612a55816126bb565b9050919050565b60006020820190508181036000830152612a75816126de565b9050919050565b60006020820190508181036000830152612a9581612701565b9050919050565b60006020820190508181036000830152612ab581612724565b9050919050565b60006020820190508181036000830152612ad581612747565b9050919050565b60006020820190508181036000830152612af58161276a565b9050919050565b60006020820190508181036000830152612b158161278d565b9050919050565b60006020820190508181036000830152612b35816127b0565b9050919050565b60006020820190508181036000830152612b55816127d3565b9050919050565b60006020820190508181036000830152612b75816127f6565b9050919050565b60006020820190508181036000830152612b9581612819565b9050919050565b6000602082019050612bb1600083018461283c565b92915050565b6000612bc1612bd2565b9050612bcd8282612e7e565b919050565b6000604051905090565b600067ffffffffffffffff821115612bf757612bf6612fe5565b5b612c0082613028565b9050602081019050919050565b600067ffffffffffffffff821115612c2857612c27612fe5565b5b612c3182613028565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c8c82612e00565b9150612c9783612e00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ccc57612ccb612f29565b5b828201905092915050565b6000612ce282612e00565b9150612ced83612e00565b925082612cfd57612cfc612f58565b5b828204905092915050565b6000612d1382612e00565b9150612d1e83612e00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d5757612d56612f29565b5b828202905092915050565b6000612d6d82612e00565b9150612d7883612e00565b925082821015612d8b57612d8a612f29565b5b828203905092915050565b6000612da182612de0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612e37578082015181840152602081019050612e1c565b83811115612e46576000848401525b50505050565b60006002820490506001821680612e6457607f821691505b60208210811415612e7857612e77612f87565b5b50919050565b612e8782613028565b810181811067ffffffffffffffff82111715612ea657612ea5612fe5565b5b80604052505050565b6000612eba82612e00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612eed57612eec612f29565b5b600182019050919050565b6000612f0382612e00565b9150612f0e83612e00565b925082612f1e57612f1d612f58565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61358781612d96565b811461359257600080fd5b50565b61359e81612da8565b81146135a957600080fd5b50565b6135b581612db4565b81146135c057600080fd5b50565b6135cc81612e00565b81146135d757600080fd5b5056fea2646970667358221220bb3c5f7cadbef05394f1637622e4399ec03de7c18fa629582c39ec7ffbd8a9ad64736f6c63430008070033

Deployed Bytecode Sourcemap

42307:1679:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26713:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27658:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29217:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28740:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29967:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43413:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;30377:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41640:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42485:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27352:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43258:84;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27082:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6834:103;;;:::i;:::-;;6183:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27827:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29510:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30633:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43817:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29736:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42778:421;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7092:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26713:305;26815:4;26867:25;26852:40;;;:11;:40;;;;:105;;;;26924:33;26909:48;;;:11;:48;;;;26852:105;:158;;;;26974:36;26998:11;26974:23;:36::i;:::-;26852:158;26832:178;;26713:305;;;:::o;27658:100::-;27712:13;27745:5;27738:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27658:100;:::o;29217:221::-;29293:7;29321:16;29329:7;29321;:16::i;:::-;29313:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29406:15;:24;29422:7;29406:24;;;;;;;;;;;;;;;;;;;;;29399:31;;29217:221;;;:::o;28740:411::-;28821:13;28837:23;28852:7;28837:14;:23::i;:::-;28821:39;;28885:5;28879:11;;:2;:11;;;;28871:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28979:5;28963:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28988:37;29005:5;29012:12;:10;:12::i;:::-;28988:16;:37::i;:::-;28963:62;28941:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29122:21;29131:2;29135:7;29122:8;:21::i;:::-;28810:341;28740:411;;:::o;29967:339::-;30162:41;30181:12;:10;:12::i;:::-;30195:7;30162:18;:41::i;:::-;30154:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30270:28;30280:4;30286:2;30290:7;30270:9;:28::i;:::-;29967:339;;;:::o;43413:253::-;43509:16;43527:21;43561:14;43599:5;43592:3;43579:10;:16;;;;:::i;:::-;43578:26;;;;:::i;:::-;43561:43;;43623:16;:26;43640:8;43623:26;;;;;;;;;;;;;;;;;;;;;43651:6;43615:43;;;;;43413:253;;;;;:::o;30377:185::-;30515:39;30532:4;30538:2;30542:7;30515:39;;;;;;;;;;;;:16;:39::i;:::-;30377:185;;;:::o;41640:245::-;41758:41;41777:12;:10;:12::i;:::-;41791:7;41758:18;:41::i;:::-;41750:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;41863:14;41869:7;41863:5;:14::i;:::-;41640:245;:::o;42485:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;27352:239::-;27424:7;27444:13;27460:7;:16;27468:7;27460:16;;;;;;;;;;;;;;;;;;;;;27444:32;;27512:1;27495:19;;:5;:19;;;;27487:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27578:5;27571:12;;;27352:239;;;:::o;43258:84::-;6414:12;:10;:12::i;:::-;6403:23;;:7;:5;:7::i;:::-;:23;;;6395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43321:13:::1;43326:7;43321:4;:13::i;:::-;43258:84:::0;:::o;27082:208::-;27154:7;27199:1;27182:19;;:5;:19;;;;27174:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27266:9;:16;27276:5;27266:16;;;;;;;;;;;;;;;;27259:23;;27082:208;;;:::o;6834:103::-;6414:12;:10;:12::i;:::-;6403:23;;:7;:5;:7::i;:::-;:23;;;6395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6899:30:::1;6926:1;6899:18;:30::i;:::-;6834:103::o:0;6183:87::-;6229:7;6256:6;;;;;;;;;;;6249:13;;6183:87;:::o;27827:104::-;27883:13;27916:7;27909:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27827:104;:::o;29510:155::-;29605:52;29624:12;:10;:12::i;:::-;29638:8;29648;29605:18;:52::i;:::-;29510:155;;:::o;30633:328::-;30808:41;30827:12;:10;:12::i;:::-;30841:7;30808:18;:41::i;:::-;30800:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30914:39;30928:4;30934:2;30938:7;30947:5;30914:13;:39::i;:::-;30633:328;;;;:::o;43817:166::-;43916:13;43949:23;43964:7;43949:14;:23::i;:::-;43942:30;;43817:166;;;:::o;29736:164::-;29833:4;29857:18;:25;29876:5;29857:25;;;;;;;;;;;;;;;:35;29883:8;29857:35;;;;;;;;;;;;;;;;;;;;;;;;;29850:42;;29736:164;;;;:::o;42778:421::-;6414:12;:10;:12::i;:::-;6403:23;;:7;:5;:7::i;:::-;:23;;;6395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42860:21:::1;:9;:19;:21::i;:::-;42892:16;42911:19;:9;:17;:19::i;:::-;42892:38;;42941:22;42947:5;42954:8;42941:5;:22::i;:::-;43118:27;43131:8;43141:3;43118:12;:27::i;:::-;42259:42;43156:16;:26;43173:8;43156:26;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;42849:350;42778:421:::0;;:::o;7092:201::-;6414:12;:10;:12::i;:::-;6403:23;;:7;:5;:7::i;:::-;:23;;;6395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7201:1:::1;7181:22;;:8;:22;;;;7173:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7257:28;7276:8;7257:18;:28::i;:::-;7092:201:::0;:::o;19524:157::-;19609:4;19648:25;19633:40;;;:11;:40;;;;19626:47;;19524:157;;;:::o;32471:127::-;32536:4;32588:1;32560:30;;:7;:16;32568:7;32560:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32553:37;;32471:127;;;:::o;4909:98::-;4962:7;4989:10;4982:17;;4909:98;:::o;36453:174::-;36555:2;36528:15;:24;36544:7;36528:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36611:7;36607:2;36573:46;;36582:23;36597:7;36582:14;:23::i;:::-;36573:46;;;;;;;;;;;;36453:174;;:::o;32765:348::-;32858:4;32883:16;32891:7;32883;:16::i;:::-;32875:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32959:13;32975:23;32990:7;32975:14;:23::i;:::-;32959:39;;33028:5;33017:16;;:7;:16;;;:51;;;;33061:7;33037:31;;:20;33049:7;33037:11;:20::i;:::-;:31;;;33017:51;:87;;;;33072:32;33089:5;33096:7;33072:16;:32::i;:::-;33017:87;33009:96;;;32765:348;;;;:::o;35757:578::-;35916:4;35889:31;;:23;35904:7;35889:14;:23::i;:::-;:31;;;35881:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35999:1;35985:16;;:2;:16;;;;35977:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36055:39;36076:4;36082:2;36086:7;36055:20;:39::i;:::-;36159:29;36176:1;36180:7;36159:8;:29::i;:::-;36220:1;36201:9;:15;36211:4;36201:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36249:1;36232:9;:13;36242:2;36232:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36280:2;36261:7;:16;36269:7;36261:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36319:7;36315:2;36300:27;;36309:4;36300:27;;;;;;;;;;;;35757:578;;;:::o;43678:133::-;6414:12;:10;:12::i;:::-;6403:23;;:7;:5;:7::i;:::-;:23;;;6395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43783:20:::1;43795:7;43783:11;:20::i;:::-;43678:133:::0;:::o;7453:191::-;7527:16;7546:6;;;;;;;;;;;7527:25;;7572:8;7563:6;;:17;;;;;;;;;;;;;;;;;;7627:8;7596:40;;7617:8;7596:40;;;;;;;;;;;;7516:128;7453:191;:::o;36769:315::-;36924:8;36915:17;;:5;:17;;;;36907:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37011:8;36973:18;:25;36992:5;36973:25;;;;;;;;;;;;;;;:35;36999:8;36973:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37057:8;37035:41;;37050:5;37035:41;;;37067:8;37035:41;;;;;;:::i;:::-;;;;;;;;36769:315;;;:::o;31843:::-;32000:28;32010:4;32016:2;32020:7;32000:9;:28::i;:::-;32047:48;32070:4;32076:2;32080:7;32089:5;32047:22;:48::i;:::-;32039:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31843:315;;;;:::o;39636:679::-;39709:13;39743:16;39751:7;39743;:16::i;:::-;39735:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;39826:23;39852:10;:19;39863:7;39852:19;;;;;;;;;;;39826:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39882:18;39903:10;:8;:10::i;:::-;39882:31;;40011:1;39995:4;39989:18;:23;39985:72;;;40036:9;40029:16;;;;;;39985:72;40187:1;40167:9;40161:23;:27;40157:108;;;40236:4;40242:9;40219:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40205:48;;;;;;40157:108;40284:23;40299:7;40284:14;:23::i;:::-;40277:30;;;;39636:679;;;;:::o;1026:127::-;1133:1;1115:7;:14;;;:19;;;;;;;;;;;1026:127;:::o;904:114::-;969:7;996;:14;;;989:21;;904:114;;;:::o;34449:382::-;34543:1;34529:16;;:2;:16;;;;34521:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34602:16;34610:7;34602;:16::i;:::-;34601:17;34593:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34664:45;34693:1;34697:2;34701:7;34664:20;:45::i;:::-;34739:1;34722:9;:13;34732:2;34722:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34770:2;34751:7;:16;34759:7;34751:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34815:7;34811:2;34790:33;;34807:1;34790:33;;;;;;;;;;;;34449:382;;:::o;40471:217::-;40571:16;40579:7;40571;:16::i;:::-;40563:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;40671:9;40649:10;:19;40660:7;40649:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;40471:217;;:::o;39020:126::-;;;;:::o;40917:206::-;40986:20;40998:7;40986:11;:20::i;:::-;41060:1;41029:10;:19;41040:7;41029:19;;;;;;;;;;;41023:33;;;;;:::i;:::-;;;:38;41019:97;;41085:10;:19;41096:7;41085:19;;;;;;;;;;;;41078:26;;;;:::i;:::-;41019:97;40917:206;:::o;37649:799::-;37804:4;37825:15;:2;:13;;;:15::i;:::-;37821:620;;;37877:2;37861:36;;;37898:12;:10;:12::i;:::-;37912:4;37918:7;37927:5;37861:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37857:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38120:1;38103:6;:13;:18;38099:272;;;38146:60;;;;;;;;;;:::i;:::-;;;;;;;;38099:272;38321:6;38315:13;38306:6;38302:2;38298:15;38291:38;37857:529;37994:41;;;37984:51;;;:6;:51;;;;37977:58;;;;;37821:620;38425:4;38418:11;;37649:799;;;;;;;:::o;28584:94::-;28635:13;28661:9;;;;;;;;;;;;;;28584:94;:::o;28002:334::-;28075:13;28109:16;28117:7;28109;:16::i;:::-;28101:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28190:21;28214:10;:8;:10::i;:::-;28190:34;;28266:1;28248:7;28242:21;:25;:86;;;;;;;;;;;;;;;;;28294:7;28303:18;:7;:16;:18::i;:::-;28277:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28242:86;28235:93;;;28002:334;;;:::o;35060:360::-;35120:13;35136:23;35151:7;35136:14;:23::i;:::-;35120:39;;35172:48;35193:5;35208:1;35212:7;35172:20;:48::i;:::-;35261:29;35278:1;35282:7;35261:8;:29::i;:::-;35323:1;35303:9;:16;35313:5;35303:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;35342:7;:16;35350:7;35342:16;;;;;;;;;;;;35335:23;;;;;;;;;;;35404:7;35400:1;35376:36;;35385:5;35376:36;;;;;;;;;;;;35109:311;35060:360;:::o;8470:387::-;8530:4;8738:12;8805:7;8793:20;8785:28;;8848:1;8841:4;:8;8834:15;;;8470:387;;;:::o;2472:723::-;2528:13;2758:1;2749:5;:10;2745:53;;;2776:10;;;;;;;;;;;;;;;;;;;;;2745:53;2808:12;2823:5;2808:20;;2839:14;2864:78;2879:1;2871:4;:9;2864:78;;2897:8;;;;;:::i;:::-;;;;2928:2;2920:10;;;;;:::i;:::-;;;2864:78;;;2952:19;2984:6;2974:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2952:39;;3002:154;3018:1;3009:5;:10;3002:154;;3046:1;3036:11;;;;;:::i;:::-;;;3113:2;3105:5;:10;;;;:::i;:::-;3092:2;:24;;;;:::i;:::-;3079:39;;3062:6;3069;3062:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3142:2;3133:11;;;;;:::i;:::-;;;3002:154;;;3180:6;3166:21;;;;;2472:723;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:654::-;5218:6;5226;5275:2;5263:9;5254:7;5250:23;5246:32;5243:119;;;5281:79;;:::i;:::-;5243:119;5401:1;5426:53;5471:7;5462:6;5451:9;5447:22;5426:53;:::i;:::-;5416:63;;5372:117;5556:2;5545:9;5541:18;5528:32;5587:18;5579:6;5576:30;5573:117;;;5609:79;;:::i;:::-;5573:117;5714:63;5769:7;5760:6;5749:9;5745:22;5714:63;:::i;:::-;5704:73;;5499:288;5140:654;;;;;:::o;5800:474::-;5868:6;5876;5925:2;5913:9;5904:7;5900:23;5896:32;5893:119;;;5931:79;;:::i;:::-;5893:119;6051:1;6076:53;6121:7;6112:6;6101:9;6097:22;6076:53;:::i;:::-;6066:63;;6022:117;6178:2;6204:53;6249:7;6240:6;6229:9;6225:22;6204:53;:::i;:::-;6194:63;;6149:118;5800:474;;;;;:::o;6280:327::-;6338:6;6387:2;6375:9;6366:7;6362:23;6358:32;6355:119;;;6393:79;;:::i;:::-;6355:119;6513:1;6538:52;6582:7;6573:6;6562:9;6558:22;6538:52;:::i;:::-;6528:62;;6484:116;6280:327;;;;:::o;6613:349::-;6682:6;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:63;6937:7;6928:6;6917:9;6913:22;6882:63;:::i;:::-;6872:73;;6828:127;6613:349;;;;:::o;6968:329::-;7027:6;7076:2;7064:9;7055:7;7051:23;7047:32;7044:119;;;7082:79;;:::i;:::-;7044:119;7202:1;7227:53;7272:7;7263:6;7252:9;7248:22;7227:53;:::i;:::-;7217:63;;7173:117;6968:329;;;;:::o;7303:474::-;7371:6;7379;7428:2;7416:9;7407:7;7403:23;7399:32;7396:119;;;7434:79;;:::i;:::-;7396:119;7554:1;7579:53;7624:7;7615:6;7604:9;7600:22;7579:53;:::i;:::-;7569:63;;7525:117;7681:2;7707:53;7752:7;7743:6;7732:9;7728:22;7707:53;:::i;:::-;7697:63;;7652:118;7303:474;;;;;:::o;7783:118::-;7870:24;7888:5;7870:24;:::i;:::-;7865:3;7858:37;7783:118;;:::o;7907:109::-;7988:21;8003:5;7988:21;:::i;:::-;7983:3;7976:34;7907:109;;:::o;8022:360::-;8108:3;8136:38;8168:5;8136:38;:::i;:::-;8190:70;8253:6;8248:3;8190:70;:::i;:::-;8183:77;;8269:52;8314:6;8309:3;8302:4;8295:5;8291:16;8269:52;:::i;:::-;8346:29;8368:6;8346:29;:::i;:::-;8341:3;8337:39;8330:46;;8112:270;8022:360;;;;:::o;8388:364::-;8476:3;8504:39;8537:5;8504:39;:::i;:::-;8559:71;8623:6;8618:3;8559:71;:::i;:::-;8552:78;;8639:52;8684:6;8679:3;8672:4;8665:5;8661:16;8639:52;:::i;:::-;8716:29;8738:6;8716:29;:::i;:::-;8711:3;8707:39;8700:46;;8480:272;8388:364;;;;:::o;8758:377::-;8864:3;8892:39;8925:5;8892:39;:::i;:::-;8947:89;9029:6;9024:3;8947:89;:::i;:::-;8940:96;;9045:52;9090:6;9085:3;9078:4;9071:5;9067:16;9045:52;:::i;:::-;9122:6;9117:3;9113:16;9106:23;;8868:267;8758:377;;;;:::o;9141:366::-;9283:3;9304:67;9368:2;9363:3;9304:67;:::i;:::-;9297:74;;9380:93;9469:3;9380:93;:::i;:::-;9498:2;9493:3;9489:12;9482:19;;9141:366;;;:::o;9513:::-;9655:3;9676:67;9740:2;9735:3;9676:67;:::i;:::-;9669:74;;9752:93;9841:3;9752:93;:::i;:::-;9870:2;9865:3;9861:12;9854:19;;9513:366;;;:::o;9885:::-;10027:3;10048:67;10112:2;10107:3;10048:67;:::i;:::-;10041:74;;10124:93;10213:3;10124:93;:::i;:::-;10242:2;10237:3;10233:12;10226:19;;9885:366;;;:::o;10257:::-;10399:3;10420:67;10484:2;10479:3;10420:67;:::i;:::-;10413:74;;10496:93;10585:3;10496:93;:::i;:::-;10614:2;10609:3;10605:12;10598:19;;10257:366;;;:::o;10629:::-;10771:3;10792:67;10856:2;10851:3;10792:67;:::i;:::-;10785:74;;10868:93;10957:3;10868:93;:::i;:::-;10986:2;10981:3;10977:12;10970:19;;10629:366;;;:::o;11001:::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11001:366;;;:::o;11373:::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11373:366;;;:::o;11745:::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11745:366;;;:::o;12117:::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12117:366;;;:::o;12489:::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12489:366;;;:::o;12861:::-;13003:3;13024:67;13088:2;13083:3;13024:67;:::i;:::-;13017:74;;13100:93;13189:3;13100:93;:::i;:::-;13218:2;13213:3;13209:12;13202:19;;12861:366;;;:::o;13233:::-;13375:3;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13472:93;13561:3;13472:93;:::i;:::-;13590:2;13585:3;13581:12;13574:19;;13233:366;;;:::o;13605:::-;13747:3;13768:67;13832:2;13827:3;13768:67;:::i;:::-;13761:74;;13844:93;13933:3;13844:93;:::i;:::-;13962:2;13957:3;13953:12;13946:19;;13605:366;;;:::o;13977:::-;14119:3;14140:67;14204:2;14199:3;14140:67;:::i;:::-;14133:74;;14216:93;14305:3;14216:93;:::i;:::-;14334:2;14329:3;14325:12;14318:19;;13977:366;;;:::o;14349:::-;14491:3;14512:67;14576:2;14571:3;14512:67;:::i;:::-;14505:74;;14588:93;14677:3;14588:93;:::i;:::-;14706:2;14701:3;14697:12;14690:19;;14349:366;;;:::o;14721:::-;14863:3;14884:67;14948:2;14943:3;14884:67;:::i;:::-;14877:74;;14960:93;15049:3;14960:93;:::i;:::-;15078:2;15073:3;15069:12;15062:19;;14721:366;;;:::o;15093:::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15093:366;;;:::o;15465:::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15465:366;;;:::o;15837:::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15837:366;;;:::o;16209:118::-;16296:24;16314:5;16296:24;:::i;:::-;16291:3;16284:37;16209:118;;:::o;16333:435::-;16513:3;16535:95;16626:3;16617:6;16535:95;:::i;:::-;16528:102;;16647:95;16738:3;16729:6;16647:95;:::i;:::-;16640:102;;16759:3;16752:10;;16333:435;;;;;:::o;16774:222::-;16867:4;16905:2;16894:9;16890:18;16882:26;;16918:71;16986:1;16975:9;16971:17;16962:6;16918:71;:::i;:::-;16774:222;;;;:::o;17002:640::-;17197:4;17235:3;17224:9;17220:19;17212:27;;17249:71;17317:1;17306:9;17302:17;17293:6;17249:71;:::i;:::-;17330:72;17398:2;17387:9;17383:18;17374:6;17330:72;:::i;:::-;17412;17480:2;17469:9;17465:18;17456:6;17412:72;:::i;:::-;17531:9;17525:4;17521:20;17516:2;17505:9;17501:18;17494:48;17559:76;17630:4;17621:6;17559:76;:::i;:::-;17551:84;;17002:640;;;;;;;:::o;17648:332::-;17769:4;17807:2;17796:9;17792:18;17784:26;;17820:71;17888:1;17877:9;17873:17;17864:6;17820:71;:::i;:::-;17901:72;17969:2;17958:9;17954:18;17945:6;17901:72;:::i;:::-;17648:332;;;;;:::o;17986:210::-;18073:4;18111:2;18100:9;18096:18;18088:26;;18124:65;18186:1;18175:9;18171:17;18162:6;18124:65;:::i;:::-;17986:210;;;;:::o;18202:313::-;18315:4;18353:2;18342:9;18338:18;18330:26;;18402:9;18396:4;18392:20;18388:1;18377:9;18373:17;18366:47;18430:78;18503:4;18494:6;18430:78;:::i;:::-;18422:86;;18202:313;;;;:::o;18521:419::-;18687:4;18725:2;18714:9;18710:18;18702:26;;18774:9;18768:4;18764:20;18760:1;18749:9;18745:17;18738:47;18802:131;18928:4;18802:131;:::i;:::-;18794:139;;18521:419;;;:::o;18946:::-;19112:4;19150:2;19139:9;19135:18;19127:26;;19199:9;19193:4;19189:20;19185:1;19174:9;19170:17;19163:47;19227:131;19353:4;19227:131;:::i;:::-;19219:139;;18946:419;;;:::o;19371:::-;19537:4;19575:2;19564:9;19560:18;19552:26;;19624:9;19618:4;19614:20;19610:1;19599:9;19595:17;19588:47;19652:131;19778:4;19652:131;:::i;:::-;19644:139;;19371:419;;;:::o;19796:::-;19962:4;20000:2;19989:9;19985:18;19977:26;;20049:9;20043:4;20039:20;20035:1;20024:9;20020:17;20013:47;20077:131;20203:4;20077:131;:::i;:::-;20069:139;;19796:419;;;:::o;20221:::-;20387:4;20425:2;20414:9;20410:18;20402:26;;20474:9;20468:4;20464:20;20460:1;20449:9;20445:17;20438:47;20502:131;20628:4;20502:131;:::i;:::-;20494:139;;20221:419;;;:::o;20646:::-;20812:4;20850:2;20839:9;20835:18;20827:26;;20899:9;20893:4;20889:20;20885:1;20874:9;20870:17;20863:47;20927:131;21053:4;20927:131;:::i;:::-;20919:139;;20646:419;;;:::o;21071:::-;21237:4;21275:2;21264:9;21260:18;21252:26;;21324:9;21318:4;21314:20;21310:1;21299:9;21295:17;21288:47;21352:131;21478:4;21352:131;:::i;:::-;21344:139;;21071:419;;;:::o;21496:::-;21662:4;21700:2;21689:9;21685:18;21677:26;;21749:9;21743:4;21739:20;21735:1;21724:9;21720:17;21713:47;21777:131;21903:4;21777:131;:::i;:::-;21769:139;;21496:419;;;:::o;21921:::-;22087:4;22125:2;22114:9;22110:18;22102:26;;22174:9;22168:4;22164:20;22160:1;22149:9;22145:17;22138:47;22202:131;22328:4;22202:131;:::i;:::-;22194:139;;21921:419;;;:::o;22346:::-;22512:4;22550:2;22539:9;22535:18;22527:26;;22599:9;22593:4;22589:20;22585:1;22574:9;22570:17;22563:47;22627:131;22753:4;22627:131;:::i;:::-;22619:139;;22346:419;;;:::o;22771:::-;22937:4;22975:2;22964:9;22960:18;22952:26;;23024:9;23018:4;23014:20;23010:1;22999:9;22995:17;22988:47;23052:131;23178:4;23052:131;:::i;:::-;23044:139;;22771:419;;;:::o;23196:::-;23362:4;23400:2;23389:9;23385:18;23377:26;;23449:9;23443:4;23439:20;23435:1;23424:9;23420:17;23413:47;23477:131;23603:4;23477:131;:::i;:::-;23469:139;;23196:419;;;:::o;23621:::-;23787:4;23825:2;23814:9;23810:18;23802:26;;23874:9;23868:4;23864:20;23860:1;23849:9;23845:17;23838:47;23902:131;24028:4;23902:131;:::i;:::-;23894:139;;23621:419;;;:::o;24046:::-;24212:4;24250:2;24239:9;24235:18;24227:26;;24299:9;24293:4;24289:20;24285:1;24274:9;24270:17;24263:47;24327:131;24453:4;24327:131;:::i;:::-;24319:139;;24046:419;;;:::o;24471:::-;24637:4;24675:2;24664:9;24660:18;24652:26;;24724:9;24718:4;24714:20;24710:1;24699:9;24695:17;24688:47;24752:131;24878:4;24752:131;:::i;:::-;24744:139;;24471:419;;;:::o;24896:::-;25062:4;25100:2;25089:9;25085:18;25077:26;;25149:9;25143:4;25139:20;25135:1;25124:9;25120:17;25113:47;25177:131;25303:4;25177:131;:::i;:::-;25169:139;;24896:419;;;:::o;25321:::-;25487:4;25525:2;25514:9;25510:18;25502:26;;25574:9;25568:4;25564:20;25560:1;25549:9;25545:17;25538:47;25602:131;25728:4;25602:131;:::i;:::-;25594:139;;25321:419;;;:::o;25746:::-;25912:4;25950:2;25939:9;25935:18;25927:26;;25999:9;25993:4;25989:20;25985:1;25974:9;25970:17;25963:47;26027:131;26153:4;26027:131;:::i;:::-;26019:139;;25746:419;;;:::o;26171:::-;26337:4;26375:2;26364:9;26360:18;26352:26;;26424:9;26418:4;26414:20;26410:1;26399:9;26395:17;26388:47;26452:131;26578:4;26452:131;:::i;:::-;26444:139;;26171:419;;;:::o;26596:222::-;26689:4;26727:2;26716:9;26712:18;26704:26;;26740:71;26808:1;26797:9;26793:17;26784:6;26740:71;:::i;:::-;26596:222;;;;:::o;26824:129::-;26858:6;26885:20;;:::i;:::-;26875:30;;26914:33;26942:4;26934:6;26914:33;:::i;:::-;26824:129;;;:::o;26959:75::-;26992:6;27025:2;27019:9;27009:19;;26959:75;:::o;27040:307::-;27101:4;27191:18;27183:6;27180:30;27177:56;;;27213:18;;:::i;:::-;27177:56;27251:29;27273:6;27251:29;:::i;:::-;27243:37;;27335:4;27329;27325:15;27317:23;;27040:307;;;:::o;27353:308::-;27415:4;27505:18;27497:6;27494:30;27491:56;;;27527:18;;:::i;:::-;27491:56;27565:29;27587:6;27565:29;:::i;:::-;27557:37;;27649:4;27643;27639:15;27631:23;;27353:308;;;:::o;27667:98::-;27718:6;27752:5;27746:12;27736:22;;27667:98;;;:::o;27771:99::-;27823:6;27857:5;27851:12;27841:22;;27771:99;;;:::o;27876:168::-;27959:11;27993:6;27988:3;27981:19;28033:4;28028:3;28024:14;28009:29;;27876:168;;;;:::o;28050:169::-;28134:11;28168:6;28163:3;28156:19;28208:4;28203:3;28199:14;28184:29;;28050:169;;;;:::o;28225:148::-;28327:11;28364:3;28349:18;;28225:148;;;;:::o;28379:305::-;28419:3;28438:20;28456:1;28438:20;:::i;:::-;28433:25;;28472:20;28490:1;28472:20;:::i;:::-;28467:25;;28626:1;28558:66;28554:74;28551:1;28548:81;28545:107;;;28632:18;;:::i;:::-;28545:107;28676:1;28673;28669:9;28662:16;;28379:305;;;;:::o;28690:185::-;28730:1;28747:20;28765:1;28747:20;:::i;:::-;28742:25;;28781:20;28799:1;28781:20;:::i;:::-;28776:25;;28820:1;28810:35;;28825:18;;:::i;:::-;28810:35;28867:1;28864;28860:9;28855:14;;28690:185;;;;:::o;28881:348::-;28921:7;28944:20;28962:1;28944:20;:::i;:::-;28939:25;;28978:20;28996:1;28978:20;:::i;:::-;28973:25;;29166:1;29098:66;29094:74;29091:1;29088:81;29083:1;29076:9;29069:17;29065:105;29062:131;;;29173:18;;:::i;:::-;29062:131;29221:1;29218;29214:9;29203:20;;28881:348;;;;:::o;29235:191::-;29275:4;29295:20;29313:1;29295:20;:::i;:::-;29290:25;;29329:20;29347:1;29329:20;:::i;:::-;29324:25;;29368:1;29365;29362:8;29359:34;;;29373:18;;:::i;:::-;29359:34;29418:1;29415;29411:9;29403:17;;29235:191;;;;:::o;29432:96::-;29469:7;29498:24;29516:5;29498:24;:::i;:::-;29487:35;;29432:96;;;:::o;29534:90::-;29568:7;29611:5;29604:13;29597:21;29586:32;;29534:90;;;:::o;29630:149::-;29666:7;29706:66;29699:5;29695:78;29684:89;;29630:149;;;:::o;29785:126::-;29822:7;29862:42;29855:5;29851:54;29840:65;;29785:126;;;:::o;29917:77::-;29954:7;29983:5;29972:16;;29917:77;;;:::o;30000:154::-;30084:6;30079:3;30074;30061:30;30146:1;30137:6;30132:3;30128:16;30121:27;30000:154;;;:::o;30160:307::-;30228:1;30238:113;30252:6;30249:1;30246:13;30238:113;;;30337:1;30332:3;30328:11;30322:18;30318:1;30313:3;30309:11;30302:39;30274:2;30271:1;30267:10;30262:15;;30238:113;;;30369:6;30366:1;30363:13;30360:101;;;30449:1;30440:6;30435:3;30431:16;30424:27;30360:101;30209:258;30160:307;;;:::o;30473:320::-;30517:6;30554:1;30548:4;30544:12;30534:22;;30601:1;30595:4;30591:12;30622:18;30612:81;;30678:4;30670:6;30666:17;30656:27;;30612:81;30740:2;30732:6;30729:14;30709:18;30706:38;30703:84;;;30759:18;;:::i;:::-;30703:84;30524:269;30473:320;;;:::o;30799:281::-;30882:27;30904:4;30882:27;:::i;:::-;30874:6;30870:40;31012:6;31000:10;30997:22;30976:18;30964:10;30961:34;30958:62;30955:88;;;31023:18;;:::i;:::-;30955:88;31063:10;31059:2;31052:22;30842:238;30799:281;;:::o;31086:233::-;31125:3;31148:24;31166:5;31148:24;:::i;:::-;31139:33;;31194:66;31187:5;31184:77;31181:103;;;31264:18;;:::i;:::-;31181:103;31311:1;31304:5;31300:13;31293:20;;31086:233;;;:::o;31325:176::-;31357:1;31374:20;31392:1;31374:20;:::i;:::-;31369:25;;31408:20;31426:1;31408:20;:::i;:::-;31403:25;;31447:1;31437:35;;31452:18;;:::i;:::-;31437:35;31493:1;31490;31486:9;31481:14;;31325:176;;;;:::o;31507:180::-;31555:77;31552:1;31545:88;31652:4;31649:1;31642:15;31676:4;31673:1;31666:15;31693:180;31741:77;31738:1;31731:88;31838:4;31835:1;31828:15;31862:4;31859:1;31852:15;31879:180;31927:77;31924:1;31917:88;32024:4;32021:1;32014:15;32048:4;32045:1;32038:15;32065:180;32113:77;32110:1;32103:88;32210:4;32207:1;32200:15;32234:4;32231:1;32224:15;32251:180;32299:77;32296:1;32289:88;32396:4;32393:1;32386:15;32420:4;32417:1;32410:15;32437:117;32546:1;32543;32536:12;32560:117;32669:1;32666;32659:12;32683:117;32792:1;32789;32782:12;32806:117;32915:1;32912;32905:12;32929:102;32970:6;33021:2;33017:7;33012:2;33005:5;33001:14;32997:28;32987:38;;32929:102;;;:::o;33037:237::-;33177:34;33173:1;33165:6;33161:14;33154:58;33246:20;33241:2;33233:6;33229:15;33222:45;33037:237;:::o;33280:225::-;33420:34;33416:1;33408:6;33404:14;33397:58;33489:8;33484:2;33476:6;33472:15;33465:33;33280:225;:::o;33511:178::-;33651:30;33647:1;33639:6;33635:14;33628:54;33511:178;:::o;33695:223::-;33835:34;33831:1;33823:6;33819:14;33812:58;33904:6;33899:2;33891:6;33887:15;33880:31;33695:223;:::o;33924:175::-;34064:27;34060:1;34052:6;34048:14;34041:51;33924:175;:::o;34105:231::-;34245:34;34241:1;34233:6;34229:14;34222:58;34314:14;34309:2;34301:6;34297:15;34290:39;34105:231;:::o;34342:243::-;34482:34;34478:1;34470:6;34466:14;34459:58;34551:26;34546:2;34538:6;34534:15;34527:51;34342:243;:::o;34591:229::-;34731:34;34727:1;34719:6;34715:14;34708:58;34800:12;34795:2;34787:6;34783:15;34776:37;34591:229;:::o;34826:228::-;34966:34;34962:1;34954:6;34950:14;34943:58;35035:11;35030:2;35022:6;35018:15;35011:36;34826:228;:::o;35060:233::-;35200:34;35196:1;35188:6;35184:14;35177:58;35269:16;35264:2;35256:6;35252:15;35245:41;35060:233;:::o;35299:182::-;35439:34;35435:1;35427:6;35423:14;35416:58;35299:182;:::o;35487:236::-;35627:34;35623:1;35615:6;35611:14;35604:58;35696:19;35691:2;35683:6;35679:15;35672:44;35487:236;:::o;35729:231::-;35869:34;35865:1;35857:6;35853:14;35846:58;35938:14;35933:2;35925:6;35921:15;35914:39;35729:231;:::o;35966:182::-;36106:34;36102:1;36094:6;36090:14;36083:58;35966:182;:::o;36154:228::-;36294:34;36290:1;36282:6;36278:14;36271:58;36363:11;36358:2;36350:6;36346:15;36339:36;36154:228;:::o;36388:234::-;36528:34;36524:1;36516:6;36512:14;36505:58;36597:17;36592:2;36584:6;36580:15;36573:42;36388:234;:::o;36628:220::-;36768:34;36764:1;36756:6;36752:14;36745:58;36837:3;36832:2;36824:6;36820:15;36813:28;36628:220;:::o;36854:236::-;36994:34;36990:1;36982:6;36978:14;36971:58;37063:19;37058:2;37050:6;37046:15;37039:44;36854:236;:::o;37096:235::-;37236:34;37232:1;37224:6;37220:14;37213:58;37305:18;37300:2;37292:6;37288:15;37281:43;37096:235;:::o;37337:122::-;37410:24;37428:5;37410:24;:::i;:::-;37403:5;37400:35;37390:63;;37449:1;37446;37439:12;37390:63;37337:122;:::o;37465:116::-;37535:21;37550:5;37535:21;:::i;:::-;37528:5;37525:32;37515:60;;37571:1;37568;37561:12;37515:60;37465:116;:::o;37587:120::-;37659:23;37676:5;37659:23;:::i;:::-;37652:5;37649:34;37639:62;;37697:1;37694;37687:12;37639:62;37587:120;:::o;37713:122::-;37786:24;37804:5;37786:24;:::i;:::-;37779:5;37776:35;37766:63;;37825:1;37822;37815:12;37766:63;37713:122;:::o

Swarm Source

ipfs://bb3c5f7cadbef05394f1637622e4399ec03de7c18fa629582c39ec7ffbd8a9ad
Loading...
Loading
[ 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.