ETH Price: $3,107.17 (+0.67%)

Token

PortraitBetaPass (PBP)
 

Overview

Max Total Supply

6,220 PBP

Holders

6,220

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
zihuo.eth
Balance
1 PBP
0xa973aba63bfa08f2a27e18807c25dadd4f3e4dce
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Portrait is a protocol that allows users to create and control decentralized, no-code websites for Web3.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PortraitBetaPass

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-28
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (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) {
        _requireMinted(tokenId);

        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 See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be 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), "ERC721: caller is not token owner nor approved");
        _burn(tokenId);
    }
}

// File: PortraitBetaPass.sol


pragma solidity ^0.8.4;








contract PortraitBetaPass is
    ERC721,
    ERC721Burnable,
    Ownable,
    Pausable,
    ERC721URIStorage
{
    using Counters for Counters.Counter;
    mapping(address => uint256) public nftVersion;
    Counters.Counter private _tokenIdCounter;
    event Attest(address indexed to, uint256 indexed tokenId);
    event Revoke(address indexed to, uint256 indexed tokenId);

    constructor() ERC721("PortraitBetaPass", "PBP") {}

    string public baseURL = "https://portrait-beta-nft-metadata.herokuapp.com";

    function setBaseURL(string memory _baseURL) public onlyOwner {
        baseURL = _baseURL;
    }

    function safeMint(bytes memory _signature, uint256 _nftVersion) public {
        require(balanceOf(msg.sender) == 0, "ERC721: only one token allowed");

        // require the message to be msg.sender and signed by the owner of the contract
        bytes memory _messagePrefix = "\x19Ethereum Signed Message:\n32";

        bytes32 _hashPrefix = keccak256(
            abi.encodePacked(msg.sender, _nftVersion)
        );

        bytes32 _message = keccak256(
            abi.encodePacked(_messagePrefix, _hashPrefix)
        );
        require(recover(_message, _signature) == owner(), "Invalid signature");
        uint256 tokenId = _tokenIdCounter.current();
        nftVersion[msg.sender] = _nftVersion;
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function recover(bytes32 _message, bytes memory _signature)
        private
        pure
        returns (address)
    {
        bytes32 _r;
        bytes32 _s;
        uint8 _v;
        if (_signature.length != 65) {
            return (address(0));
        }
        assembly {
            _r := mload(add(_signature, 32))
            _s := mload(add(_signature, 64))
            _v := byte(0, mload(add(_signature, 96)))
        }
        if (_v < 27) {
            _v += 27;
        }
        if (_v != 27 && _v != 28) {
            return (address(0));
        } else {
            return ecrecover(_message, _v, _r, _s);
        }
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        require(
            nftVersion[ownerOf(tokenId)] == 1 ||
                nftVersion[ownerOf(tokenId)] == 2,
            "Invalid NFT version"
        );

        return
            string(
                abi.encodePacked(
                    baseURL,
                    "/nft/metadata?version=",
                    Strings.toString(nftVersion[ownerOf(tokenId)]),
                    "&address=",
                    Strings.toHexString(ownerOf(tokenId))
                )
            );
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        require(
            from == address(msg.sender) ||
                from == address(0) ||
                msg.sender == owner(),
            "ERC721: transfer of token that is not own"
        );
        require(
            to == address(msg.sender) || to == address(0),
            "ERC721: transfer of token that is not own or burn"
        );
        require(!paused(), "ERC721Pausable: token transfer while paused");

        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        if (from == address(0)) {
            emit Attest(to, tokenId);
        } else if (to == address(0)) {
            emit Revoke(from, tokenId);
        }
    }

    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

    function revoke(uint256 tokenId) external onlyOwner {
        _burn(tokenId);
    }

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

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":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Attest","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"nftVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"_nftVersion","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURL","type":"string"}],"name":"setBaseURL","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060600160405280603081526020016200451360309139600a908051906020019062000035929190620001f3565b503480156200004357600080fd5b506040518060400160405280601081526020017f506f7274726169744265746150617373000000000000000000000000000000008152506040518060400160405280600381526020017f50425000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c8929190620001f3565b508060019080519060200190620000e1929190620001f3565b50505062000104620000f86200012560201b60201c565b6200012d60201b60201c565b6000600660146101000a81548160ff02191690831515021790555062000308565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020190620002a3565b90600052602060002090601f01602090048101928262000225576000855562000271565b82601f106200024057805160ff191683800117855562000271565b8280016001018555821562000271579182015b828111156200027057825182559160200191906001019062000253565b5b50905062000280919062000284565b5090565b5b808211156200029f57600081600090555060010162000285565b5090565b60006002820490506001821680620002bc57607f821691505b60208210811415620002d357620002d2620002d9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6141fb80620003186000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80636352211e116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd14610435578063e11ca59714610465578063e985e9c514610481578063f2fde38b146104b15761018e565b806395d89b41146103df578063a22cb465146103fd578063b88d4fde146104195761018e565b80636352211e1461031d5780636c65cb2a1461034d57806370a082311461037d578063715018a6146103ad5780638456cb59146103b75780638da5cb5b146103c15761018e565b806323b872dd1161014b57806342842e0e1161012557806342842e0e146102ab57806342966c68146102c757806349f2553a146102e35780635c975abb146102ff5761018e565b806323b872dd146102675780633f4ba83a1461028357806340c84b0e1461028d5761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806320c5429b1461024b575b600080fd5b6101ad60048036038101906101a89190612b48565b6104cd565b6040516101ba91906132c4565b60405180910390f35b6101cb6105af565b6040516101d89190613324565b60405180910390f35b6101fb60048036038101906101f69190612c47565b610641565b604051610208919061325d565b60405180910390f35b61022b60048036038101906102269190612b08565b610687565b005b61023561079f565b6040516102429190613626565b60405180910390f35b61026560048036038101906102609190612c47565b6107b0565b005b610281600480360381019061027c91906129f2565b6107c4565b005b61028b610824565b005b610295610836565b6040516102a29190613324565b60405180910390f35b6102c560048036038101906102c091906129f2565b6108c4565b005b6102e160048036038101906102dc9190612c47565b6108e4565b005b6102fd60048036038101906102f89190612bfe565b610940565b005b610307610962565b60405161031491906132c4565b60405180910390f35b61033760048036038101906103329190612c47565b610979565b604051610344919061325d565b60405180910390f35b61036760048036038101906103629190612985565b610a2b565b6040516103749190613626565b60405180910390f35b61039760048036038101906103929190612985565b610a43565b6040516103a49190613626565b60405180910390f35b6103b5610afb565b005b6103bf610b0f565b005b6103c9610b21565b6040516103d6919061325d565b60405180910390f35b6103e7610b4b565b6040516103f49190613324565b60405180910390f35b61041760048036038101906104129190612ac8565b610bdd565b005b610433600480360381019061042e9190612a45565b610bf3565b005b61044f600480360381019061044a9190612c47565b610c55565b60405161045c9190613324565b60405180910390f35b61047f600480360381019061047a9190612ba2565b610e06565b005b61049b600480360381019061049691906129b2565b610fd1565b6040516104a891906132c4565b60405180910390f35b6104cb60048036038101906104c69190612985565b611065565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105a857506105a7826110e9565b5b9050919050565b6060600080546105be9061396e565b80601f01602080910402602001604051908101604052809291908181526020018280546105ea9061396e565b80156106375780601f1061060c57610100808354040283529160200191610637565b820191906000526020600020905b81548152906001019060200180831161061a57829003601f168201915b5050505050905090565b600061064c82611153565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061069282610979565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa906135e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661072261119e565b73ffffffffffffffffffffffffffffffffffffffff16148061075157506107508161074b61119e565b610fd1565b5b610790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078790613526565b60405180910390fd5b61079a83836111a6565b505050565b60006107ab600961125f565b905090565b6107b861126d565b6107c1816112eb565b50565b6107d56107cf61119e565b826112f7565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b90613606565b60405180910390fd5b61081f83838361138c565b505050565b61082c61126d565b6108346115f3565b565b600a80546108439061396e565b80601f016020809104026020016040519081016040528092919081815260200182805461086f9061396e565b80156108bc5780601f10610891576101008083540402835291602001916108bc565b820191906000526020600020905b81548152906001019060200180831161089f57829003601f168201915b505050505081565b6108df83838360405180602001604052806000815250610bf3565b505050565b6108f56108ef61119e565b826112f7565b610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b90613606565b60405180910390fd5b61093d816112eb565b50565b61094861126d565b80600a908051906020019061095e929190612759565b5050565b6000600660149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a19906135c6565b60405180910390fd5b80915050919050565b60086020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab906134e6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b0361126d565b610b0d6000611656565b565b610b1761126d565b610b1f61171c565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b5a9061396e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b869061396e565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b5050505050905090565b610bef610be861119e565b838361177f565b5050565b610c04610bfe61119e565b836112f7565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90613606565b60405180910390fd5b610c4f848484846118ec565b50505050565b6060610c6082611948565b610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c96906135a6565b60405180910390fd5b600160086000610cae85610979565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480610d3c5750600260086000610cff85610979565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d72906133e6565b60405180910390fd5b600a610dcd60086000610d8d86610979565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119b4565b610dde610dd985610979565b611b15565b604051602001610df093929190613216565b6040516020818303038152906040529050919050565b6000610e1133610a43565b14610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613506565b60405180910390fd5b60006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060003383604051602001610ea09291906131c2565b60405160208183030381529060405280519060200120905060008282604051602001610ecd9291906131ee565b604051602081830303815290604052805190602001209050610eed610b21565b73ffffffffffffffffffffffffffffffffffffffff16610f0d8287611b42565b73ffffffffffffffffffffffffffffffffffffffff1614610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a906134a6565b60405180910390fd5b6000610f6f600961125f565b905084600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610fbf6009611c15565b610fc93382611c2b565b505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61106d61126d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d490613406565b60405180910390fd5b6110e681611656565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61115c81611948565b61119b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611192906135c6565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661121983610979565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b61127561119e565b73ffffffffffffffffffffffffffffffffffffffff16611293610b21565b73ffffffffffffffffffffffffffffffffffffffff16146112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090613566565b60405180910390fd5b565b6112f481611c49565b50565b60008061130383610979565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061134557506113448185610fd1565b5b8061138357508373ffffffffffffffffffffffffffffffffffffffff1661136b84610641565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113ac82610979565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613426565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613466565b60405180910390fd5b61147d838383611c9c565b6114886000826111a6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114d89190613843565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461152f919061372b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115ee838383611e7b565b505050565b6115fb611f79565b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61163f61119e565b60405161164c919061325d565b60405180910390a1565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611724611fc2565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861176861119e565b604051611775919061325d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590613486565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118df91906132c4565b60405180910390a3505050565b6118f784848461138c565b6119038484848461200c565b611942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611939906133c6565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008214156119fc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b10565b600082905060005b60008214611a2e578080611a17906139d1565b915050600a82611a2791906137b8565b9150611a04565b60008167ffffffffffffffff811115611a4a57611a49613b3f565b5b6040519080825280601f01601f191660200182016040528015611a7c5781602001600182028036833780820191505090505b5090505b60008514611b0957600182611a959190613843565b9150600a85611aa49190613a52565b6030611ab0919061372b565b60f81b818381518110611ac657611ac5613b10565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b0291906137b8565b9450611a80565b8093505050505b919050565b6060611b3b8273ffffffffffffffffffffffffffffffffffffffff16601460ff166121a3565b9050919050565b6000806000806041855114611b5d5760009350505050611c0f565b6020850151925060408501519150606085015160001a9050601b8160ff161015611b9157601b81611b8e9190613781565b90505b601b8160ff1614158015611ba95750601c8160ff1614155b15611bba5760009350505050611c0f565b60018682858560405160008152602001604052604051611bdd94939291906132df565b6020604051602081039080840390855afa158015611bff573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6001816000016000828254019250508190555050565b611c458282604051806020016040528060008152506123df565b5050565b611c528161243a565b6000600760008381526020019081526020016000208054611c729061396e565b905014611c9957600760008281526020019081526020016000206000611c9891906127df565b5b50565b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611d025750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80611d3f5750611d10610b21565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7590613586565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480611de45750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1a90613366565b60405180910390fd5b611e2b610962565b15611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290613386565b60405180910390fd5b611e76838383612557565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ef957808273ffffffffffffffffffffffffffffffffffffffff167fe9274a84b19e9428826de6bae8c48329354f8f0e73f771b97cae2d9dccd45a2760405160405180910390a3611f74565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f7357808373ffffffffffffffffffffffffffffffffffffffff167fec9ab91322523c899ede7830ec9bfc992b5981cdcc27b91162fb23de5791117b60405160405180910390a35b5b505050565b611f81610962565b611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb7906133a6565b60405180910390fd5b565b611fca610962565b1561200a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612001906134c6565b60405180910390fd5b565b600061202d8473ffffffffffffffffffffffffffffffffffffffff1661255c565b15612196578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261205661119e565b8786866040518563ffffffff1660e01b81526004016120789493929190613278565b602060405180830381600087803b15801561209257600080fd5b505af19250505080156120c357506040513d601f19601f820116820180604052508101906120c09190612b75565b60015b612146573d80600081146120f3576040519150601f19603f3d011682016040523d82523d6000602084013e6120f8565b606091505b5060008151141561213e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612135906133c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061219b565b600190505b949350505050565b6060600060028360026121b691906137e9565b6121c0919061372b565b67ffffffffffffffff8111156121d9576121d8613b3f565b5b6040519080825280601f01601f19166020018201604052801561220b5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061224357612242613b10565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106122a7576122a6613b10565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122e791906137e9565b6122f1919061372b565b90505b6001811115612391577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061233357612332613b10565b5b1a60f81b82828151811061234a57612349613b10565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061238a90613944565b90506122f4565b50600084146123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90613346565b60405180910390fd5b8091505092915050565b6123e9838361257f565b6123f6600084848461200c565b612435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c906133c6565b60405180910390fd5b505050565b600061244582610979565b905061245381600084611c9c565b61245e6000836111a6565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ae9190613843565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461255381600084611e7b565b5050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e690613546565b60405180910390fd5b6125f881611948565b15612638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262f90613446565b60405180910390fd5b61264460008383611c9c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612694919061372b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461275560008383611e7b565b5050565b8280546127659061396e565b90600052602060002090601f01602090048101928261278757600085556127ce565b82601f106127a057805160ff19168380011785556127ce565b828001600101855582156127ce579182015b828111156127cd5782518255916020019190600101906127b2565b5b5090506127db919061281f565b5090565b5080546127eb9061396e565b6000825580601f106127fd575061281c565b601f01602090049060005260206000209081019061281b919061281f565b5b50565b5b80821115612838576000816000905550600101612820565b5090565b600061284f61284a84613666565b613641565b90508281526020810184848401111561286b5761286a613b73565b5b612876848285613902565b509392505050565b600061289161288c84613697565b613641565b9050828152602081018484840111156128ad576128ac613b73565b5b6128b8848285613902565b509392505050565b6000813590506128cf81614169565b92915050565b6000813590506128e481614180565b92915050565b6000813590506128f981614197565b92915050565b60008151905061290e81614197565b92915050565b600082601f83011261292957612928613b6e565b5b813561293984826020860161283c565b91505092915050565b600082601f83011261295757612956613b6e565b5b813561296784826020860161287e565b91505092915050565b60008135905061297f816141ae565b92915050565b60006020828403121561299b5761299a613b7d565b5b60006129a9848285016128c0565b91505092915050565b600080604083850312156129c9576129c8613b7d565b5b60006129d7858286016128c0565b92505060206129e8858286016128c0565b9150509250929050565b600080600060608486031215612a0b57612a0a613b7d565b5b6000612a19868287016128c0565b9350506020612a2a868287016128c0565b9250506040612a3b86828701612970565b9150509250925092565b60008060008060808587031215612a5f57612a5e613b7d565b5b6000612a6d878288016128c0565b9450506020612a7e878288016128c0565b9350506040612a8f87828801612970565b925050606085013567ffffffffffffffff811115612ab057612aaf613b78565b5b612abc87828801612914565b91505092959194509250565b60008060408385031215612adf57612ade613b7d565b5b6000612aed858286016128c0565b9250506020612afe858286016128d5565b9150509250929050565b60008060408385031215612b1f57612b1e613b7d565b5b6000612b2d858286016128c0565b9250506020612b3e85828601612970565b9150509250929050565b600060208284031215612b5e57612b5d613b7d565b5b6000612b6c848285016128ea565b91505092915050565b600060208284031215612b8b57612b8a613b7d565b5b6000612b99848285016128ff565b91505092915050565b60008060408385031215612bb957612bb8613b7d565b5b600083013567ffffffffffffffff811115612bd757612bd6613b78565b5b612be385828601612914565b9250506020612bf485828601612970565b9150509250929050565b600060208284031215612c1457612c13613b7d565b5b600082013567ffffffffffffffff811115612c3257612c31613b78565b5b612c3e84828501612942565b91505092915050565b600060208284031215612c5d57612c5c613b7d565b5b6000612c6b84828501612970565b91505092915050565b612c7d81613877565b82525050565b612c94612c8f82613877565b613a1a565b82525050565b612ca381613889565b82525050565b612cb281613895565b82525050565b612cc9612cc482613895565b613a2c565b82525050565b6000612cda826136dd565b612ce481856136f3565b9350612cf4818560208601613911565b612cfd81613b82565b840191505092915050565b6000612d13826136dd565b612d1d8185613704565b9350612d2d818560208601613911565b80840191505092915050565b6000612d44826136e8565b612d4e818561370f565b9350612d5e818560208601613911565b612d6781613b82565b840191505092915050565b6000612d7d826136e8565b612d878185613720565b9350612d97818560208601613911565b80840191505092915050565b60008154612db08161396e565b612dba8186613720565b94506001821660008114612dd55760018114612de657612e19565b60ff19831686528186019350612e19565b612def856136c8565b60005b83811015612e1157815481890152600182019150602081019050612df2565b838801955050505b50505092915050565b6000612e2f60208361370f565b9150612e3a82613ba0565b602082019050919050565b6000612e5260318361370f565b9150612e5d82613bc9565b604082019050919050565b6000612e75602b8361370f565b9150612e8082613c18565b604082019050919050565b6000612e9860148361370f565b9150612ea382613c67565b602082019050919050565b6000612ebb60328361370f565b9150612ec682613c90565b604082019050919050565b6000612ede60138361370f565b9150612ee982613cdf565b602082019050919050565b6000612f0160268361370f565b9150612f0c82613d08565b604082019050919050565b6000612f2460258361370f565b9150612f2f82613d57565b604082019050919050565b6000612f47601c8361370f565b9150612f5282613da6565b602082019050919050565b6000612f6a60248361370f565b9150612f7582613dcf565b604082019050919050565b6000612f8d60198361370f565b9150612f9882613e1e565b602082019050919050565b6000612fb060118361370f565b9150612fbb82613e47565b602082019050919050565b6000612fd360108361370f565b9150612fde82613e70565b602082019050919050565b6000612ff660298361370f565b915061300182613e99565b604082019050919050565b6000613019601e8361370f565b915061302482613ee8565b602082019050919050565b600061303c603e8361370f565b915061304782613f11565b604082019050919050565b600061305f60208361370f565b915061306a82613f60565b602082019050919050565b600061308260208361370f565b915061308d82613f89565b602082019050919050565b60006130a560298361370f565b91506130b082613fb2565b604082019050919050565b60006130c8602f8361370f565b91506130d382614001565b604082019050919050565b60006130eb60188361370f565b91506130f682614050565b602082019050919050565b600061310e60218361370f565b915061311982614079565b604082019050919050565b6000613131600983613720565b915061313c826140c8565b600982019050919050565b6000613154602e8361370f565b915061315f826140f1565b604082019050919050565b6000613177601683613720565b915061318282614140565b601682019050919050565b613196816138eb565b82525050565b6131ad6131a8826138eb565b613a48565b82525050565b6131bc816138f5565b82525050565b60006131ce8285612c83565b6014820191506131de828461319c565b6020820191508190509392505050565b60006131fa8285612d08565b91506132068284612cb8565b6020820191508190509392505050565b60006132228286612da3565b915061322d8261316a565b91506132398285612d72565b915061324482613124565b91506132508284612d72565b9150819050949350505050565b60006020820190506132726000830184612c74565b92915050565b600060808201905061328d6000830187612c74565b61329a6020830186612c74565b6132a7604083018561318d565b81810360608301526132b98184612ccf565b905095945050505050565b60006020820190506132d96000830184612c9a565b92915050565b60006080820190506132f46000830187612ca9565b61330160208301866131b3565b61330e6040830185612ca9565b61331b6060830184612ca9565b95945050505050565b6000602082019050818103600083015261333e8184612d39565b905092915050565b6000602082019050818103600083015261335f81612e22565b9050919050565b6000602082019050818103600083015261337f81612e45565b9050919050565b6000602082019050818103600083015261339f81612e68565b9050919050565b600060208201905081810360008301526133bf81612e8b565b9050919050565b600060208201905081810360008301526133df81612eae565b9050919050565b600060208201905081810360008301526133ff81612ed1565b9050919050565b6000602082019050818103600083015261341f81612ef4565b9050919050565b6000602082019050818103600083015261343f81612f17565b9050919050565b6000602082019050818103600083015261345f81612f3a565b9050919050565b6000602082019050818103600083015261347f81612f5d565b9050919050565b6000602082019050818103600083015261349f81612f80565b9050919050565b600060208201905081810360008301526134bf81612fa3565b9050919050565b600060208201905081810360008301526134df81612fc6565b9050919050565b600060208201905081810360008301526134ff81612fe9565b9050919050565b6000602082019050818103600083015261351f8161300c565b9050919050565b6000602082019050818103600083015261353f8161302f565b9050919050565b6000602082019050818103600083015261355f81613052565b9050919050565b6000602082019050818103600083015261357f81613075565b9050919050565b6000602082019050818103600083015261359f81613098565b9050919050565b600060208201905081810360008301526135bf816130bb565b9050919050565b600060208201905081810360008301526135df816130de565b9050919050565b600060208201905081810360008301526135ff81613101565b9050919050565b6000602082019050818103600083015261361f81613147565b9050919050565b600060208201905061363b600083018461318d565b92915050565b600061364b61365c565b905061365782826139a0565b919050565b6000604051905090565b600067ffffffffffffffff82111561368157613680613b3f565b5b61368a82613b82565b9050602081019050919050565b600067ffffffffffffffff8211156136b2576136b1613b3f565b5b6136bb82613b82565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613736826138eb565b9150613741836138eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561377657613775613a83565b5b828201905092915050565b600061378c826138f5565b9150613797836138f5565b92508260ff038211156137ad576137ac613a83565b5b828201905092915050565b60006137c3826138eb565b91506137ce836138eb565b9250826137de576137dd613ab2565b5b828204905092915050565b60006137f4826138eb565b91506137ff836138eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561383857613837613a83565b5b828202905092915050565b600061384e826138eb565b9150613859836138eb565b92508282101561386c5761386b613a83565b5b828203905092915050565b6000613882826138cb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561392f578082015181840152602081019050613914565b8381111561393e576000848401525b50505050565b600061394f826138eb565b9150600082141561396357613962613a83565b5b600182039050919050565b6000600282049050600182168061398657607f821691505b6020821081141561399a57613999613ae1565b5b50919050565b6139a982613b82565b810181811067ffffffffffffffff821117156139c8576139c7613b3f565b5b80604052505050565b60006139dc826138eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a0f57613a0e613a83565b5b600182019050919050565b6000613a2582613a36565b9050919050565b6000819050919050565b6000613a4182613b93565b9050919050565b6000819050919050565b6000613a5d826138eb565b9150613a68836138eb565b925082613a7857613a77613ab2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e206f72206275726e000000000000000000000000000000602082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f496e76616c6964204e46542076657273696f6e00000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f6e6c79206f6e6520746f6b656e20616c6c6f7765640000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f26616464726573733d0000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f2f6e66742f6d657461646174613f76657273696f6e3d00000000000000000000600082015250565b61417281613877565b811461417d57600080fd5b50565b61418981613889565b811461419457600080fd5b50565b6141a08161389f565b81146141ab57600080fd5b50565b6141b7816138eb565b81146141c257600080fd5b5056fea2646970667358221220738465e1a7eaec7b5e47be5e1eff13f3a167ab2e6ee4691b0384530b526b6ea564736f6c6343000807003368747470733a2f2f706f7274726169742d626574612d6e66742d6d657461646174612e6865726f6b756170702e636f6d

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80636352211e116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd14610435578063e11ca59714610465578063e985e9c514610481578063f2fde38b146104b15761018e565b806395d89b41146103df578063a22cb465146103fd578063b88d4fde146104195761018e565b80636352211e1461031d5780636c65cb2a1461034d57806370a082311461037d578063715018a6146103ad5780638456cb59146103b75780638da5cb5b146103c15761018e565b806323b872dd1161014b57806342842e0e1161012557806342842e0e146102ab57806342966c68146102c757806349f2553a146102e35780635c975abb146102ff5761018e565b806323b872dd146102675780633f4ba83a1461028357806340c84b0e1461028d5761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806320c5429b1461024b575b600080fd5b6101ad60048036038101906101a89190612b48565b6104cd565b6040516101ba91906132c4565b60405180910390f35b6101cb6105af565b6040516101d89190613324565b60405180910390f35b6101fb60048036038101906101f69190612c47565b610641565b604051610208919061325d565b60405180910390f35b61022b60048036038101906102269190612b08565b610687565b005b61023561079f565b6040516102429190613626565b60405180910390f35b61026560048036038101906102609190612c47565b6107b0565b005b610281600480360381019061027c91906129f2565b6107c4565b005b61028b610824565b005b610295610836565b6040516102a29190613324565b60405180910390f35b6102c560048036038101906102c091906129f2565b6108c4565b005b6102e160048036038101906102dc9190612c47565b6108e4565b005b6102fd60048036038101906102f89190612bfe565b610940565b005b610307610962565b60405161031491906132c4565b60405180910390f35b61033760048036038101906103329190612c47565b610979565b604051610344919061325d565b60405180910390f35b61036760048036038101906103629190612985565b610a2b565b6040516103749190613626565b60405180910390f35b61039760048036038101906103929190612985565b610a43565b6040516103a49190613626565b60405180910390f35b6103b5610afb565b005b6103bf610b0f565b005b6103c9610b21565b6040516103d6919061325d565b60405180910390f35b6103e7610b4b565b6040516103f49190613324565b60405180910390f35b61041760048036038101906104129190612ac8565b610bdd565b005b610433600480360381019061042e9190612a45565b610bf3565b005b61044f600480360381019061044a9190612c47565b610c55565b60405161045c9190613324565b60405180910390f35b61047f600480360381019061047a9190612ba2565b610e06565b005b61049b600480360381019061049691906129b2565b610fd1565b6040516104a891906132c4565b60405180910390f35b6104cb60048036038101906104c69190612985565b611065565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105a857506105a7826110e9565b5b9050919050565b6060600080546105be9061396e565b80601f01602080910402602001604051908101604052809291908181526020018280546105ea9061396e565b80156106375780601f1061060c57610100808354040283529160200191610637565b820191906000526020600020905b81548152906001019060200180831161061a57829003601f168201915b5050505050905090565b600061064c82611153565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061069282610979565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa906135e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661072261119e565b73ffffffffffffffffffffffffffffffffffffffff16148061075157506107508161074b61119e565b610fd1565b5b610790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078790613526565b60405180910390fd5b61079a83836111a6565b505050565b60006107ab600961125f565b905090565b6107b861126d565b6107c1816112eb565b50565b6107d56107cf61119e565b826112f7565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b90613606565b60405180910390fd5b61081f83838361138c565b505050565b61082c61126d565b6108346115f3565b565b600a80546108439061396e565b80601f016020809104026020016040519081016040528092919081815260200182805461086f9061396e565b80156108bc5780601f10610891576101008083540402835291602001916108bc565b820191906000526020600020905b81548152906001019060200180831161089f57829003601f168201915b505050505081565b6108df83838360405180602001604052806000815250610bf3565b505050565b6108f56108ef61119e565b826112f7565b610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b90613606565b60405180910390fd5b61093d816112eb565b50565b61094861126d565b80600a908051906020019061095e929190612759565b5050565b6000600660149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a19906135c6565b60405180910390fd5b80915050919050565b60086020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab906134e6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b0361126d565b610b0d6000611656565b565b610b1761126d565b610b1f61171c565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b5a9061396e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b869061396e565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b5050505050905090565b610bef610be861119e565b838361177f565b5050565b610c04610bfe61119e565b836112f7565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90613606565b60405180910390fd5b610c4f848484846118ec565b50505050565b6060610c6082611948565b610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c96906135a6565b60405180910390fd5b600160086000610cae85610979565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480610d3c5750600260086000610cff85610979565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d72906133e6565b60405180910390fd5b600a610dcd60086000610d8d86610979565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119b4565b610dde610dd985610979565b611b15565b604051602001610df093929190613216565b6040516020818303038152906040529050919050565b6000610e1133610a43565b14610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613506565b60405180910390fd5b60006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060003383604051602001610ea09291906131c2565b60405160208183030381529060405280519060200120905060008282604051602001610ecd9291906131ee565b604051602081830303815290604052805190602001209050610eed610b21565b73ffffffffffffffffffffffffffffffffffffffff16610f0d8287611b42565b73ffffffffffffffffffffffffffffffffffffffff1614610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a906134a6565b60405180910390fd5b6000610f6f600961125f565b905084600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610fbf6009611c15565b610fc93382611c2b565b505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61106d61126d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d490613406565b60405180910390fd5b6110e681611656565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61115c81611948565b61119b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611192906135c6565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661121983610979565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b61127561119e565b73ffffffffffffffffffffffffffffffffffffffff16611293610b21565b73ffffffffffffffffffffffffffffffffffffffff16146112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090613566565b60405180910390fd5b565b6112f481611c49565b50565b60008061130383610979565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061134557506113448185610fd1565b5b8061138357508373ffffffffffffffffffffffffffffffffffffffff1661136b84610641565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113ac82610979565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613426565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613466565b60405180910390fd5b61147d838383611c9c565b6114886000826111a6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114d89190613843565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461152f919061372b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115ee838383611e7b565b505050565b6115fb611f79565b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61163f61119e565b60405161164c919061325d565b60405180910390a1565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611724611fc2565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861176861119e565b604051611775919061325d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590613486565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118df91906132c4565b60405180910390a3505050565b6118f784848461138c565b6119038484848461200c565b611942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611939906133c6565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008214156119fc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b10565b600082905060005b60008214611a2e578080611a17906139d1565b915050600a82611a2791906137b8565b9150611a04565b60008167ffffffffffffffff811115611a4a57611a49613b3f565b5b6040519080825280601f01601f191660200182016040528015611a7c5781602001600182028036833780820191505090505b5090505b60008514611b0957600182611a959190613843565b9150600a85611aa49190613a52565b6030611ab0919061372b565b60f81b818381518110611ac657611ac5613b10565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b0291906137b8565b9450611a80565b8093505050505b919050565b6060611b3b8273ffffffffffffffffffffffffffffffffffffffff16601460ff166121a3565b9050919050565b6000806000806041855114611b5d5760009350505050611c0f565b6020850151925060408501519150606085015160001a9050601b8160ff161015611b9157601b81611b8e9190613781565b90505b601b8160ff1614158015611ba95750601c8160ff1614155b15611bba5760009350505050611c0f565b60018682858560405160008152602001604052604051611bdd94939291906132df565b6020604051602081039080840390855afa158015611bff573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6001816000016000828254019250508190555050565b611c458282604051806020016040528060008152506123df565b5050565b611c528161243a565b6000600760008381526020019081526020016000208054611c729061396e565b905014611c9957600760008281526020019081526020016000206000611c9891906127df565b5b50565b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611d025750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80611d3f5750611d10610b21565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7590613586565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480611de45750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1a90613366565b60405180910390fd5b611e2b610962565b15611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290613386565b60405180910390fd5b611e76838383612557565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ef957808273ffffffffffffffffffffffffffffffffffffffff167fe9274a84b19e9428826de6bae8c48329354f8f0e73f771b97cae2d9dccd45a2760405160405180910390a3611f74565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f7357808373ffffffffffffffffffffffffffffffffffffffff167fec9ab91322523c899ede7830ec9bfc992b5981cdcc27b91162fb23de5791117b60405160405180910390a35b5b505050565b611f81610962565b611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb7906133a6565b60405180910390fd5b565b611fca610962565b1561200a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612001906134c6565b60405180910390fd5b565b600061202d8473ffffffffffffffffffffffffffffffffffffffff1661255c565b15612196578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261205661119e565b8786866040518563ffffffff1660e01b81526004016120789493929190613278565b602060405180830381600087803b15801561209257600080fd5b505af19250505080156120c357506040513d601f19601f820116820180604052508101906120c09190612b75565b60015b612146573d80600081146120f3576040519150601f19603f3d011682016040523d82523d6000602084013e6120f8565b606091505b5060008151141561213e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612135906133c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061219b565b600190505b949350505050565b6060600060028360026121b691906137e9565b6121c0919061372b565b67ffffffffffffffff8111156121d9576121d8613b3f565b5b6040519080825280601f01601f19166020018201604052801561220b5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061224357612242613b10565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106122a7576122a6613b10565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122e791906137e9565b6122f1919061372b565b90505b6001811115612391577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061233357612332613b10565b5b1a60f81b82828151811061234a57612349613b10565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061238a90613944565b90506122f4565b50600084146123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90613346565b60405180910390fd5b8091505092915050565b6123e9838361257f565b6123f6600084848461200c565b612435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c906133c6565b60405180910390fd5b505050565b600061244582610979565b905061245381600084611c9c565b61245e6000836111a6565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ae9190613843565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461255381600084611e7b565b5050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e690613546565b60405180910390fd5b6125f881611948565b15612638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262f90613446565b60405180910390fd5b61264460008383611c9c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612694919061372b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461275560008383611e7b565b5050565b8280546127659061396e565b90600052602060002090601f01602090048101928261278757600085556127ce565b82601f106127a057805160ff19168380011785556127ce565b828001600101855582156127ce579182015b828111156127cd5782518255916020019190600101906127b2565b5b5090506127db919061281f565b5090565b5080546127eb9061396e565b6000825580601f106127fd575061281c565b601f01602090049060005260206000209081019061281b919061281f565b5b50565b5b80821115612838576000816000905550600101612820565b5090565b600061284f61284a84613666565b613641565b90508281526020810184848401111561286b5761286a613b73565b5b612876848285613902565b509392505050565b600061289161288c84613697565b613641565b9050828152602081018484840111156128ad576128ac613b73565b5b6128b8848285613902565b509392505050565b6000813590506128cf81614169565b92915050565b6000813590506128e481614180565b92915050565b6000813590506128f981614197565b92915050565b60008151905061290e81614197565b92915050565b600082601f83011261292957612928613b6e565b5b813561293984826020860161283c565b91505092915050565b600082601f83011261295757612956613b6e565b5b813561296784826020860161287e565b91505092915050565b60008135905061297f816141ae565b92915050565b60006020828403121561299b5761299a613b7d565b5b60006129a9848285016128c0565b91505092915050565b600080604083850312156129c9576129c8613b7d565b5b60006129d7858286016128c0565b92505060206129e8858286016128c0565b9150509250929050565b600080600060608486031215612a0b57612a0a613b7d565b5b6000612a19868287016128c0565b9350506020612a2a868287016128c0565b9250506040612a3b86828701612970565b9150509250925092565b60008060008060808587031215612a5f57612a5e613b7d565b5b6000612a6d878288016128c0565b9450506020612a7e878288016128c0565b9350506040612a8f87828801612970565b925050606085013567ffffffffffffffff811115612ab057612aaf613b78565b5b612abc87828801612914565b91505092959194509250565b60008060408385031215612adf57612ade613b7d565b5b6000612aed858286016128c0565b9250506020612afe858286016128d5565b9150509250929050565b60008060408385031215612b1f57612b1e613b7d565b5b6000612b2d858286016128c0565b9250506020612b3e85828601612970565b9150509250929050565b600060208284031215612b5e57612b5d613b7d565b5b6000612b6c848285016128ea565b91505092915050565b600060208284031215612b8b57612b8a613b7d565b5b6000612b99848285016128ff565b91505092915050565b60008060408385031215612bb957612bb8613b7d565b5b600083013567ffffffffffffffff811115612bd757612bd6613b78565b5b612be385828601612914565b9250506020612bf485828601612970565b9150509250929050565b600060208284031215612c1457612c13613b7d565b5b600082013567ffffffffffffffff811115612c3257612c31613b78565b5b612c3e84828501612942565b91505092915050565b600060208284031215612c5d57612c5c613b7d565b5b6000612c6b84828501612970565b91505092915050565b612c7d81613877565b82525050565b612c94612c8f82613877565b613a1a565b82525050565b612ca381613889565b82525050565b612cb281613895565b82525050565b612cc9612cc482613895565b613a2c565b82525050565b6000612cda826136dd565b612ce481856136f3565b9350612cf4818560208601613911565b612cfd81613b82565b840191505092915050565b6000612d13826136dd565b612d1d8185613704565b9350612d2d818560208601613911565b80840191505092915050565b6000612d44826136e8565b612d4e818561370f565b9350612d5e818560208601613911565b612d6781613b82565b840191505092915050565b6000612d7d826136e8565b612d878185613720565b9350612d97818560208601613911565b80840191505092915050565b60008154612db08161396e565b612dba8186613720565b94506001821660008114612dd55760018114612de657612e19565b60ff19831686528186019350612e19565b612def856136c8565b60005b83811015612e1157815481890152600182019150602081019050612df2565b838801955050505b50505092915050565b6000612e2f60208361370f565b9150612e3a82613ba0565b602082019050919050565b6000612e5260318361370f565b9150612e5d82613bc9565b604082019050919050565b6000612e75602b8361370f565b9150612e8082613c18565b604082019050919050565b6000612e9860148361370f565b9150612ea382613c67565b602082019050919050565b6000612ebb60328361370f565b9150612ec682613c90565b604082019050919050565b6000612ede60138361370f565b9150612ee982613cdf565b602082019050919050565b6000612f0160268361370f565b9150612f0c82613d08565b604082019050919050565b6000612f2460258361370f565b9150612f2f82613d57565b604082019050919050565b6000612f47601c8361370f565b9150612f5282613da6565b602082019050919050565b6000612f6a60248361370f565b9150612f7582613dcf565b604082019050919050565b6000612f8d60198361370f565b9150612f9882613e1e565b602082019050919050565b6000612fb060118361370f565b9150612fbb82613e47565b602082019050919050565b6000612fd360108361370f565b9150612fde82613e70565b602082019050919050565b6000612ff660298361370f565b915061300182613e99565b604082019050919050565b6000613019601e8361370f565b915061302482613ee8565b602082019050919050565b600061303c603e8361370f565b915061304782613f11565b604082019050919050565b600061305f60208361370f565b915061306a82613f60565b602082019050919050565b600061308260208361370f565b915061308d82613f89565b602082019050919050565b60006130a560298361370f565b91506130b082613fb2565b604082019050919050565b60006130c8602f8361370f565b91506130d382614001565b604082019050919050565b60006130eb60188361370f565b91506130f682614050565b602082019050919050565b600061310e60218361370f565b915061311982614079565b604082019050919050565b6000613131600983613720565b915061313c826140c8565b600982019050919050565b6000613154602e8361370f565b915061315f826140f1565b604082019050919050565b6000613177601683613720565b915061318282614140565b601682019050919050565b613196816138eb565b82525050565b6131ad6131a8826138eb565b613a48565b82525050565b6131bc816138f5565b82525050565b60006131ce8285612c83565b6014820191506131de828461319c565b6020820191508190509392505050565b60006131fa8285612d08565b91506132068284612cb8565b6020820191508190509392505050565b60006132228286612da3565b915061322d8261316a565b91506132398285612d72565b915061324482613124565b91506132508284612d72565b9150819050949350505050565b60006020820190506132726000830184612c74565b92915050565b600060808201905061328d6000830187612c74565b61329a6020830186612c74565b6132a7604083018561318d565b81810360608301526132b98184612ccf565b905095945050505050565b60006020820190506132d96000830184612c9a565b92915050565b60006080820190506132f46000830187612ca9565b61330160208301866131b3565b61330e6040830185612ca9565b61331b6060830184612ca9565b95945050505050565b6000602082019050818103600083015261333e8184612d39565b905092915050565b6000602082019050818103600083015261335f81612e22565b9050919050565b6000602082019050818103600083015261337f81612e45565b9050919050565b6000602082019050818103600083015261339f81612e68565b9050919050565b600060208201905081810360008301526133bf81612e8b565b9050919050565b600060208201905081810360008301526133df81612eae565b9050919050565b600060208201905081810360008301526133ff81612ed1565b9050919050565b6000602082019050818103600083015261341f81612ef4565b9050919050565b6000602082019050818103600083015261343f81612f17565b9050919050565b6000602082019050818103600083015261345f81612f3a565b9050919050565b6000602082019050818103600083015261347f81612f5d565b9050919050565b6000602082019050818103600083015261349f81612f80565b9050919050565b600060208201905081810360008301526134bf81612fa3565b9050919050565b600060208201905081810360008301526134df81612fc6565b9050919050565b600060208201905081810360008301526134ff81612fe9565b9050919050565b6000602082019050818103600083015261351f8161300c565b9050919050565b6000602082019050818103600083015261353f8161302f565b9050919050565b6000602082019050818103600083015261355f81613052565b9050919050565b6000602082019050818103600083015261357f81613075565b9050919050565b6000602082019050818103600083015261359f81613098565b9050919050565b600060208201905081810360008301526135bf816130bb565b9050919050565b600060208201905081810360008301526135df816130de565b9050919050565b600060208201905081810360008301526135ff81613101565b9050919050565b6000602082019050818103600083015261361f81613147565b9050919050565b600060208201905061363b600083018461318d565b92915050565b600061364b61365c565b905061365782826139a0565b919050565b6000604051905090565b600067ffffffffffffffff82111561368157613680613b3f565b5b61368a82613b82565b9050602081019050919050565b600067ffffffffffffffff8211156136b2576136b1613b3f565b5b6136bb82613b82565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613736826138eb565b9150613741836138eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561377657613775613a83565b5b828201905092915050565b600061378c826138f5565b9150613797836138f5565b92508260ff038211156137ad576137ac613a83565b5b828201905092915050565b60006137c3826138eb565b91506137ce836138eb565b9250826137de576137dd613ab2565b5b828204905092915050565b60006137f4826138eb565b91506137ff836138eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561383857613837613a83565b5b828202905092915050565b600061384e826138eb565b9150613859836138eb565b92508282101561386c5761386b613a83565b5b828203905092915050565b6000613882826138cb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561392f578082015181840152602081019050613914565b8381111561393e576000848401525b50505050565b600061394f826138eb565b9150600082141561396357613962613a83565b5b600182039050919050565b6000600282049050600182168061398657607f821691505b6020821081141561399a57613999613ae1565b5b50919050565b6139a982613b82565b810181811067ffffffffffffffff821117156139c8576139c7613b3f565b5b80604052505050565b60006139dc826138eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a0f57613a0e613a83565b5b600182019050919050565b6000613a2582613a36565b9050919050565b6000819050919050565b6000613a4182613b93565b9050919050565b6000819050919050565b6000613a5d826138eb565b9150613a68836138eb565b925082613a7857613a77613ab2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e206f72206275726e000000000000000000000000000000602082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f496e76616c6964204e46542076657273696f6e00000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f6e6c79206f6e6520746f6b656e20616c6c6f7765640000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f26616464726573733d0000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f2f6e66742f6d657461646174613f76657273696f6e3d00000000000000000000600082015250565b61417281613877565b811461417d57600080fd5b50565b61418981613889565b811461419457600080fd5b50565b6141a08161389f565b81146141ab57600080fd5b50565b6141b7816138eb565b81146141c257600080fd5b5056fea2646970667358221220738465e1a7eaec7b5e47be5e1eff13f3a167ab2e6ee4691b0384530b526b6ea564736f6c63430008070033

Deployed Bytecode Sourcemap

44864:4400:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28857:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29784:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31297:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30814:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49157:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49064:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31997:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46390:65;;;:::i;:::-;;45315:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32404:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44538:243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45398:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6528:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29495:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45028:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29226:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9393:103;;;:::i;:::-;;46321:61;;;:::i;:::-;;8745:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29953:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31540:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32660:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47137:811;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45504:809;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31766:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9651:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28857:305;28959:4;29011:25;28996:40;;;:11;:40;;;;:105;;;;29068:33;29053:48;;;:11;:48;;;;28996:105;:158;;;;29118:36;29142:11;29118:23;:36::i;:::-;28996:158;28976:178;;28857:305;;;:::o;29784:100::-;29838:13;29871:5;29864:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29784:100;:::o;31297:171::-;31373:7;31393:23;31408:7;31393:14;:23::i;:::-;31436:15;:24;31452:7;31436:24;;;;;;;;;;;;;;;;;;;;;31429:31;;31297:171;;;:::o;30814:417::-;30895:13;30911:23;30926:7;30911:14;:23::i;:::-;30895:39;;30959:5;30953:11;;:2;:11;;;;30945:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31053:5;31037:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31062:37;31079:5;31086:12;:10;:12::i;:::-;31062:16;:37::i;:::-;31037:62;31015:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;31202:21;31211:2;31215:7;31202:8;:21::i;:::-;30884:347;30814:417;;:::o;49157:104::-;49201:7;49228:25;:15;:23;:25::i;:::-;49221:32;;49157:104;:::o;49064:85::-;8631:13;:11;:13::i;:::-;49127:14:::1;49133:7;49127:5;:14::i;:::-;49064:85:::0;:::o;31997:336::-;32192:41;32211:12;:10;:12::i;:::-;32225:7;32192:18;:41::i;:::-;32184:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;32297:28;32307:4;32313:2;32317:7;32297:9;:28::i;:::-;31997:336;;;:::o;46390:65::-;8631:13;:11;:13::i;:::-;46437:10:::1;:8;:10::i;:::-;46390:65::o:0;45315:74::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32404:185::-;32542:39;32559:4;32565:2;32569:7;32542:39;;;;;;;;;;;;:16;:39::i;:::-;32404:185;;;:::o;44538:243::-;44656:41;44675:12;:10;:12::i;:::-;44689:7;44656:18;:41::i;:::-;44648:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;44759:14;44765:7;44759:5;:14::i;:::-;44538:243;:::o;45398:98::-;8631:13;:11;:13::i;:::-;45480:8:::1;45470:7;:18;;;;;;;;;;;;:::i;:::-;;45398:98:::0;:::o;6528:86::-;6575:4;6599:7;;;;;;;;;;;6592:14;;6528:86;:::o;29495:222::-;29567:7;29587:13;29603:7;:16;29611:7;29603:16;;;;;;;;;;;;;;;;;;;;;29587:32;;29655:1;29638:19;;:5;:19;;;;29630:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;29704:5;29697:12;;;29495:222;;;:::o;45028:45::-;;;;;;;;;;;;;;;;;:::o;29226:207::-;29298:7;29343:1;29326:19;;:5;:19;;;;29318:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29409:9;:16;29419:5;29409:16;;;;;;;;;;;;;;;;29402:23;;29226:207;;;:::o;9393:103::-;8631:13;:11;:13::i;:::-;9458:30:::1;9485:1;9458:18;:30::i;:::-;9393:103::o:0;46321:61::-;8631:13;:11;:13::i;:::-;46366:8:::1;:6;:8::i;:::-;46321:61::o:0;8745:87::-;8791:7;8818:6;;;;;;;;;;;8811:13;;8745:87;:::o;29953:104::-;30009:13;30042:7;30035:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29953:104;:::o;31540:155::-;31635:52;31654:12;:10;:12::i;:::-;31668:8;31678;31635:18;:52::i;:::-;31540:155;;:::o;32660:323::-;32834:41;32853:12;:10;:12::i;:::-;32867:7;32834:18;:41::i;:::-;32826:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;32937:38;32951:4;32957:2;32961:7;32970:4;32937:13;:38::i;:::-;32660:323;;;;:::o;47137:811::-;47281:13;47334:16;47342:7;47334;:16::i;:::-;47312:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;47490:1;47458:10;:28;47469:16;47477:7;47469;:16::i;:::-;47458:28;;;;;;;;;;;;;;;;:33;:87;;;;47544:1;47512:10;:28;47523:16;47531:7;47523;:16::i;:::-;47512:28;;;;;;;;;;;;;;;;:33;47458:87;47436:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;47689:7;47766:46;47783:10;:28;47794:16;47802:7;47794;:16::i;:::-;47783:28;;;;;;;;;;;;;;;;47766:16;:46::i;:::-;47869:37;47889:16;47897:7;47889;:16::i;:::-;47869:19;:37::i;:::-;47650:275;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47605:335;;47137:811;;;:::o;45504:809::-;45619:1;45594:21;45604:10;45594:9;:21::i;:::-;:26;45586:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45757:27;:64;;;;;;;;;;;;;;;;;;;45834:19;45897:10;45909:11;45880:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45856:76;;;;;;45834:98;;45945:16;46005:14;46021:11;45988:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45964:80;;;;;;45945:99;;46096:7;:5;:7::i;:::-;46063:40;;:29;46071:8;46081:10;46063:7;:29::i;:::-;:40;;;46055:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;46136:15;46154:25;:15;:23;:25::i;:::-;46136:43;;46215:11;46190:10;:22;46201:10;46190:22;;;;;;;;;;;;;;;:36;;;;46237:27;:15;:25;:27::i;:::-;46275:30;46285:10;46297:7;46275:9;:30::i;:::-;45575:738;;;;45504:809;;:::o;31766:164::-;31863:4;31887:18;:25;31906:5;31887:25;;;;;;;;;;;;;;;:35;31913:8;31887:35;;;;;;;;;;;;;;;;;;;;;;;;;31880:42;;31766:164;;;;:::o;9651:201::-;8631:13;:11;:13::i;:::-;9760:1:::1;9740:22;;:8;:22;;;;9732:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9816:28;9835:8;9816:18;:28::i;:::-;9651:201:::0;:::o;21599:157::-;21684:4;21723:25;21708:40;;;:11;:40;;;;21701:47;;21599:157;;;:::o;39272:135::-;39354:16;39362:7;39354;:16::i;:::-;39346:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;39272:135;:::o;4641:98::-;4694:7;4721:10;4714:17;;4641:98;:::o;38551:174::-;38653:2;38626:15;:24;38642:7;38626:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38709:7;38705:2;38671:46;;38680:23;38695:7;38680:14;:23::i;:::-;38671:46;;;;;;;;;;;;38551:174;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;8910:132::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8910:132::o;48918:138::-;49028:20;49040:7;49028:11;:20::i;:::-;48918:138;:::o;34784:264::-;34877:4;34894:13;34910:23;34925:7;34910:14;:23::i;:::-;34894:39;;34963:5;34952:16;;:7;:16;;;:52;;;;34972:32;34989:5;34996:7;34972:16;:32::i;:::-;34952:52;:87;;;;35032:7;35008:31;;:20;35020:7;35008:11;:20::i;:::-;:31;;;34952:87;34944:96;;;34784:264;;;;:::o;37807:625::-;37966:4;37939:31;;:23;37954:7;37939:14;:23::i;:::-;:31;;;37931:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38045:1;38031:16;;:2;:16;;;;38023:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38101:39;38122:4;38128:2;38132:7;38101:20;:39::i;:::-;38205:29;38222:1;38226:7;38205:8;:29::i;:::-;38266:1;38247:9;:15;38257:4;38247:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38295:1;38278:9;:13;38288:2;38278:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38326:2;38307:7;:16;38315:7;38307:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38365:7;38361:2;38346:27;;38355:4;38346:27;;;;;;;;;;;;38386:38;38406:4;38412:2;38416:7;38386:19;:38::i;:::-;37807:625;;;:::o;7383:120::-;6392:16;:14;:16::i;:::-;7452:5:::1;7442:7;;:15;;;;;;;;;;;;;;;;;;7473:22;7482:12;:10;:12::i;:::-;7473:22;;;;;;:::i;:::-;;;;;;;;7383:120::o:0;10012:191::-;10086:16;10105:6;;;;;;;;;;;10086:25;;10131:8;10122:6;;:17;;;;;;;;;;;;;;;;;;10186:8;10155:40;;10176:8;10155:40;;;;;;;;;;;;10075:128;10012:191;:::o;7124:118::-;6133:19;:17;:19::i;:::-;7194:4:::1;7184:7;;:14;;;;;;;;;;;;;;;;;;7214:20;7221:12;:10;:12::i;:::-;7214:20;;;;;;:::i;:::-;;;;;;;;7124:118::o:0;38868:315::-;39023:8;39014:17;;:5;:17;;;;39006:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39110:8;39072:18;:25;39091:5;39072:25;;;;;;;;;;;;;;;:35;39098:8;39072:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39156:8;39134:41;;39149:5;39134:41;;;39166:8;39134:41;;;;;;:::i;:::-;;;;;;;;38868:315;;;:::o;33864:313::-;34020:28;34030:4;34036:2;34040:7;34020:9;:28::i;:::-;34067:47;34090:4;34096:2;34100:7;34109:4;34067:22;:47::i;:::-;34059:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;33864:313;;;;:::o;34490:127::-;34555:4;34607:1;34579:30;;:7;:16;34587:7;34579:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34572:37;;34490:127;;;:::o;1895:723::-;1951:13;2181:1;2172:5;:10;2168:53;;;2199:10;;;;;;;;;;;;;;;;;;;;;2168:53;2231:12;2246:5;2231:20;;2262:14;2287:78;2302:1;2294:4;:9;2287:78;;2320:8;;;;;:::i;:::-;;;;2351:2;2343:10;;;;;:::i;:::-;;;2287:78;;;2375:19;2407:6;2397:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2375:39;;2425:154;2441:1;2432:5;:10;2425:154;;2469:1;2459:11;;;;;:::i;:::-;;;2536:2;2528:5;:10;;;;:::i;:::-;2515:2;:24;;;;:::i;:::-;2502:39;;2485:6;2492;2485:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2565:2;2556:11;;;;;:::i;:::-;;;2425:154;;;2603:6;2589:21;;;;;1895:723;;;;:::o;3804:151::-;3862:13;3895:52;3923:4;3907:22;;1786:2;3895:52;;:11;:52::i;:::-;3888:59;;3804:151;;;:::o;46463:666::-;46572:7;46597:10;46618;46639:8;46683:2;46662:10;:17;:23;46658:75;;46718:1;46702:19;;;;;;;46658:75;46795:2;46783:10;46779:19;46773:26;46767:32;;46841:2;46829:10;46825:19;46819:26;46813:32;;46895:2;46883:10;46879:19;46873:26;46870:1;46865:35;46859:41;;46930:2;46925;:7;;;46921:48;;;46955:2;46949:8;;;;;:::i;:::-;;;46921:48;46989:2;46983;:8;;;;:20;;;;;47001:2;46995;:8;;;;46983:20;46979:143;;;47036:1;47020:19;;;;;;;46979:143;47079:31;47089:8;47099:2;47103;47107;47079:31;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47072:38;;;;;46463:666;;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;35390:110::-;35466:26;35476:2;35480:7;35466:26;;;;;;;;;;;;:9;:26::i;:::-;35390:110;;:::o;43787:206::-;43856:20;43868:7;43856:11;:20::i;:::-;43930:1;43899:10;:19;43910:7;43899:19;;;;;;;;;;;43893:33;;;;;:::i;:::-;;;:38;43889:97;;43955:10;:19;43966:7;43955:19;;;;;;;;;;;;43948:26;;;;:::i;:::-;43889:97;43787:206;:::o;47956:640::-;48138:10;48122:27;;:4;:27;;;:66;;;;48186:1;48170:18;;:4;:18;;;48122:66;:108;;;;48223:7;:5;:7::i;:::-;48209:21;;:10;:21;;;48122:108;48100:199;;;;;;;;;;;;:::i;:::-;;;;;;;;;48346:10;48332:25;;:2;:25;;;:45;;;;48375:1;48361:16;;:2;:16;;;48332:45;48310:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;48474:8;:6;:8::i;:::-;48473:9;48465:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48543:45;48570:4;48576:2;48580:7;48543:26;:45::i;:::-;47956:640;;;:::o;48604:306::-;48767:1;48751:18;;:4;:18;;;48747:156;;;48802:7;48798:2;48791:19;;;;;;;;;;;;48747:156;;;48846:1;48832:16;;:2;:16;;;48828:75;;;48883:7;48877:4;48870:21;;;;;;;;;;;;48828:75;48747:156;48604:306;;;:::o;6872:108::-;6939:8;:6;:8::i;:::-;6931:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;6872:108::o;6687:::-;6758:8;:6;:8::i;:::-;6757:9;6749:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;6687:108::o;39971:853::-;40125:4;40146:15;:2;:13;;;:15::i;:::-;40142:675;;;40198:2;40182:36;;;40219:12;:10;:12::i;:::-;40233:4;40239:7;40248:4;40182:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40178:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40440:1;40423:6;:13;:18;40419:328;;;40466:60;;;;;;;;;;:::i;:::-;;;;;;;;40419:328;40697:6;40691:13;40682:6;40678:2;40674:15;40667:38;40178:584;40314:41;;;40304:51;;;:6;:51;;;;40297:58;;;;;40142:675;40801:4;40794:11;;39971:853;;;;;;;:::o;3196:451::-;3271:13;3297:19;3342:1;3333:6;3329:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;3319:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3297:47;;3355:15;:6;3362:1;3355:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;3381;:6;3388:1;3381:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;3412:9;3437:1;3428:6;3424:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;3412:26;;3407:135;3444:1;3440;:5;3407:135;;;3479:12;3500:3;3492:5;:11;3479:25;;;;;;;:::i;:::-;;;;;3467:6;3474:1;3467:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;3529:1;3519:11;;;;;3447:3;;;;:::i;:::-;;;3407:135;;;;3569:1;3560:5;:10;3552:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:6;3618:21;;;3196:451;;;;:::o;35727:319::-;35856:18;35862:2;35866:7;35856:5;:18::i;:::-;35907:53;35938:1;35942:2;35946:7;35955:4;35907:22;:53::i;:::-;35885:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;35727:319;;;:::o;37050:420::-;37110:13;37126:23;37141:7;37126:14;:23::i;:::-;37110:39;;37162:48;37183:5;37198:1;37202:7;37162:20;:48::i;:::-;37251:29;37268:1;37272:7;37251:8;:29::i;:::-;37313:1;37293:9;:16;37303:5;37293:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;37332:7;:16;37340:7;37332:16;;;;;;;;;;;;37325:23;;;;;;;;;;;37394:7;37390:1;37366:36;;37375:5;37366:36;;;;;;;;;;;;37415:47;37435:5;37450:1;37454:7;37415:19;:47::i;:::-;37099:371;37050:420;:::o;41396:126::-;;;;:::o;11443:326::-;11503:4;11760:1;11738:7;:19;;;:23;11731:30;;11443:326;;;:::o;36382:439::-;36476:1;36462:16;;:2;:16;;;;36454:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36535:16;36543:7;36535;:16::i;:::-;36534:17;36526:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36597:45;36626:1;36630:2;36634:7;36597:20;:45::i;:::-;36672:1;36655:9;:13;36665:2;36655:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36703:2;36684:7;:16;36692:7;36684:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36748:7;36744:2;36723:33;;36740:1;36723:33;;;;;;;;;;;;36769:44;36797:1;36801:2;36805:7;36769:19;:44::i;:::-;36382:439;;:::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:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:652::-;6385:6;6393;6442:2;6430:9;6421:7;6417:23;6413:32;6410:119;;;6448:79;;:::i;:::-;6410:119;6596:1;6585:9;6581:17;6568:31;6626:18;6618:6;6615:30;6612:117;;;6648:79;;:::i;:::-;6612:117;6753:62;6807:7;6798:6;6787:9;6783:22;6753:62;:::i;:::-;6743:72;;6539:286;6864:2;6890:53;6935:7;6926:6;6915:9;6911:22;6890:53;:::i;:::-;6880:63;;6835:118;6308:652;;;;;:::o;6966:509::-;7035:6;7084:2;7072:9;7063:7;7059:23;7055:32;7052:119;;;7090:79;;:::i;:::-;7052:119;7238:1;7227:9;7223:17;7210:31;7268:18;7260:6;7257:30;7254:117;;;7290:79;;:::i;:::-;7254:117;7395:63;7450:7;7441:6;7430:9;7426:22;7395:63;:::i;:::-;7385:73;;7181:287;6966:509;;;;:::o;7481:329::-;7540:6;7589:2;7577:9;7568:7;7564:23;7560:32;7557:119;;;7595:79;;:::i;:::-;7557:119;7715:1;7740:53;7785:7;7776:6;7765:9;7761:22;7740:53;:::i;:::-;7730:63;;7686:117;7481:329;;;;:::o;7816:118::-;7903:24;7921:5;7903:24;:::i;:::-;7898:3;7891:37;7816:118;;:::o;7940:157::-;8045:45;8065:24;8083:5;8065:24;:::i;:::-;8045:45;:::i;:::-;8040:3;8033:58;7940:157;;:::o;8103:109::-;8184:21;8199:5;8184:21;:::i;:::-;8179:3;8172:34;8103:109;;:::o;8218:118::-;8305:24;8323:5;8305:24;:::i;:::-;8300:3;8293:37;8218:118;;:::o;8342:157::-;8447:45;8467:24;8485:5;8467:24;:::i;:::-;8447:45;:::i;:::-;8442:3;8435:58;8342:157;;:::o;8505:360::-;8591:3;8619:38;8651:5;8619:38;:::i;:::-;8673:70;8736:6;8731:3;8673:70;:::i;:::-;8666:77;;8752:52;8797:6;8792:3;8785:4;8778:5;8774:16;8752:52;:::i;:::-;8829:29;8851:6;8829:29;:::i;:::-;8824:3;8820:39;8813:46;;8595:270;8505:360;;;;:::o;8871:373::-;8975:3;9003:38;9035:5;9003:38;:::i;:::-;9057:88;9138:6;9133:3;9057:88;:::i;:::-;9050:95;;9154:52;9199:6;9194:3;9187:4;9180:5;9176:16;9154:52;:::i;:::-;9231:6;9226:3;9222:16;9215:23;;8979:265;8871:373;;;;:::o;9250:364::-;9338:3;9366:39;9399:5;9366:39;:::i;:::-;9421:71;9485:6;9480:3;9421:71;:::i;:::-;9414:78;;9501:52;9546:6;9541:3;9534:4;9527:5;9523:16;9501:52;:::i;:::-;9578:29;9600:6;9578:29;:::i;:::-;9573:3;9569:39;9562:46;;9342:272;9250:364;;;;:::o;9620:377::-;9726:3;9754:39;9787:5;9754:39;:::i;:::-;9809:89;9891:6;9886:3;9809:89;:::i;:::-;9802:96;;9907:52;9952:6;9947:3;9940:4;9933:5;9929:16;9907:52;:::i;:::-;9984:6;9979:3;9975:16;9968:23;;9730:267;9620:377;;;;:::o;10027:845::-;10130:3;10167:5;10161:12;10196:36;10222:9;10196:36;:::i;:::-;10248:89;10330:6;10325:3;10248:89;:::i;:::-;10241:96;;10368:1;10357:9;10353:17;10384:1;10379:137;;;;10530:1;10525:341;;;;10346:520;;10379:137;10463:4;10459:9;10448;10444:25;10439:3;10432:38;10499:6;10494:3;10490:16;10483:23;;10379:137;;10525:341;10592:38;10624:5;10592:38;:::i;:::-;10652:1;10666:154;10680:6;10677:1;10674:13;10666:154;;;10754:7;10748:14;10744:1;10739:3;10735:11;10728:35;10804:1;10795:7;10791:15;10780:26;;10702:4;10699:1;10695:12;10690:17;;10666:154;;;10849:6;10844:3;10840:16;10833:23;;10532:334;;10346:520;;10134:738;;10027:845;;;;:::o;10878:366::-;11020:3;11041:67;11105:2;11100:3;11041:67;:::i;:::-;11034:74;;11117:93;11206:3;11117:93;:::i;:::-;11235:2;11230:3;11226:12;11219:19;;10878:366;;;:::o;11250:::-;11392:3;11413:67;11477:2;11472:3;11413:67;:::i;:::-;11406:74;;11489:93;11578:3;11489:93;:::i;:::-;11607:2;11602:3;11598:12;11591:19;;11250:366;;;:::o;11622:::-;11764:3;11785:67;11849:2;11844:3;11785:67;:::i;:::-;11778:74;;11861:93;11950:3;11861:93;:::i;:::-;11979:2;11974:3;11970:12;11963:19;;11622:366;;;:::o;11994:::-;12136:3;12157:67;12221:2;12216:3;12157:67;:::i;:::-;12150:74;;12233:93;12322:3;12233:93;:::i;:::-;12351:2;12346:3;12342:12;12335:19;;11994:366;;;:::o;12366:::-;12508:3;12529:67;12593:2;12588:3;12529:67;:::i;:::-;12522:74;;12605:93;12694:3;12605:93;:::i;:::-;12723:2;12718:3;12714:12;12707:19;;12366:366;;;:::o;12738:::-;12880:3;12901:67;12965:2;12960:3;12901:67;:::i;:::-;12894:74;;12977:93;13066:3;12977:93;:::i;:::-;13095:2;13090:3;13086:12;13079:19;;12738:366;;;:::o;13110:::-;13252:3;13273:67;13337:2;13332:3;13273:67;:::i;:::-;13266:74;;13349:93;13438:3;13349:93;:::i;:::-;13467:2;13462:3;13458:12;13451:19;;13110:366;;;:::o;13482:::-;13624:3;13645:67;13709:2;13704:3;13645:67;:::i;:::-;13638:74;;13721:93;13810:3;13721:93;:::i;:::-;13839:2;13834:3;13830:12;13823:19;;13482:366;;;:::o;13854:::-;13996:3;14017:67;14081:2;14076:3;14017:67;:::i;:::-;14010:74;;14093:93;14182:3;14093:93;:::i;:::-;14211:2;14206:3;14202:12;14195:19;;13854:366;;;:::o;14226:::-;14368:3;14389:67;14453:2;14448:3;14389:67;:::i;:::-;14382:74;;14465:93;14554:3;14465:93;:::i;:::-;14583:2;14578:3;14574:12;14567:19;;14226:366;;;:::o;14598:::-;14740:3;14761:67;14825:2;14820:3;14761:67;:::i;:::-;14754:74;;14837:93;14926:3;14837:93;:::i;:::-;14955:2;14950:3;14946:12;14939:19;;14598:366;;;:::o;14970:::-;15112:3;15133:67;15197:2;15192:3;15133:67;:::i;:::-;15126:74;;15209:93;15298:3;15209:93;:::i;:::-;15327:2;15322:3;15318:12;15311:19;;14970:366;;;:::o;15342:::-;15484:3;15505:67;15569:2;15564:3;15505:67;:::i;:::-;15498:74;;15581:93;15670:3;15581:93;:::i;:::-;15699:2;15694:3;15690:12;15683:19;;15342:366;;;:::o;15714:::-;15856:3;15877:67;15941:2;15936:3;15877:67;:::i;:::-;15870:74;;15953:93;16042:3;15953:93;:::i;:::-;16071:2;16066:3;16062:12;16055:19;;15714:366;;;:::o;16086:::-;16228:3;16249:67;16313:2;16308:3;16249:67;:::i;:::-;16242:74;;16325:93;16414:3;16325:93;:::i;:::-;16443:2;16438:3;16434:12;16427:19;;16086:366;;;:::o;16458:::-;16600:3;16621:67;16685:2;16680:3;16621:67;:::i;:::-;16614:74;;16697:93;16786:3;16697:93;:::i;:::-;16815:2;16810:3;16806:12;16799:19;;16458:366;;;:::o;16830:::-;16972:3;16993:67;17057:2;17052:3;16993:67;:::i;:::-;16986:74;;17069:93;17158:3;17069:93;:::i;:::-;17187:2;17182:3;17178:12;17171:19;;16830:366;;;:::o;17202:::-;17344:3;17365:67;17429:2;17424:3;17365:67;:::i;:::-;17358:74;;17441:93;17530:3;17441:93;:::i;:::-;17559:2;17554:3;17550:12;17543:19;;17202:366;;;:::o;17574:::-;17716:3;17737:67;17801:2;17796:3;17737:67;:::i;:::-;17730:74;;17813:93;17902:3;17813:93;:::i;:::-;17931:2;17926:3;17922:12;17915:19;;17574:366;;;:::o;17946:::-;18088:3;18109:67;18173:2;18168:3;18109:67;:::i;:::-;18102:74;;18185:93;18274:3;18185:93;:::i;:::-;18303:2;18298:3;18294:12;18287:19;;17946:366;;;:::o;18318:::-;18460:3;18481:67;18545:2;18540:3;18481:67;:::i;:::-;18474:74;;18557:93;18646:3;18557:93;:::i;:::-;18675:2;18670:3;18666:12;18659:19;;18318:366;;;:::o;18690:::-;18832:3;18853:67;18917:2;18912:3;18853:67;:::i;:::-;18846:74;;18929:93;19018:3;18929:93;:::i;:::-;19047:2;19042:3;19038:12;19031:19;;18690:366;;;:::o;19062:400::-;19222:3;19243:84;19325:1;19320:3;19243:84;:::i;:::-;19236:91;;19336:93;19425:3;19336:93;:::i;:::-;19454:1;19449:3;19445:11;19438:18;;19062:400;;;:::o;19468:366::-;19610:3;19631:67;19695:2;19690:3;19631:67;:::i;:::-;19624:74;;19707:93;19796:3;19707:93;:::i;:::-;19825:2;19820:3;19816:12;19809:19;;19468:366;;;:::o;19840:402::-;20000:3;20021:85;20103:2;20098:3;20021:85;:::i;:::-;20014:92;;20115:93;20204:3;20115:93;:::i;:::-;20233:2;20228:3;20224:12;20217:19;;19840:402;;;:::o;20248:118::-;20335:24;20353:5;20335:24;:::i;:::-;20330:3;20323:37;20248:118;;:::o;20372:157::-;20477:45;20497:24;20515:5;20497:24;:::i;:::-;20477:45;:::i;:::-;20472:3;20465:58;20372:157;;:::o;20535:112::-;20618:22;20634:5;20618:22;:::i;:::-;20613:3;20606:35;20535:112;;:::o;20653:397::-;20793:3;20808:75;20879:3;20870:6;20808:75;:::i;:::-;20908:2;20903:3;20899:12;20892:19;;20921:75;20992:3;20983:6;20921:75;:::i;:::-;21021:2;21016:3;21012:12;21005:19;;21041:3;21034:10;;20653:397;;;;;:::o;21056:412::-;21214:3;21236:93;21325:3;21316:6;21236:93;:::i;:::-;21229:100;;21339:75;21410:3;21401:6;21339:75;:::i;:::-;21439:2;21434:3;21430:12;21423:19;;21459:3;21452:10;;21056:412;;;;;:::o;21474:1121::-;21901:3;21923:92;22011:3;22002:6;21923:92;:::i;:::-;21916:99;;22032:148;22176:3;22032:148;:::i;:::-;22025:155;;22197:95;22288:3;22279:6;22197:95;:::i;:::-;22190:102;;22309:148;22453:3;22309:148;:::i;:::-;22302:155;;22474:95;22565:3;22556:6;22474:95;:::i;:::-;22467:102;;22586:3;22579:10;;21474:1121;;;;;;:::o;22601:222::-;22694:4;22732:2;22721:9;22717:18;22709:26;;22745:71;22813:1;22802:9;22798:17;22789:6;22745:71;:::i;:::-;22601:222;;;;:::o;22829:640::-;23024:4;23062:3;23051:9;23047:19;23039:27;;23076:71;23144:1;23133:9;23129:17;23120:6;23076:71;:::i;:::-;23157:72;23225:2;23214:9;23210:18;23201:6;23157:72;:::i;:::-;23239;23307:2;23296:9;23292:18;23283:6;23239:72;:::i;:::-;23358:9;23352:4;23348:20;23343:2;23332:9;23328:18;23321:48;23386:76;23457:4;23448:6;23386:76;:::i;:::-;23378:84;;22829:640;;;;;;;:::o;23475:210::-;23562:4;23600:2;23589:9;23585:18;23577:26;;23613:65;23675:1;23664:9;23660:17;23651:6;23613:65;:::i;:::-;23475:210;;;;:::o;23691:545::-;23864:4;23902:3;23891:9;23887:19;23879:27;;23916:71;23984:1;23973:9;23969:17;23960:6;23916:71;:::i;:::-;23997:68;24061:2;24050:9;24046:18;24037:6;23997:68;:::i;:::-;24075:72;24143:2;24132:9;24128:18;24119:6;24075:72;:::i;:::-;24157;24225:2;24214:9;24210:18;24201:6;24157:72;:::i;:::-;23691:545;;;;;;;:::o;24242:313::-;24355:4;24393:2;24382:9;24378:18;24370:26;;24442:9;24436:4;24432:20;24428:1;24417:9;24413:17;24406:47;24470:78;24543:4;24534:6;24470:78;:::i;:::-;24462:86;;24242:313;;;;:::o;24561:419::-;24727:4;24765:2;24754:9;24750:18;24742:26;;24814:9;24808:4;24804:20;24800:1;24789:9;24785:17;24778:47;24842:131;24968:4;24842:131;:::i;:::-;24834:139;;24561:419;;;:::o;24986:::-;25152:4;25190:2;25179:9;25175:18;25167:26;;25239:9;25233:4;25229:20;25225:1;25214:9;25210:17;25203:47;25267:131;25393:4;25267:131;:::i;:::-;25259:139;;24986:419;;;:::o;25411:::-;25577:4;25615:2;25604:9;25600:18;25592:26;;25664:9;25658:4;25654:20;25650:1;25639:9;25635:17;25628:47;25692:131;25818:4;25692:131;:::i;:::-;25684:139;;25411:419;;;:::o;25836:::-;26002:4;26040:2;26029:9;26025:18;26017:26;;26089:9;26083:4;26079:20;26075:1;26064:9;26060:17;26053:47;26117:131;26243:4;26117:131;:::i;:::-;26109:139;;25836:419;;;:::o;26261:::-;26427:4;26465:2;26454:9;26450:18;26442:26;;26514:9;26508:4;26504:20;26500:1;26489:9;26485:17;26478:47;26542:131;26668:4;26542:131;:::i;:::-;26534:139;;26261:419;;;:::o;26686:::-;26852:4;26890:2;26879:9;26875:18;26867:26;;26939:9;26933:4;26929:20;26925:1;26914:9;26910:17;26903:47;26967:131;27093:4;26967:131;:::i;:::-;26959:139;;26686:419;;;:::o;27111:::-;27277:4;27315:2;27304:9;27300:18;27292:26;;27364:9;27358:4;27354:20;27350:1;27339:9;27335:17;27328:47;27392:131;27518:4;27392:131;:::i;:::-;27384:139;;27111:419;;;:::o;27536:::-;27702:4;27740:2;27729:9;27725:18;27717:26;;27789:9;27783:4;27779:20;27775:1;27764:9;27760:17;27753:47;27817:131;27943:4;27817:131;:::i;:::-;27809:139;;27536:419;;;:::o;27961:::-;28127:4;28165:2;28154:9;28150:18;28142:26;;28214:9;28208:4;28204:20;28200:1;28189:9;28185:17;28178:47;28242:131;28368:4;28242:131;:::i;:::-;28234:139;;27961:419;;;:::o;28386:::-;28552:4;28590:2;28579:9;28575:18;28567:26;;28639:9;28633:4;28629:20;28625:1;28614:9;28610:17;28603:47;28667:131;28793:4;28667:131;:::i;:::-;28659:139;;28386:419;;;:::o;28811:::-;28977:4;29015:2;29004:9;29000:18;28992:26;;29064:9;29058:4;29054:20;29050:1;29039:9;29035:17;29028:47;29092:131;29218:4;29092:131;:::i;:::-;29084:139;;28811:419;;;:::o;29236:::-;29402:4;29440:2;29429:9;29425:18;29417:26;;29489:9;29483:4;29479:20;29475:1;29464:9;29460:17;29453:47;29517:131;29643:4;29517:131;:::i;:::-;29509:139;;29236:419;;;:::o;29661:::-;29827:4;29865:2;29854:9;29850:18;29842:26;;29914:9;29908:4;29904:20;29900:1;29889:9;29885:17;29878:47;29942:131;30068:4;29942:131;:::i;:::-;29934:139;;29661:419;;;:::o;30086:::-;30252:4;30290:2;30279:9;30275:18;30267:26;;30339:9;30333:4;30329:20;30325:1;30314:9;30310:17;30303:47;30367:131;30493:4;30367:131;:::i;:::-;30359:139;;30086:419;;;:::o;30511:::-;30677:4;30715:2;30704:9;30700:18;30692:26;;30764:9;30758:4;30754:20;30750:1;30739:9;30735:17;30728:47;30792:131;30918:4;30792:131;:::i;:::-;30784:139;;30511:419;;;:::o;30936:::-;31102:4;31140:2;31129:9;31125:18;31117:26;;31189:9;31183:4;31179:20;31175:1;31164:9;31160:17;31153:47;31217:131;31343:4;31217:131;:::i;:::-;31209:139;;30936:419;;;:::o;31361:::-;31527:4;31565:2;31554:9;31550:18;31542:26;;31614:9;31608:4;31604:20;31600:1;31589:9;31585:17;31578:47;31642:131;31768:4;31642:131;:::i;:::-;31634:139;;31361:419;;;:::o;31786:::-;31952:4;31990:2;31979:9;31975:18;31967:26;;32039:9;32033:4;32029:20;32025:1;32014:9;32010:17;32003:47;32067:131;32193:4;32067:131;:::i;:::-;32059:139;;31786:419;;;:::o;32211:::-;32377:4;32415:2;32404:9;32400:18;32392:26;;32464:9;32458:4;32454:20;32450:1;32439:9;32435:17;32428:47;32492:131;32618:4;32492:131;:::i;:::-;32484:139;;32211:419;;;:::o;32636:::-;32802:4;32840:2;32829:9;32825:18;32817:26;;32889:9;32883:4;32879:20;32875:1;32864:9;32860:17;32853:47;32917:131;33043:4;32917:131;:::i;:::-;32909:139;;32636:419;;;:::o;33061:::-;33227:4;33265:2;33254:9;33250:18;33242:26;;33314:9;33308:4;33304:20;33300:1;33289:9;33285:17;33278:47;33342:131;33468:4;33342:131;:::i;:::-;33334:139;;33061:419;;;:::o;33486:::-;33652:4;33690:2;33679:9;33675:18;33667:26;;33739:9;33733:4;33729:20;33725:1;33714:9;33710:17;33703:47;33767:131;33893:4;33767:131;:::i;:::-;33759:139;;33486:419;;;:::o;33911:::-;34077:4;34115:2;34104:9;34100:18;34092:26;;34164:9;34158:4;34154:20;34150:1;34139:9;34135:17;34128:47;34192:131;34318:4;34192:131;:::i;:::-;34184:139;;33911:419;;;:::o;34336:222::-;34429:4;34467:2;34456:9;34452:18;34444:26;;34480:71;34548:1;34537:9;34533:17;34524:6;34480:71;:::i;:::-;34336:222;;;;:::o;34564:129::-;34598:6;34625:20;;:::i;:::-;34615:30;;34654:33;34682:4;34674:6;34654:33;:::i;:::-;34564:129;;;:::o;34699:75::-;34732:6;34765:2;34759:9;34749:19;;34699:75;:::o;34780:307::-;34841:4;34931:18;34923:6;34920:30;34917:56;;;34953:18;;:::i;:::-;34917:56;34991:29;35013:6;34991:29;:::i;:::-;34983:37;;35075:4;35069;35065:15;35057:23;;34780:307;;;:::o;35093:308::-;35155:4;35245:18;35237:6;35234:30;35231:56;;;35267:18;;:::i;:::-;35231:56;35305:29;35327:6;35305:29;:::i;:::-;35297:37;;35389:4;35383;35379:15;35371:23;;35093:308;;;:::o;35407:141::-;35456:4;35479:3;35471:11;;35502:3;35499:1;35492:14;35536:4;35533:1;35523:18;35515:26;;35407:141;;;:::o;35554:98::-;35605:6;35639:5;35633:12;35623:22;;35554:98;;;:::o;35658:99::-;35710:6;35744:5;35738:12;35728:22;;35658:99;;;:::o;35763:168::-;35846:11;35880:6;35875:3;35868:19;35920:4;35915:3;35911:14;35896:29;;35763:168;;;;:::o;35937:147::-;36038:11;36075:3;36060:18;;35937:147;;;;:::o;36090:169::-;36174:11;36208:6;36203:3;36196:19;36248:4;36243:3;36239:14;36224:29;;36090:169;;;;:::o;36265:148::-;36367:11;36404:3;36389:18;;36265:148;;;;:::o;36419:305::-;36459:3;36478:20;36496:1;36478:20;:::i;:::-;36473:25;;36512:20;36530:1;36512:20;:::i;:::-;36507:25;;36666:1;36598:66;36594:74;36591:1;36588:81;36585:107;;;36672:18;;:::i;:::-;36585:107;36716:1;36713;36709:9;36702:16;;36419:305;;;;:::o;36730:237::-;36768:3;36787:18;36803:1;36787:18;:::i;:::-;36782:23;;36819:18;36835:1;36819:18;:::i;:::-;36814:23;;36909:1;36903:4;36899:12;36896:1;36893:19;36890:45;;;36915:18;;:::i;:::-;36890:45;36959:1;36956;36952:9;36945:16;;36730:237;;;;:::o;36973:185::-;37013:1;37030:20;37048:1;37030:20;:::i;:::-;37025:25;;37064:20;37082:1;37064:20;:::i;:::-;37059:25;;37103:1;37093:35;;37108:18;;:::i;:::-;37093:35;37150:1;37147;37143:9;37138:14;;36973:185;;;;:::o;37164:348::-;37204:7;37227:20;37245:1;37227:20;:::i;:::-;37222:25;;37261:20;37279:1;37261:20;:::i;:::-;37256:25;;37449:1;37381:66;37377:74;37374:1;37371:81;37366:1;37359:9;37352:17;37348:105;37345:131;;;37456:18;;:::i;:::-;37345:131;37504:1;37501;37497:9;37486:20;;37164:348;;;;:::o;37518:191::-;37558:4;37578:20;37596:1;37578:20;:::i;:::-;37573:25;;37612:20;37630:1;37612:20;:::i;:::-;37607:25;;37651:1;37648;37645:8;37642:34;;;37656:18;;:::i;:::-;37642:34;37701:1;37698;37694:9;37686:17;;37518:191;;;;:::o;37715:96::-;37752:7;37781:24;37799:5;37781:24;:::i;:::-;37770:35;;37715:96;;;:::o;37817:90::-;37851:7;37894:5;37887:13;37880:21;37869:32;;37817:90;;;:::o;37913:77::-;37950:7;37979:5;37968:16;;37913:77;;;:::o;37996:149::-;38032:7;38072:66;38065:5;38061:78;38050:89;;37996:149;;;:::o;38151:126::-;38188:7;38228:42;38221:5;38217:54;38206:65;;38151:126;;;:::o;38283:77::-;38320:7;38349:5;38338:16;;38283:77;;;:::o;38366:86::-;38401:7;38441:4;38434:5;38430:16;38419:27;;38366:86;;;:::o;38458:154::-;38542:6;38537:3;38532;38519:30;38604:1;38595:6;38590:3;38586:16;38579:27;38458:154;;;:::o;38618:307::-;38686:1;38696:113;38710:6;38707:1;38704:13;38696:113;;;38795:1;38790:3;38786:11;38780:18;38776:1;38771:3;38767:11;38760:39;38732:2;38729:1;38725:10;38720:15;;38696:113;;;38827:6;38824:1;38821:13;38818:101;;;38907:1;38898:6;38893:3;38889:16;38882:27;38818:101;38667:258;38618:307;;;:::o;38931:171::-;38970:3;38993:24;39011:5;38993:24;:::i;:::-;38984:33;;39039:4;39032:5;39029:15;39026:41;;;39047:18;;:::i;:::-;39026:41;39094:1;39087:5;39083:13;39076:20;;38931:171;;;:::o;39108:320::-;39152:6;39189:1;39183:4;39179:12;39169:22;;39236:1;39230:4;39226:12;39257:18;39247:81;;39313:4;39305:6;39301:17;39291:27;;39247:81;39375:2;39367:6;39364:14;39344:18;39341:38;39338:84;;;39394:18;;:::i;:::-;39338:84;39159:269;39108:320;;;:::o;39434:281::-;39517:27;39539:4;39517:27;:::i;:::-;39509:6;39505:40;39647:6;39635:10;39632:22;39611:18;39599:10;39596:34;39593:62;39590:88;;;39658:18;;:::i;:::-;39590:88;39698:10;39694:2;39687:22;39477:238;39434:281;;:::o;39721:233::-;39760:3;39783:24;39801:5;39783:24;:::i;:::-;39774:33;;39829:66;39822:5;39819:77;39816:103;;;39899:18;;:::i;:::-;39816:103;39946:1;39939:5;39935:13;39928:20;;39721:233;;;:::o;39960:100::-;39999:7;40028:26;40048:5;40028:26;:::i;:::-;40017:37;;39960:100;;;:::o;40066:79::-;40105:7;40134:5;40123:16;;40066:79;;;:::o;40151:94::-;40190:7;40219:20;40233:5;40219:20;:::i;:::-;40208:31;;40151:94;;;:::o;40251:79::-;40290:7;40319:5;40308:16;;40251:79;;;:::o;40336:176::-;40368:1;40385:20;40403:1;40385:20;:::i;:::-;40380:25;;40419:20;40437:1;40419:20;:::i;:::-;40414:25;;40458:1;40448:35;;40463:18;;:::i;:::-;40448:35;40504:1;40501;40497:9;40492:14;;40336:176;;;;:::o;40518:180::-;40566:77;40563:1;40556:88;40663:4;40660:1;40653:15;40687:4;40684:1;40677:15;40704:180;40752:77;40749:1;40742:88;40849:4;40846:1;40839:15;40873:4;40870:1;40863:15;40890:180;40938:77;40935:1;40928:88;41035:4;41032:1;41025:15;41059:4;41056:1;41049:15;41076:180;41124:77;41121:1;41114:88;41221:4;41218:1;41211:15;41245:4;41242:1;41235:15;41262:180;41310:77;41307:1;41300:88;41407:4;41404:1;41397:15;41431:4;41428:1;41421:15;41448:117;41557:1;41554;41547:12;41571:117;41680:1;41677;41670:12;41694:117;41803:1;41800;41793:12;41817:117;41926:1;41923;41916:12;41940:102;41981:6;42032:2;42028:7;42023:2;42016:5;42012:14;42008:28;41998:38;;41940:102;;;:::o;42048:94::-;42081:8;42129:5;42125:2;42121:14;42100:35;;42048:94;;;:::o;42148:182::-;42288:34;42284:1;42276:6;42272:14;42265:58;42148:182;:::o;42336:236::-;42476:34;42472:1;42464:6;42460:14;42453:58;42545:19;42540:2;42532:6;42528:15;42521:44;42336:236;:::o;42578:230::-;42718:34;42714:1;42706:6;42702:14;42695:58;42787:13;42782:2;42774:6;42770:15;42763:38;42578:230;:::o;42814:170::-;42954:22;42950:1;42942:6;42938:14;42931:46;42814:170;:::o;42990:237::-;43130:34;43126:1;43118:6;43114:14;43107:58;43199:20;43194:2;43186:6;43182:15;43175:45;42990:237;:::o;43233:169::-;43373:21;43369:1;43361:6;43357:14;43350:45;43233:169;:::o;43408:225::-;43548:34;43544:1;43536:6;43532:14;43525:58;43617:8;43612:2;43604:6;43600:15;43593:33;43408:225;:::o;43639:224::-;43779:34;43775:1;43767:6;43763:14;43756:58;43848:7;43843:2;43835:6;43831:15;43824:32;43639:224;:::o;43869:178::-;44009:30;44005:1;43997:6;43993:14;43986:54;43869:178;:::o;44053:223::-;44193:34;44189:1;44181:6;44177:14;44170:58;44262:6;44257:2;44249:6;44245:15;44238:31;44053:223;:::o;44282:175::-;44422:27;44418:1;44410:6;44406:14;44399:51;44282:175;:::o;44463:167::-;44603:19;44599:1;44591:6;44587:14;44580:43;44463:167;:::o;44636:166::-;44776:18;44772:1;44764:6;44760:14;44753:42;44636:166;:::o;44808:228::-;44948:34;44944:1;44936:6;44932:14;44925:58;45017:11;45012:2;45004:6;45000:15;44993:36;44808:228;:::o;45042:180::-;45182:32;45178:1;45170:6;45166:14;45159:56;45042:180;:::o;45228:249::-;45368:34;45364:1;45356:6;45352:14;45345:58;45437:32;45432:2;45424:6;45420:15;45413:57;45228:249;:::o;45483:182::-;45623:34;45619:1;45611:6;45607:14;45600:58;45483:182;:::o;45671:::-;45811:34;45807:1;45799:6;45795:14;45788:58;45671:182;:::o;45859:228::-;45999:34;45995:1;45987:6;45983:14;45976:58;46068:11;46063:2;46055:6;46051:15;46044:36;45859:228;:::o;46093:234::-;46233:34;46229:1;46221:6;46217:14;46210:58;46302:17;46297:2;46289:6;46285:15;46278:42;46093:234;:::o;46333:174::-;46473:26;46469:1;46461:6;46457:14;46450:50;46333:174;:::o;46513:220::-;46653:34;46649:1;46641:6;46637:14;46630:58;46722:3;46717:2;46709:6;46705:15;46698:28;46513:220;:::o;46739:159::-;46879:11;46875:1;46867:6;46863:14;46856:35;46739:159;:::o;46904:233::-;47044:34;47040:1;47032:6;47028:14;47021:58;47113:16;47108:2;47100:6;47096:15;47089:41;46904:233;:::o;47143:172::-;47283:24;47279:1;47271:6;47267:14;47260:48;47143:172;:::o;47321:122::-;47394:24;47412:5;47394:24;:::i;:::-;47387:5;47384:35;47374:63;;47433:1;47430;47423:12;47374:63;47321:122;:::o;47449:116::-;47519:21;47534:5;47519:21;:::i;:::-;47512:5;47509:32;47499:60;;47555:1;47552;47545:12;47499:60;47449:116;:::o;47571:120::-;47643:23;47660:5;47643:23;:::i;:::-;47636:5;47633:34;47623:62;;47681:1;47678;47671:12;47623:62;47571:120;:::o;47697:122::-;47770:24;47788:5;47770:24;:::i;:::-;47763:5;47760:35;47750:63;;47809:1;47806;47799:12;47750:63;47697:122;:::o

Swarm Source

ipfs://738465e1a7eaec7b5e47be5e1eff13f3a167ab2e6ee4691b0384530b526b6ea5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.