ETH Price: $3,919.38 (+0.35%)

Rekt Canz (RKC)
 

Overview

TokenID

9

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FOR

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

/**
 * @dev String operations.
 */


// dont look my code im shy

pragma solidity ^0.8.14;



contract FOR is ERC721URIStorage, Ownable {

    string private _baseURIextended; // This one is used on OpenSea to define the metadata IPFS address

    bool private mint_paused = false; // in case someone tries to rekt our mint we can pause at will

    mapping(uint8 => uint16) public cansLeft; // our supply

    mapping(address => uint8) private alreadyOwnCan;  // used to set limits (no more than 2 cans, one of each)

    mapping(address => string) public cansHeOwn; // your supply


    constructor() ERC721("Rekt Canz", "RKC") {

        cansLeft[0] = 1000;  // B0WB
        cansLeft[1] = 1000;  // B0LT
        cansLeft[2] = 1000;  // F1R3
        cansLeft[3] = 1000;  // SCH00L
        cansLeft[4] = 1000;  // SN3K
        cansLeft[5] = 250;   // WabiSabi
        cansLeft[6] = 100;   // Deladeso
        cansLeft[7] = 250;   // Creepz
        cansLeft[8] = 250;   // Grillz Gang
        cansLeft[9] = 250;   // Mooncan
        cansLeft[10] = 50;   // Tiny Zoo
        cansLeft[11] = 150;  // Llamaverse
        cansLeft[12] = 10;   // ???

    }


    // Set the Metadata IPFS url (see docs.opensea.io)
    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    // In case we need to add a new can, or refresh our supply
    function setCansLeft(uint8 token, uint16 amount) external onlyOwner() {
        cansLeft[token] = amount;
    }

    // in case we need to pause the mint
    function switchMintState() external onlyOwner() {
        mint_paused = !mint_paused;
    }

    // for openSEA
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }


    // our   M_I_N_T function
    function M_I_N_T(address to, uint8 tokenID) public {

        require(!mint_paused, "Mint is Paused");

        require(alreadyOwnCan[to] < 3, "Can only mint one collab can and one comunnity can");

        if(tokenID > 4) {
            require(alreadyOwnCan[to] != 2, "Can only mint one collab can");

        } else {
            require(alreadyOwnCan[to] != 1, "Can only mint one comunity can");
        }

        // those requires should be self explanatory


        // in case some of the community cans sold out, you can still get a can without spending another transaction gas fee
        // but now instead of community its from 0 to 4
        if(cansLeft[tokenID] == 0 && tokenID < 4) {
            for(uint8 i = 0; i < 4; i++) {
                if(cansLeft[i] > 0) {
                    tokenID = i;
                    i = 4;
                }
            }
        }

        // sold out require
        require(cansLeft[tokenID] > 0, "This can sold out");

        if(alreadyOwnCan[to] == 0) {
            tokenID < 4 ? alreadyOwnCan[to] = 1 : alreadyOwnCan[to] = 2;
        } else {
            alreadyOwnCan[to] = 3;
        }

        cansLeft[tokenID] -= 1;
        cansHeOwn[to] = string.concat(cansHeOwn[to], Strings.toString(tokenID));
        _safeMint(to, tokenID);

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint8","name":"tokenID","type":"uint8"}],"name":"M_I_N_T","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cansHeOwn","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"cansLeft","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"token","type":"uint8"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"setCansLeft","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":"switchMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600960006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600981526020017f52656b742043616e7a00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524b4300000000000000000000000000000000000000000000000000000000008152508160009081620000aa9190620006c7565b508060019081620000bc9190620006c7565b505050620000df620000d36200037f60201b60201c565b6200038760201b60201c565b6103e8600a60008060ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506103e8600a6000600160ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506103e8600a6000600260ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506103e8600a6000600360ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506103e8600a6000600460ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff16021790555060fa600a6000600560ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506064600a6000600660ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff16021790555060fa600a6000600760ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff16021790555060fa600a6000600860ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff16021790555060fa600a6000600960ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506032600a6000600a60ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506096600a6000600b60ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550600a806000600c60ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550620007ae565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004cf57607f821691505b602082108103620004e557620004e462000487565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200054f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000510565b6200055b868362000510565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005a8620005a26200059c8462000573565b6200057d565b62000573565b9050919050565b6000819050919050565b620005c48362000587565b620005dc620005d382620005af565b8484546200051d565b825550505050565b600090565b620005f3620005e4565b62000600818484620005b9565b505050565b5b8181101562000628576200061c600082620005e9565b60018101905062000606565b5050565b601f82111562000677576200064181620004eb565b6200064c8462000500565b810160208510156200065c578190505b620006746200066b8562000500565b83018262000605565b50505b505050565b600082821c905092915050565b60006200069c600019846008026200067c565b1980831691505092915050565b6000620006b7838362000689565b9150826002028217905092915050565b620006d2826200044d565b67ffffffffffffffff811115620006ee57620006ed62000458565b5b620006fa8254620004b6565b620007078282856200062c565b600060209050601f8311600181146200073f57600084156200072a578287015190505b620007368582620006a9565b865550620007a6565b601f1984166200074f86620004eb565b60005b82811015620007795784890151825560018201915060208501945060208101905062000752565b8683101562000799578489015162000795601f89168262000689565b8355505b6001600288020188555050505b505050505050565b613de980620007be6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde14610339578063c87b56dd14610355578063dfb4b16414610385578063e985e9c5146103b5578063f2fde38b146103e5578063fc1fc5c31461040157610142565b8063715018a6146102bb5780637362c115146102c55780638da5cb5b146102e157806395d89b41146102ff578063a22cb4651461031d57610142565b806323b872dd1161010a57806323b872dd146101fd57806336bf9e301461021957806342842e0e1461022357806355f804b31461023f5780636352211e1461025b57806370a082311461028b57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c55780630f9372ab146101e1575b600080fd5b610161600480360381019061015c9190612452565b610431565b60405161016e919061249a565b60405180910390f35b61017f610513565b60405161018c919061254e565b60405180910390f35b6101af60048036038101906101aa91906125a6565b6105a5565b6040516101bc9190612614565b60405180910390f35b6101df60048036038101906101da919061265b565b61062a565b005b6101fb60048036038101906101f6919061270e565b610741565b005b6102176004803603810190610212919061274e565b6107f5565b005b610221610855565b005b61023d6004803603810190610238919061274e565b6108fd565b005b610259600480360381019061025491906128d6565b61091d565b005b610275600480360381019061027091906125a6565b6109ac565b6040516102829190612614565b60405180910390f35b6102a560048036038101906102a0919061291f565b610a5d565b6040516102b2919061295b565b60405180910390f35b6102c3610b14565b005b6102df60048036038101906102da9190612976565b610b9c565b005b6102e9611156565b6040516102f69190612614565b60405180910390f35b610307611180565b604051610314919061254e565b60405180910390f35b610337600480360381019061033291906129e2565b611212565b005b610353600480360381019061034e9190612ac3565b611228565b005b61036f600480360381019061036a91906125a6565b61128a565b60405161037c919061254e565b60405180910390f35b61039f600480360381019061039a9190612b46565b6113db565b6040516103ac9190612b82565b60405180910390f35b6103cf60048036038101906103ca9190612b9d565b6113fc565b6040516103dc919061249a565b60405180910390f35b6103ff60048036038101906103fa919061291f565b611490565b005b61041b6004803603810190610416919061291f565b611587565b604051610428919061254e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061050c575061050b82611627565b5b9050919050565b60606000805461052290612c0c565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90612c0c565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b082611691565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690612caf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610635826109ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069c90612d41565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c46116fd565b73ffffffffffffffffffffffffffffffffffffffff1614806106f357506106f2816106ed6116fd565b6113fc565b5b610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990612dd3565b60405180910390fd5b61073c8383611705565b505050565b6107496116fd565b73ffffffffffffffffffffffffffffffffffffffff16610767611156565b73ffffffffffffffffffffffffffffffffffffffff16146107bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b490612e3f565b60405180910390fd5b80600a60008460ff1660ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505050565b6108066108006116fd565b826117be565b610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083c90612ed1565b60405180910390fd5b61085083838361189c565b505050565b61085d6116fd565b73ffffffffffffffffffffffffffffffffffffffff1661087b611156565b73ffffffffffffffffffffffffffffffffffffffff16146108d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c890612e3f565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b61091883838360405180602001604052806000815250611228565b505050565b6109256116fd565b73ffffffffffffffffffffffffffffffffffffffff16610943611156565b73ffffffffffffffffffffffffffffffffffffffff1614610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090612e3f565b60405180910390fd5b80600890816109a8919061309d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b906131e1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac490613273565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b1c6116fd565b73ffffffffffffffffffffffffffffffffffffffff16610b3a611156565b73ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790612e3f565b60405180910390fd5b610b9a6000611b02565b565b600960009054906101000a900460ff1615610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be3906132df565b60405180910390fd5b6003600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1610610c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7590613371565b60405180910390fd5b60048160ff161115610d21576002600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1603610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d13906133dd565b60405180910390fd5b610db4565b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1603610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90613449565b60405180910390fd5b5b6000600a60008360ff1660ff16815260200190815260200160002060009054906101000a900461ffff1661ffff16148015610df2575060048160ff16105b15610e575760005b60048160ff161015610e55576000600a60008360ff1660ff16815260200190815260200160002060009054906101000a900461ffff1661ffff161115610e4257809150600490505b8080610e4d90613498565b915050610dfa565b505b6000600a60008360ff1660ff16815260200190815260200160002060009054906101000a900461ffff1661ffff1611610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc9061350d565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1603610fe35760048160ff1610610f84576002600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055610fdd565b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555b5061103d565b6003600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b6001600a60008360ff1660ff16815260200190815260200160002060008282829054906101000a900461ffff16611074919061352d565b92506101000a81548161ffff021916908361ffff160217905550600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206110d98260ff16611bc8565b6040516020016110ea929190613620565b604051602081830303815290604052600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209081611144919061309d565b50611152828260ff16611d28565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461118f90612c0c565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb90612c0c565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b5050505050905090565b61122461121d6116fd565b8383611d46565b5050565b6112396112336116fd565b836117be565b611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90612ed1565b60405180910390fd5b61128484848484611eb2565b50505050565b606061129582611691565b6112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb906136b6565b60405180910390fd5b60006006600084815260200190815260200160002080546112f490612c0c565b80601f016020809104026020016040519081016040528092919081815260200182805461132090612c0c565b801561136d5780601f106113425761010080835404028352916020019161136d565b820191906000526020600020905b81548152906001019060200180831161135057829003601f168201915b50505050509050600061137e611f0e565b905060008151036113935781925050506113d6565b6000825111156113c85780826040516020016113b09291906136d6565b604051602081830303815290604052925050506113d6565b6113d184611fa0565b925050505b919050565b600a6020528060005260406000206000915054906101000a900461ffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114986116fd565b73ffffffffffffffffffffffffffffffffffffffff166114b6611156565b73ffffffffffffffffffffffffffffffffffffffff161461150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390612e3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361157b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115729061376c565b60405180910390fd5b61158481611b02565b50565b600c60205280600052604060002060009150905080546115a690612c0c565b80601f01602080910402602001604051908101604052809291908181526020018280546115d290612c0c565b801561161f5780601f106115f45761010080835404028352916020019161161f565b820191906000526020600020905b81548152906001019060200180831161160257829003601f168201915b505050505081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611778836109ac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117c982611691565b611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff906137fe565b60405180910390fd5b6000611813836109ac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611855575061185481856113fc565b5b8061189357508373ffffffffffffffffffffffffffffffffffffffff1661187b846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118bc826109ac565b73ffffffffffffffffffffffffffffffffffffffff1614611912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190990613890565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890613922565b60405180910390fd5b61198c838383612047565b611997600082611705565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e79190613942565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a3e9190613976565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611afd83838361204c565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060008203611c0f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d23565b600082905060005b60008214611c41578080611c2a906139cc565b915050600a82611c3a9190613a43565b9150611c17565b60008167ffffffffffffffff811115611c5d57611c5c6127ab565b5b6040519080825280601f01601f191660200182016040528015611c8f5781602001600182028036833780820191505090505b5090505b60008514611d1c57600182611ca89190613942565b9150600a85611cb79190613a74565b6030611cc39190613976565b60f81b818381518110611cd957611cd8613aa5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d159190613a43565b9450611c93565b8093505050505b919050565b611d42828260405180602001604052806000815250612051565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90613b20565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea5919061249a565b60405180910390a3505050565b611ebd84848461189c565b611ec9848484846120ac565b611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90613bb2565b60405180910390fd5b50505050565b606060088054611f1d90612c0c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4990612c0c565b8015611f965780601f10611f6b57610100808354040283529160200191611f96565b820191906000526020600020905b815481529060010190602001808311611f7957829003601f168201915b5050505050905090565b6060611fab82611691565b611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190613c44565b60405180910390fd5b6000611ff4611f0e565b90506000815111612014576040518060200160405280600081525061203f565b8061201e84611bc8565b60405160200161202f9291906136d6565b6040516020818303038152906040525b915050919050565b505050565b505050565b61205b8383612233565b61206860008484846120ac565b6120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90613bb2565b60405180910390fd5b505050565b60006120cd8473ffffffffffffffffffffffffffffffffffffffff166123c3565b15612226578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120f66116fd565b8786866040518563ffffffff1660e01b81526004016121189493929190613cb9565b6020604051808303816000875af192505050801561215457506040513d601f19601f820116820180604052508101906121519190613d1a565b60015b6121d6573d8060008114612184576040519150601f19603f3d011682016040523d82523d6000602084013e612189565b606091505b5060008151036121ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c590613bb2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061222b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229990613d93565b60405180910390fd5b6122ae60008383612047565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122fe9190613976565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123bf6000838361204c565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61242f816123fa565b811461243a57600080fd5b50565b60008135905061244c81612426565b92915050565b600060208284031215612468576124676123f0565b5b60006124768482850161243d565b91505092915050565b60008115159050919050565b6124948161247f565b82525050565b60006020820190506124af600083018461248b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124ef5780820151818401526020810190506124d4565b838111156124fe576000848401525b50505050565b6000601f19601f8301169050919050565b6000612520826124b5565b61252a81856124c0565b935061253a8185602086016124d1565b61254381612504565b840191505092915050565b600060208201905081810360008301526125688184612515565b905092915050565b6000819050919050565b61258381612570565b811461258e57600080fd5b50565b6000813590506125a08161257a565b92915050565b6000602082840312156125bc576125bb6123f0565b5b60006125ca84828501612591565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125fe826125d3565b9050919050565b61260e816125f3565b82525050565b60006020820190506126296000830184612605565b92915050565b612638816125f3565b811461264357600080fd5b50565b6000813590506126558161262f565b92915050565b60008060408385031215612672576126716123f0565b5b600061268085828601612646565b925050602061269185828601612591565b9150509250929050565b600060ff82169050919050565b6126b18161269b565b81146126bc57600080fd5b50565b6000813590506126ce816126a8565b92915050565b600061ffff82169050919050565b6126eb816126d4565b81146126f657600080fd5b50565b600081359050612708816126e2565b92915050565b60008060408385031215612725576127246123f0565b5b6000612733858286016126bf565b9250506020612744858286016126f9565b9150509250929050565b600080600060608486031215612767576127666123f0565b5b600061277586828701612646565b935050602061278686828701612646565b925050604061279786828701612591565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6127e382612504565b810181811067ffffffffffffffff82111715612802576128016127ab565b5b80604052505050565b60006128156123e6565b905061282182826127da565b919050565b600067ffffffffffffffff821115612841576128406127ab565b5b61284a82612504565b9050602081019050919050565b82818337600083830152505050565b600061287961287484612826565b61280b565b905082815260208101848484011115612895576128946127a6565b5b6128a0848285612857565b509392505050565b600082601f8301126128bd576128bc6127a1565b5b81356128cd848260208601612866565b91505092915050565b6000602082840312156128ec576128eb6123f0565b5b600082013567ffffffffffffffff81111561290a576129096123f5565b5b612916848285016128a8565b91505092915050565b600060208284031215612935576129346123f0565b5b600061294384828501612646565b91505092915050565b61295581612570565b82525050565b6000602082019050612970600083018461294c565b92915050565b6000806040838503121561298d5761298c6123f0565b5b600061299b85828601612646565b92505060206129ac858286016126bf565b9150509250929050565b6129bf8161247f565b81146129ca57600080fd5b50565b6000813590506129dc816129b6565b92915050565b600080604083850312156129f9576129f86123f0565b5b6000612a0785828601612646565b9250506020612a18858286016129cd565b9150509250929050565b600067ffffffffffffffff821115612a3d57612a3c6127ab565b5b612a4682612504565b9050602081019050919050565b6000612a66612a6184612a22565b61280b565b905082815260208101848484011115612a8257612a816127a6565b5b612a8d848285612857565b509392505050565b600082601f830112612aaa57612aa96127a1565b5b8135612aba848260208601612a53565b91505092915050565b60008060008060808587031215612add57612adc6123f0565b5b6000612aeb87828801612646565b9450506020612afc87828801612646565b9350506040612b0d87828801612591565b925050606085013567ffffffffffffffff811115612b2e57612b2d6123f5565b5b612b3a87828801612a95565b91505092959194509250565b600060208284031215612b5c57612b5b6123f0565b5b6000612b6a848285016126bf565b91505092915050565b612b7c816126d4565b82525050565b6000602082019050612b976000830184612b73565b92915050565b60008060408385031215612bb457612bb36123f0565b5b6000612bc285828601612646565b9250506020612bd385828601612646565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c2457607f821691505b602082108103612c3757612c36612bdd565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c99602c836124c0565b9150612ca482612c3d565b604082019050919050565b60006020820190508181036000830152612cc881612c8c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d2b6021836124c0565b9150612d3682612ccf565b604082019050919050565b60006020820190508181036000830152612d5a81612d1e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612dbd6038836124c0565b9150612dc882612d61565b604082019050919050565b60006020820190508181036000830152612dec81612db0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e296020836124c0565b9150612e3482612df3565b602082019050919050565b60006020820190508181036000830152612e5881612e1c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612ebb6031836124c0565b9150612ec682612e5f565b604082019050919050565b60006020820190508181036000830152612eea81612eae565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612f537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612f16565b612f5d8683612f16565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612f9a612f95612f9084612570565b612f75565b612570565b9050919050565b6000819050919050565b612fb483612f7f565b612fc8612fc082612fa1565b848454612f23565b825550505050565b600090565b612fdd612fd0565b612fe8818484612fab565b505050565b5b8181101561300c57613001600082612fd5565b600181019050612fee565b5050565b601f8211156130515761302281612ef1565b61302b84612f06565b8101602085101561303a578190505b61304e61304685612f06565b830182612fed565b50505b505050565b600082821c905092915050565b600061307460001984600802613056565b1980831691505092915050565b600061308d8383613063565b9150826002028217905092915050565b6130a6826124b5565b67ffffffffffffffff8111156130bf576130be6127ab565b5b6130c98254612c0c565b6130d4828285613010565b600060209050601f83116001811461310757600084156130f5578287015190505b6130ff8582613081565b865550613167565b601f19841661311586612ef1565b60005b8281101561313d57848901518255600182019150602085019450602081019050613118565b8683101561315a5784890151613156601f891682613063565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006131cb6029836124c0565b91506131d68261316f565b604082019050919050565b600060208201905081810360008301526131fa816131be565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061325d602a836124c0565b915061326882613201565b604082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b7f4d696e7420697320506175736564000000000000000000000000000000000000600082015250565b60006132c9600e836124c0565b91506132d482613293565b602082019050919050565b600060208201905081810360008301526132f8816132bc565b9050919050565b7f43616e206f6e6c79206d696e74206f6e6520636f6c6c61622063616e20616e6460008201527f206f6e6520636f6d756e6e6974792063616e0000000000000000000000000000602082015250565b600061335b6032836124c0565b9150613366826132ff565b604082019050919050565b6000602082019050818103600083015261338a8161334e565b9050919050565b7f43616e206f6e6c79206d696e74206f6e6520636f6c6c61622063616e00000000600082015250565b60006133c7601c836124c0565b91506133d282613391565b602082019050919050565b600060208201905081810360008301526133f6816133ba565b9050919050565b7f43616e206f6e6c79206d696e74206f6e6520636f6d756e6974792063616e0000600082015250565b6000613433601e836124c0565b915061343e826133fd565b602082019050919050565b6000602082019050818103600083015261346281613426565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134a38261269b565b915060ff82036134b6576134b5613469565b5b600182019050919050565b7f546869732063616e20736f6c64206f7574000000000000000000000000000000600082015250565b60006134f76011836124c0565b9150613502826134c1565b602082019050919050565b60006020820190508181036000830152613526816134ea565b9050919050565b6000613538826126d4565b9150613543836126d4565b92508282101561355657613555613469565b5b828203905092915050565b600081905092915050565b6000815461357981612c0c565b6135838186613561565b9450600182166000811461359e57600181146135b3576135e6565b60ff19831686528115158202860193506135e6565b6135bc85612ef1565b60005b838110156135de578154818901526001820191506020810190506135bf565b838801955050505b50505092915050565b60006135fa826124b5565b6136048185613561565b93506136148185602086016124d1565b80840191505092915050565b600061362c828561356c565b915061363882846135ef565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006136a06031836124c0565b91506136ab82613644565b604082019050919050565b600060208201905081810360008301526136cf81613693565b9050919050565b60006136e282856135ef565b91506136ee82846135ef565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137566026836124c0565b9150613761826136fa565b604082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006137e8602c836124c0565b91506137f38261378c565b604082019050919050565b60006020820190508181036000830152613817816137db565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061387a6025836124c0565b91506138858261381e565b604082019050919050565b600060208201905081810360008301526138a98161386d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061390c6024836124c0565b9150613917826138b0565b604082019050919050565b6000602082019050818103600083015261393b816138ff565b9050919050565b600061394d82612570565b915061395883612570565b92508282101561396b5761396a613469565b5b828203905092915050565b600061398182612570565b915061398c83612570565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139c1576139c0613469565b5b828201905092915050565b60006139d782612570565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a0957613a08613469565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a4e82612570565b9150613a5983612570565b925082613a6957613a68613a14565b5b828204905092915050565b6000613a7f82612570565b9150613a8a83612570565b925082613a9a57613a99613a14565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613b0a6019836124c0565b9150613b1582613ad4565b602082019050919050565b60006020820190508181036000830152613b3981613afd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613b9c6032836124c0565b9150613ba782613b40565b604082019050919050565b60006020820190508181036000830152613bcb81613b8f565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c2e602f836124c0565b9150613c3982613bd2565b604082019050919050565b60006020820190508181036000830152613c5d81613c21565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c8b82613c64565b613c958185613c6f565b9350613ca58185602086016124d1565b613cae81612504565b840191505092915050565b6000608082019050613cce6000830187612605565b613cdb6020830186612605565b613ce8604083018561294c565b8181036060830152613cfa8184613c80565b905095945050505050565b600081519050613d1481612426565b92915050565b600060208284031215613d3057613d2f6123f0565b5b6000613d3e84828501613d05565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613d7d6020836124c0565b9150613d8882613d47565b602082019050919050565b60006020820190508181036000830152613dac81613d70565b905091905056fea2646970667358221220e7a3ee4f8d486245ad3efc3930abea2e45559de9aadd2bd7acc6fca8ec8bf18c64736f6c634300080f0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde14610339578063c87b56dd14610355578063dfb4b16414610385578063e985e9c5146103b5578063f2fde38b146103e5578063fc1fc5c31461040157610142565b8063715018a6146102bb5780637362c115146102c55780638da5cb5b146102e157806395d89b41146102ff578063a22cb4651461031d57610142565b806323b872dd1161010a57806323b872dd146101fd57806336bf9e301461021957806342842e0e1461022357806355f804b31461023f5780636352211e1461025b57806370a082311461028b57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c55780630f9372ab146101e1575b600080fd5b610161600480360381019061015c9190612452565b610431565b60405161016e919061249a565b60405180910390f35b61017f610513565b60405161018c919061254e565b60405180910390f35b6101af60048036038101906101aa91906125a6565b6105a5565b6040516101bc9190612614565b60405180910390f35b6101df60048036038101906101da919061265b565b61062a565b005b6101fb60048036038101906101f6919061270e565b610741565b005b6102176004803603810190610212919061274e565b6107f5565b005b610221610855565b005b61023d6004803603810190610238919061274e565b6108fd565b005b610259600480360381019061025491906128d6565b61091d565b005b610275600480360381019061027091906125a6565b6109ac565b6040516102829190612614565b60405180910390f35b6102a560048036038101906102a0919061291f565b610a5d565b6040516102b2919061295b565b60405180910390f35b6102c3610b14565b005b6102df60048036038101906102da9190612976565b610b9c565b005b6102e9611156565b6040516102f69190612614565b60405180910390f35b610307611180565b604051610314919061254e565b60405180910390f35b610337600480360381019061033291906129e2565b611212565b005b610353600480360381019061034e9190612ac3565b611228565b005b61036f600480360381019061036a91906125a6565b61128a565b60405161037c919061254e565b60405180910390f35b61039f600480360381019061039a9190612b46565b6113db565b6040516103ac9190612b82565b60405180910390f35b6103cf60048036038101906103ca9190612b9d565b6113fc565b6040516103dc919061249a565b60405180910390f35b6103ff60048036038101906103fa919061291f565b611490565b005b61041b6004803603810190610416919061291f565b611587565b604051610428919061254e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061050c575061050b82611627565b5b9050919050565b60606000805461052290612c0c565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90612c0c565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b082611691565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690612caf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610635826109ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069c90612d41565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c46116fd565b73ffffffffffffffffffffffffffffffffffffffff1614806106f357506106f2816106ed6116fd565b6113fc565b5b610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990612dd3565b60405180910390fd5b61073c8383611705565b505050565b6107496116fd565b73ffffffffffffffffffffffffffffffffffffffff16610767611156565b73ffffffffffffffffffffffffffffffffffffffff16146107bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b490612e3f565b60405180910390fd5b80600a60008460ff1660ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505050565b6108066108006116fd565b826117be565b610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083c90612ed1565b60405180910390fd5b61085083838361189c565b505050565b61085d6116fd565b73ffffffffffffffffffffffffffffffffffffffff1661087b611156565b73ffffffffffffffffffffffffffffffffffffffff16146108d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c890612e3f565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b61091883838360405180602001604052806000815250611228565b505050565b6109256116fd565b73ffffffffffffffffffffffffffffffffffffffff16610943611156565b73ffffffffffffffffffffffffffffffffffffffff1614610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090612e3f565b60405180910390fd5b80600890816109a8919061309d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b906131e1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac490613273565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b1c6116fd565b73ffffffffffffffffffffffffffffffffffffffff16610b3a611156565b73ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790612e3f565b60405180910390fd5b610b9a6000611b02565b565b600960009054906101000a900460ff1615610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be3906132df565b60405180910390fd5b6003600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1610610c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7590613371565b60405180910390fd5b60048160ff161115610d21576002600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1603610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d13906133dd565b60405180910390fd5b610db4565b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1603610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90613449565b60405180910390fd5b5b6000600a60008360ff1660ff16815260200190815260200160002060009054906101000a900461ffff1661ffff16148015610df2575060048160ff16105b15610e575760005b60048160ff161015610e55576000600a60008360ff1660ff16815260200190815260200160002060009054906101000a900461ffff1661ffff161115610e4257809150600490505b8080610e4d90613498565b915050610dfa565b505b6000600a60008360ff1660ff16815260200190815260200160002060009054906101000a900461ffff1661ffff1611610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc9061350d565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1603610fe35760048160ff1610610f84576002600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055610fdd565b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555b5061103d565b6003600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b6001600a60008360ff1660ff16815260200190815260200160002060008282829054906101000a900461ffff16611074919061352d565b92506101000a81548161ffff021916908361ffff160217905550600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206110d98260ff16611bc8565b6040516020016110ea929190613620565b604051602081830303815290604052600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209081611144919061309d565b50611152828260ff16611d28565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461118f90612c0c565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb90612c0c565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b5050505050905090565b61122461121d6116fd565b8383611d46565b5050565b6112396112336116fd565b836117be565b611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90612ed1565b60405180910390fd5b61128484848484611eb2565b50505050565b606061129582611691565b6112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb906136b6565b60405180910390fd5b60006006600084815260200190815260200160002080546112f490612c0c565b80601f016020809104026020016040519081016040528092919081815260200182805461132090612c0c565b801561136d5780601f106113425761010080835404028352916020019161136d565b820191906000526020600020905b81548152906001019060200180831161135057829003601f168201915b50505050509050600061137e611f0e565b905060008151036113935781925050506113d6565b6000825111156113c85780826040516020016113b09291906136d6565b604051602081830303815290604052925050506113d6565b6113d184611fa0565b925050505b919050565b600a6020528060005260406000206000915054906101000a900461ffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114986116fd565b73ffffffffffffffffffffffffffffffffffffffff166114b6611156565b73ffffffffffffffffffffffffffffffffffffffff161461150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390612e3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361157b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115729061376c565b60405180910390fd5b61158481611b02565b50565b600c60205280600052604060002060009150905080546115a690612c0c565b80601f01602080910402602001604051908101604052809291908181526020018280546115d290612c0c565b801561161f5780601f106115f45761010080835404028352916020019161161f565b820191906000526020600020905b81548152906001019060200180831161160257829003601f168201915b505050505081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611778836109ac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117c982611691565b611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff906137fe565b60405180910390fd5b6000611813836109ac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611855575061185481856113fc565b5b8061189357508373ffffffffffffffffffffffffffffffffffffffff1661187b846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118bc826109ac565b73ffffffffffffffffffffffffffffffffffffffff1614611912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190990613890565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890613922565b60405180910390fd5b61198c838383612047565b611997600082611705565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e79190613942565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a3e9190613976565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611afd83838361204c565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060008203611c0f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d23565b600082905060005b60008214611c41578080611c2a906139cc565b915050600a82611c3a9190613a43565b9150611c17565b60008167ffffffffffffffff811115611c5d57611c5c6127ab565b5b6040519080825280601f01601f191660200182016040528015611c8f5781602001600182028036833780820191505090505b5090505b60008514611d1c57600182611ca89190613942565b9150600a85611cb79190613a74565b6030611cc39190613976565b60f81b818381518110611cd957611cd8613aa5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d159190613a43565b9450611c93565b8093505050505b919050565b611d42828260405180602001604052806000815250612051565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90613b20565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea5919061249a565b60405180910390a3505050565b611ebd84848461189c565b611ec9848484846120ac565b611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90613bb2565b60405180910390fd5b50505050565b606060088054611f1d90612c0c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4990612c0c565b8015611f965780601f10611f6b57610100808354040283529160200191611f96565b820191906000526020600020905b815481529060010190602001808311611f7957829003601f168201915b5050505050905090565b6060611fab82611691565b611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190613c44565b60405180910390fd5b6000611ff4611f0e565b90506000815111612014576040518060200160405280600081525061203f565b8061201e84611bc8565b60405160200161202f9291906136d6565b6040516020818303038152906040525b915050919050565b505050565b505050565b61205b8383612233565b61206860008484846120ac565b6120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90613bb2565b60405180910390fd5b505050565b60006120cd8473ffffffffffffffffffffffffffffffffffffffff166123c3565b15612226578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120f66116fd565b8786866040518563ffffffff1660e01b81526004016121189493929190613cb9565b6020604051808303816000875af192505050801561215457506040513d601f19601f820116820180604052508101906121519190613d1a565b60015b6121d6573d8060008114612184576040519150601f19603f3d011682016040523d82523d6000602084013e612189565b606091505b5060008151036121ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c590613bb2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061222b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229990613d93565b60405180910390fd5b6122ae60008383612047565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122fe9190613976565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123bf6000838361204c565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61242f816123fa565b811461243a57600080fd5b50565b60008135905061244c81612426565b92915050565b600060208284031215612468576124676123f0565b5b60006124768482850161243d565b91505092915050565b60008115159050919050565b6124948161247f565b82525050565b60006020820190506124af600083018461248b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124ef5780820151818401526020810190506124d4565b838111156124fe576000848401525b50505050565b6000601f19601f8301169050919050565b6000612520826124b5565b61252a81856124c0565b935061253a8185602086016124d1565b61254381612504565b840191505092915050565b600060208201905081810360008301526125688184612515565b905092915050565b6000819050919050565b61258381612570565b811461258e57600080fd5b50565b6000813590506125a08161257a565b92915050565b6000602082840312156125bc576125bb6123f0565b5b60006125ca84828501612591565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125fe826125d3565b9050919050565b61260e816125f3565b82525050565b60006020820190506126296000830184612605565b92915050565b612638816125f3565b811461264357600080fd5b50565b6000813590506126558161262f565b92915050565b60008060408385031215612672576126716123f0565b5b600061268085828601612646565b925050602061269185828601612591565b9150509250929050565b600060ff82169050919050565b6126b18161269b565b81146126bc57600080fd5b50565b6000813590506126ce816126a8565b92915050565b600061ffff82169050919050565b6126eb816126d4565b81146126f657600080fd5b50565b600081359050612708816126e2565b92915050565b60008060408385031215612725576127246123f0565b5b6000612733858286016126bf565b9250506020612744858286016126f9565b9150509250929050565b600080600060608486031215612767576127666123f0565b5b600061277586828701612646565b935050602061278686828701612646565b925050604061279786828701612591565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6127e382612504565b810181811067ffffffffffffffff82111715612802576128016127ab565b5b80604052505050565b60006128156123e6565b905061282182826127da565b919050565b600067ffffffffffffffff821115612841576128406127ab565b5b61284a82612504565b9050602081019050919050565b82818337600083830152505050565b600061287961287484612826565b61280b565b905082815260208101848484011115612895576128946127a6565b5b6128a0848285612857565b509392505050565b600082601f8301126128bd576128bc6127a1565b5b81356128cd848260208601612866565b91505092915050565b6000602082840312156128ec576128eb6123f0565b5b600082013567ffffffffffffffff81111561290a576129096123f5565b5b612916848285016128a8565b91505092915050565b600060208284031215612935576129346123f0565b5b600061294384828501612646565b91505092915050565b61295581612570565b82525050565b6000602082019050612970600083018461294c565b92915050565b6000806040838503121561298d5761298c6123f0565b5b600061299b85828601612646565b92505060206129ac858286016126bf565b9150509250929050565b6129bf8161247f565b81146129ca57600080fd5b50565b6000813590506129dc816129b6565b92915050565b600080604083850312156129f9576129f86123f0565b5b6000612a0785828601612646565b9250506020612a18858286016129cd565b9150509250929050565b600067ffffffffffffffff821115612a3d57612a3c6127ab565b5b612a4682612504565b9050602081019050919050565b6000612a66612a6184612a22565b61280b565b905082815260208101848484011115612a8257612a816127a6565b5b612a8d848285612857565b509392505050565b600082601f830112612aaa57612aa96127a1565b5b8135612aba848260208601612a53565b91505092915050565b60008060008060808587031215612add57612adc6123f0565b5b6000612aeb87828801612646565b9450506020612afc87828801612646565b9350506040612b0d87828801612591565b925050606085013567ffffffffffffffff811115612b2e57612b2d6123f5565b5b612b3a87828801612a95565b91505092959194509250565b600060208284031215612b5c57612b5b6123f0565b5b6000612b6a848285016126bf565b91505092915050565b612b7c816126d4565b82525050565b6000602082019050612b976000830184612b73565b92915050565b60008060408385031215612bb457612bb36123f0565b5b6000612bc285828601612646565b9250506020612bd385828601612646565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c2457607f821691505b602082108103612c3757612c36612bdd565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c99602c836124c0565b9150612ca482612c3d565b604082019050919050565b60006020820190508181036000830152612cc881612c8c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d2b6021836124c0565b9150612d3682612ccf565b604082019050919050565b60006020820190508181036000830152612d5a81612d1e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612dbd6038836124c0565b9150612dc882612d61565b604082019050919050565b60006020820190508181036000830152612dec81612db0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e296020836124c0565b9150612e3482612df3565b602082019050919050565b60006020820190508181036000830152612e5881612e1c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612ebb6031836124c0565b9150612ec682612e5f565b604082019050919050565b60006020820190508181036000830152612eea81612eae565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612f537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612f16565b612f5d8683612f16565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612f9a612f95612f9084612570565b612f75565b612570565b9050919050565b6000819050919050565b612fb483612f7f565b612fc8612fc082612fa1565b848454612f23565b825550505050565b600090565b612fdd612fd0565b612fe8818484612fab565b505050565b5b8181101561300c57613001600082612fd5565b600181019050612fee565b5050565b601f8211156130515761302281612ef1565b61302b84612f06565b8101602085101561303a578190505b61304e61304685612f06565b830182612fed565b50505b505050565b600082821c905092915050565b600061307460001984600802613056565b1980831691505092915050565b600061308d8383613063565b9150826002028217905092915050565b6130a6826124b5565b67ffffffffffffffff8111156130bf576130be6127ab565b5b6130c98254612c0c565b6130d4828285613010565b600060209050601f83116001811461310757600084156130f5578287015190505b6130ff8582613081565b865550613167565b601f19841661311586612ef1565b60005b8281101561313d57848901518255600182019150602085019450602081019050613118565b8683101561315a5784890151613156601f891682613063565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006131cb6029836124c0565b91506131d68261316f565b604082019050919050565b600060208201905081810360008301526131fa816131be565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061325d602a836124c0565b915061326882613201565b604082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b7f4d696e7420697320506175736564000000000000000000000000000000000000600082015250565b60006132c9600e836124c0565b91506132d482613293565b602082019050919050565b600060208201905081810360008301526132f8816132bc565b9050919050565b7f43616e206f6e6c79206d696e74206f6e6520636f6c6c61622063616e20616e6460008201527f206f6e6520636f6d756e6e6974792063616e0000000000000000000000000000602082015250565b600061335b6032836124c0565b9150613366826132ff565b604082019050919050565b6000602082019050818103600083015261338a8161334e565b9050919050565b7f43616e206f6e6c79206d696e74206f6e6520636f6c6c61622063616e00000000600082015250565b60006133c7601c836124c0565b91506133d282613391565b602082019050919050565b600060208201905081810360008301526133f6816133ba565b9050919050565b7f43616e206f6e6c79206d696e74206f6e6520636f6d756e6974792063616e0000600082015250565b6000613433601e836124c0565b915061343e826133fd565b602082019050919050565b6000602082019050818103600083015261346281613426565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134a38261269b565b915060ff82036134b6576134b5613469565b5b600182019050919050565b7f546869732063616e20736f6c64206f7574000000000000000000000000000000600082015250565b60006134f76011836124c0565b9150613502826134c1565b602082019050919050565b60006020820190508181036000830152613526816134ea565b9050919050565b6000613538826126d4565b9150613543836126d4565b92508282101561355657613555613469565b5b828203905092915050565b600081905092915050565b6000815461357981612c0c565b6135838186613561565b9450600182166000811461359e57600181146135b3576135e6565b60ff19831686528115158202860193506135e6565b6135bc85612ef1565b60005b838110156135de578154818901526001820191506020810190506135bf565b838801955050505b50505092915050565b60006135fa826124b5565b6136048185613561565b93506136148185602086016124d1565b80840191505092915050565b600061362c828561356c565b915061363882846135ef565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006136a06031836124c0565b91506136ab82613644565b604082019050919050565b600060208201905081810360008301526136cf81613693565b9050919050565b60006136e282856135ef565b91506136ee82846135ef565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137566026836124c0565b9150613761826136fa565b604082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006137e8602c836124c0565b91506137f38261378c565b604082019050919050565b60006020820190508181036000830152613817816137db565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061387a6025836124c0565b91506138858261381e565b604082019050919050565b600060208201905081810360008301526138a98161386d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061390c6024836124c0565b9150613917826138b0565b604082019050919050565b6000602082019050818103600083015261393b816138ff565b9050919050565b600061394d82612570565b915061395883612570565b92508282101561396b5761396a613469565b5b828203905092915050565b600061398182612570565b915061398c83612570565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139c1576139c0613469565b5b828201905092915050565b60006139d782612570565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a0957613a08613469565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a4e82612570565b9150613a5983612570565b925082613a6957613a68613a14565b5b828204905092915050565b6000613a7f82612570565b9150613a8a83612570565b925082613a9a57613a99613a14565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613b0a6019836124c0565b9150613b1582613ad4565b602082019050919050565b60006020820190508181036000830152613b3981613afd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613b9c6032836124c0565b9150613ba782613b40565b604082019050919050565b60006020820190508181036000830152613bcb81613b8f565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c2e602f836124c0565b9150613c3982613bd2565b604082019050919050565b60006020820190508181036000830152613c5d81613c21565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c8b82613c64565b613c958185613c6f565b9350613ca58185602086016124d1565b613cae81612504565b840191505092915050565b6000608082019050613cce6000830187612605565b613cdb6020830186612605565b613ce8604083018561294c565b8181036060830152613cfa8184613c80565b905095945050505050565b600081519050613d1481612426565b92915050565b600060208284031215613d3057613d2f6123f0565b5b6000613d3e84828501613d05565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613d7d6020836124c0565b9150613d8882613d47565b602082019050919050565b60006020820190508181036000830152613dac81613d70565b905091905056fea2646970667358221220e7a3ee4f8d486245ad3efc3930abea2e45559de9aadd2bd7acc6fca8ec8bf18c64736f6c634300080f0033

Deployed Bytecode Sourcemap

39387:3118:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24147:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25080:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26640:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26163:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40722:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27390:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40885:93;;;:::i;:::-;;27800:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40539:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24774:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24504:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;:::i;:::-;;41164:1336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4079:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25249:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26933:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28056:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37763:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39649:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27159:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39826:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24147:293;24249:4;24297:25;24282:40;;;:11;:40;;;;:101;;;;24350:33;24335:48;;;:11;:48;;;;24282:101;:150;;;;24396:36;24420:11;24396:23;:36::i;:::-;24282:150;24266:166;;24147:293;;;:::o;25080:100::-;25134:13;25167:5;25160:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25080:100;:::o;26640:221::-;26716:7;26744:16;26752:7;26744;:16::i;:::-;26736:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26829:15;:24;26845:7;26829:24;;;;;;;;;;;;;;;;;;;;;26822:31;;26640:221;;;:::o;26163:411::-;26244:13;26260:23;26275:7;26260:14;:23::i;:::-;26244:39;;26308:5;26302:11;;:2;:11;;;26294:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26402:5;26386:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26411:37;26428:5;26435:12;:10;:12::i;:::-;26411:16;:37::i;:::-;26386:62;26364:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26545:21;26554:2;26558:7;26545:8;:21::i;:::-;26233:341;26163:411;;:::o;40722:113::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40821:6:::1;40803:8;:15;40812:5;40803:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;40722:113:::0;;:::o;27390:339::-;27585:41;27604:12;:10;:12::i;:::-;27618:7;27585:18;:41::i;:::-;27577:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27693:28;27703:4;27709:2;27713:7;27693:9;:28::i;:::-;27390:339;;;:::o;40885:93::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40959:11:::1;;;;;;;;;;;40958:12;40944:11;;:26;;;;;;;;;;;;;;;;;;40885:93::o:0;27800:185::-;27938:39;27955:4;27961:2;27965:7;27938:39;;;;;;;;;;;;:16;:39::i;:::-;27800:185;;;:::o;40539:111::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40634:8:::1;40615:16;:27;;;;;;:::i;:::-;;40539:111:::0;:::o;24774:239::-;24846:7;24866:13;24882:7;:16;24890:7;24882:16;;;;;;;;;;;;;;;;;;;;;24866:32;;24934:1;24917:19;;:5;:19;;;24909:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25000:5;24993:12;;;24774:239;;;:::o;24504:208::-;24576:7;24621:1;24604:19;;:5;:19;;;24596:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24688:9;:16;24698:5;24688:16;;;;;;;;;;;;;;;;24681:23;;24504:208;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;41164:1336::-;41237:11;;;;;;;;;;;41236:12;41228:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;41308:1;41288:13;:17;41302:2;41288:17;;;;;;;;;;;;;;;;;;;;;;;;;:21;;;41280:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;41390:1;41380:7;:11;;;41377:206;;;41437:1;41416:13;:17;41430:2;41416:17;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;41408:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;41377:206;;;41535:1;41514:13;:17;41528:2;41514:17;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;41506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41377:206;41860:1;41839:8;:17;41848:7;41839:17;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;:37;;;;;41875:1;41865:7;:11;;;41839:37;41836:233;;;41897:7;41893:165;41914:1;41910;:5;;;41893:165;;;41958:1;41944:8;:11;41953:1;41944:11;;;;;;;;;;;;;;;;;;;;;;;;;:15;;;41941:102;;;41994:1;41984:11;;42022:1;42018:5;;41941:102;41917:3;;;;;:::i;:::-;;;;41893:165;;;;41836:233;42138:1;42118:8;:17;42127:7;42118:17;;;;;;;;;;;;;;;;;;;;;;;;;:21;;;42110:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;42198:1;42177:13;:17;42191:2;42177:17;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;42174:167;;42226:1;42216:7;:11;;;:59;;42274:1;42254:13;:17;42268:2;42254:17;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;42216:59;;;42250:1;42230:13;:17;42244:2;42230:17;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;42216:59;;42174:167;;;42328:1;42308:13;:17;42322:2;42308:17;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42174:167;42374:1;42353:8;:17;42362:7;42353:17;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42416:9;:13;42426:2;42416:13;;;;;;;;;;;;;;;42431:25;42448:7;42431:25;;:16;:25::i;:::-;42402:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42386:9;:13;42396:2;42386:13;;;;;;;;;;;;;;;:71;;;;;;:::i;:::-;;42468:22;42478:2;42482:7;42468:22;;:9;:22::i;:::-;41164:1336;;:::o;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;25249:104::-;25305:13;25338:7;25331:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25249:104;:::o;26933:155::-;27028:52;27047:12;:10;:12::i;:::-;27061:8;27071;27028:18;:52::i;:::-;26933:155;;:::o;28056:328::-;28231:41;28250:12;:10;:12::i;:::-;28264:7;28231:18;:41::i;:::-;28223:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28337:39;28351:4;28357:2;28361:7;28370:5;28337:13;:39::i;:::-;28056:328;;;;:::o;37763:679::-;37836:13;37870:16;37878:7;37870;:16::i;:::-;37862:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;37953:23;37979:10;:19;37990:7;37979:19;;;;;;;;;;;37953:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38009:18;38030:10;:8;:10::i;:::-;38009:31;;38138:1;38122:4;38116:18;:23;38112:72;;38163:9;38156:16;;;;;;38112:72;38314:1;38294:9;38288:23;:27;38284:108;;;38363:4;38369:9;38346:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38332:48;;;;;;38284:108;38411:23;38426:7;38411:14;:23::i;:::-;38404:30;;;;37763:679;;;;:::o;39649:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;27159:164::-;27256:4;27280:18;:25;27299:5;27280:25;;;;;;;;;;;;;;;:35;27306:8;27280:35;;;;;;;;;;;;;;;;;;;;;;;;;27273:42;;27159:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;::::0;5069:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;39826:43::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16886:157::-;16971:4;17010:25;16995:40;;;:11;:40;;;;16988:47;;16886:157;;;:::o;29894:127::-;29959:4;30011:1;29983:30;;:7;:16;29991:7;29983:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29976:37;;29894:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;34042:174::-;34144:2;34117:15;:24;34133:7;34117:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34200:7;34196:2;34162:46;;34171:23;34186:7;34171:14;:23::i;:::-;34162:46;;;;;;;;;;;;34042:174;;:::o;30188:348::-;30281:4;30306:16;30314:7;30306;:16::i;:::-;30298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30382:13;30398:23;30413:7;30398:14;:23::i;:::-;30382:39;;30451:5;30440:16;;:7;:16;;;:52;;;;30460:32;30477:5;30484:7;30460:16;:32::i;:::-;30440:52;:87;;;;30520:7;30496:31;;:20;30508:7;30496:11;:20::i;:::-;:31;;;30440:87;30432:96;;;30188:348;;;;:::o;33299:625::-;33458:4;33431:31;;:23;33446:7;33431:14;:23::i;:::-;:31;;;33423:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33537:1;33523:16;;:2;:16;;;33515:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33593:39;33614:4;33620:2;33624:7;33593:20;:39::i;:::-;33697:29;33714:1;33718:7;33697:8;:29::i;:::-;33758:1;33739:9;:15;33749:4;33739:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33787:1;33770:9;:13;33780:2;33770:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33818:2;33799:7;:16;33807:7;33799:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33857:7;33853:2;33838:27;;33847:4;33838:27;;;;;;;;;;;;33878:38;33898:4;33904:2;33908:7;33878:19;:38::i;:::-;33299:625;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;30878:110::-;30954:26;30964:2;30968:7;30954:26;;;;;;;;;;;;:9;:26::i;:::-;30878:110;;:::o;34358:315::-;34513:8;34504:17;;:5;:17;;;34496:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34600:8;34562:18;:25;34581:5;34562:25;;;;;;;;;;;;;;;:35;34588:8;34562:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34646:8;34624:41;;34639:5;34624:41;;;34656:8;34624:41;;;;;;:::i;:::-;;;;;;;;34358:315;;;:::o;29266:::-;29423:28;29433:4;29439:2;29443:7;29423:9;:28::i;:::-;29470:48;29493:4;29499:2;29503:7;29512:5;29470:22;:48::i;:::-;29462:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29266:315;;;;:::o;41006:117::-;41066:13;41099:16;41092:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41006:117;:::o;25424:334::-;25497:13;25531:16;25539:7;25531;:16::i;:::-;25523:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25612:21;25636:10;:8;:10::i;:::-;25612:34;;25688:1;25670:7;25664:21;:25;:86;;;;;;;;;;;;;;;;;25716:7;25725:18;:7;:16;:18::i;:::-;25699:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25664:86;25657:93;;;25424:334;;;:::o;36609:126::-;;;;:::o;37120:125::-;;;;:::o;31215:321::-;31345:18;31351:2;31355:7;31345:5;:18::i;:::-;31396:54;31427:1;31431:2;31435:7;31444:5;31396:22;:54::i;:::-;31374:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31215:321;;;:::o;35238:799::-;35393:4;35414:15;:2;:13;;;:15::i;:::-;35410:620;;;35466:2;35450:36;;;35487:12;:10;:12::i;:::-;35501:4;35507:7;35516:5;35450:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35446:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35709:1;35692:6;:13;:18;35688:272;;35735:60;;;;;;;;;;:::i;:::-;;;;;;;;35688:272;35910:6;35904:13;35895:6;35891:2;35887:15;35880:38;35446:529;35583:41;;;35573:51;;;:6;:51;;;;35566:58;;;;;35410:620;36014:4;36007:11;;35238:799;;;;;;;:::o;31872:441::-;31966:1;31952:16;;:2;:16;;;31944:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32089:45;32118:1;32122:2;32126:7;32089:20;:45::i;:::-;32164:1;32147:9;:13;32157:2;32147:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32195:2;32176:7;:16;32184:7;32176:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32240:7;32236:2;32215:33;;32232:1;32215:33;;;;;;;;;;;;32261:44;32289:1;32293:2;32297:7;32261:19;:44::i;:::-;31872:441;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:86::-;4973:7;5013:4;5006:5;5002:16;4991:27;;4938:86;;;:::o;5030:118::-;5101:22;5117:5;5101:22;:::i;:::-;5094:5;5091:33;5081:61;;5138:1;5135;5128:12;5081:61;5030:118;:::o;5154:135::-;5198:5;5236:6;5223:20;5214:29;;5252:31;5277:5;5252:31;:::i;:::-;5154:135;;;;:::o;5295:89::-;5331:7;5371:6;5364:5;5360:18;5349:29;;5295:89;;;:::o;5390:120::-;5462:23;5479:5;5462:23;:::i;:::-;5455:5;5452:34;5442:62;;5500:1;5497;5490:12;5442:62;5390:120;:::o;5516:137::-;5561:5;5599:6;5586:20;5577:29;;5615:32;5641:5;5615:32;:::i;:::-;5516:137;;;;:::o;5659:468::-;5724:6;5732;5781:2;5769:9;5760:7;5756:23;5752:32;5749:119;;;5787:79;;:::i;:::-;5749:119;5907:1;5932:51;5975:7;5966:6;5955:9;5951:22;5932:51;:::i;:::-;5922:61;;5878:115;6032:2;6058:52;6102:7;6093:6;6082:9;6078:22;6058:52;:::i;:::-;6048:62;;6003:117;5659:468;;;;;:::o;6133:619::-;6210:6;6218;6226;6275:2;6263:9;6254:7;6250:23;6246:32;6243:119;;;6281:79;;:::i;:::-;6243:119;6401:1;6426:53;6471:7;6462:6;6451:9;6447:22;6426:53;:::i;:::-;6416:63;;6372:117;6528:2;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6499:118;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6133:619;;;;;:::o;6758:117::-;6867:1;6864;6857:12;6881:117;6990:1;6987;6980:12;7004:180;7052:77;7049:1;7042:88;7149:4;7146:1;7139:15;7173:4;7170:1;7163:15;7190:281;7273:27;7295:4;7273:27;:::i;:::-;7265:6;7261:40;7403:6;7391:10;7388:22;7367:18;7355:10;7352:34;7349:62;7346:88;;;7414:18;;:::i;:::-;7346:88;7454:10;7450:2;7443:22;7233:238;7190:281;;:::o;7477:129::-;7511:6;7538:20;;:::i;:::-;7528:30;;7567:33;7595:4;7587:6;7567:33;:::i;:::-;7477:129;;;:::o;7612:308::-;7674:4;7764:18;7756:6;7753:30;7750:56;;;7786:18;;:::i;:::-;7750:56;7824:29;7846:6;7824:29;:::i;:::-;7816:37;;7908:4;7902;7898:15;7890:23;;7612:308;;;:::o;7926:154::-;8010:6;8005:3;8000;7987:30;8072:1;8063:6;8058:3;8054:16;8047:27;7926:154;;;:::o;8086:412::-;8164:5;8189:66;8205:49;8247:6;8205:49;:::i;:::-;8189:66;:::i;:::-;8180:75;;8278:6;8271:5;8264:21;8316:4;8309:5;8305:16;8354:3;8345:6;8340:3;8336:16;8333:25;8330:112;;;8361:79;;:::i;:::-;8330:112;8451:41;8485:6;8480:3;8475;8451:41;:::i;:::-;8170:328;8086:412;;;;;:::o;8518:340::-;8574:5;8623:3;8616:4;8608:6;8604:17;8600:27;8590:122;;8631:79;;:::i;:::-;8590:122;8748:6;8735:20;8773:79;8848:3;8840:6;8833:4;8825:6;8821:17;8773:79;:::i;:::-;8764:88;;8580:278;8518:340;;;;:::o;8864:509::-;8933:6;8982:2;8970:9;8961:7;8957:23;8953:32;8950:119;;;8988:79;;:::i;:::-;8950:119;9136:1;9125:9;9121:17;9108:31;9166:18;9158:6;9155:30;9152:117;;;9188:79;;:::i;:::-;9152:117;9293:63;9348:7;9339:6;9328:9;9324:22;9293:63;:::i;:::-;9283:73;;9079:287;8864:509;;;;:::o;9379:329::-;9438:6;9487:2;9475:9;9466:7;9462:23;9458:32;9455:119;;;9493:79;;:::i;:::-;9455:119;9613:1;9638:53;9683:7;9674:6;9663:9;9659:22;9638:53;:::i;:::-;9628:63;;9584:117;9379:329;;;;:::o;9714:118::-;9801:24;9819:5;9801:24;:::i;:::-;9796:3;9789:37;9714:118;;:::o;9838:222::-;9931:4;9969:2;9958:9;9954:18;9946:26;;9982:71;10050:1;10039:9;10035:17;10026:6;9982:71;:::i;:::-;9838:222;;;;:::o;10066:470::-;10132:6;10140;10189:2;10177:9;10168:7;10164:23;10160:32;10157:119;;;10195:79;;:::i;:::-;10157:119;10315:1;10340:53;10385:7;10376:6;10365:9;10361:22;10340:53;:::i;:::-;10330:63;;10286:117;10442:2;10468:51;10511:7;10502:6;10491:9;10487:22;10468:51;:::i;:::-;10458:61;;10413:116;10066:470;;;;;:::o;10542:116::-;10612:21;10627:5;10612:21;:::i;:::-;10605:5;10602:32;10592:60;;10648:1;10645;10638:12;10592:60;10542:116;:::o;10664:133::-;10707:5;10745:6;10732:20;10723:29;;10761:30;10785:5;10761:30;:::i;:::-;10664:133;;;;:::o;10803:468::-;10868:6;10876;10925:2;10913:9;10904:7;10900:23;10896:32;10893:119;;;10931:79;;:::i;:::-;10893:119;11051:1;11076:53;11121:7;11112:6;11101:9;11097:22;11076:53;:::i;:::-;11066:63;;11022:117;11178:2;11204:50;11246:7;11237:6;11226:9;11222:22;11204:50;:::i;:::-;11194:60;;11149:115;10803:468;;;;;:::o;11277:307::-;11338:4;11428:18;11420:6;11417:30;11414:56;;;11450:18;;:::i;:::-;11414:56;11488:29;11510:6;11488:29;:::i;:::-;11480:37;;11572:4;11566;11562:15;11554:23;;11277:307;;;:::o;11590:410::-;11667:5;11692:65;11708:48;11749:6;11708:48;:::i;:::-;11692:65;:::i;:::-;11683:74;;11780:6;11773:5;11766:21;11818:4;11811:5;11807:16;11856:3;11847:6;11842:3;11838:16;11835:25;11832:112;;;11863:79;;:::i;:::-;11832:112;11953:41;11987:6;11982:3;11977;11953:41;:::i;:::-;11673:327;11590:410;;;;;:::o;12019:338::-;12074:5;12123:3;12116:4;12108:6;12104:17;12100:27;12090:122;;12131:79;;:::i;:::-;12090:122;12248:6;12235:20;12273:78;12347:3;12339:6;12332:4;12324:6;12320:17;12273:78;:::i;:::-;12264:87;;12080:277;12019:338;;;;:::o;12363:943::-;12458:6;12466;12474;12482;12531:3;12519:9;12510:7;12506:23;12502:33;12499:120;;;12538:79;;:::i;:::-;12499:120;12658:1;12683:53;12728:7;12719:6;12708:9;12704:22;12683:53;:::i;:::-;12673:63;;12629:117;12785:2;12811:53;12856:7;12847:6;12836:9;12832:22;12811:53;:::i;:::-;12801:63;;12756:118;12913:2;12939:53;12984:7;12975:6;12964:9;12960:22;12939:53;:::i;:::-;12929:63;;12884:118;13069:2;13058:9;13054:18;13041:32;13100:18;13092:6;13089:30;13086:117;;;13122:79;;:::i;:::-;13086:117;13227:62;13281:7;13272:6;13261:9;13257:22;13227:62;:::i;:::-;13217:72;;13012:287;12363:943;;;;;;;:::o;13312:325::-;13369:6;13418:2;13406:9;13397:7;13393:23;13389:32;13386:119;;;13424:79;;:::i;:::-;13386:119;13544:1;13569:51;13612:7;13603:6;13592:9;13588:22;13569:51;:::i;:::-;13559:61;;13515:115;13312:325;;;;:::o;13643:115::-;13728:23;13745:5;13728:23;:::i;:::-;13723:3;13716:36;13643:115;;:::o;13764:218::-;13855:4;13893:2;13882:9;13878:18;13870:26;;13906:69;13972:1;13961:9;13957:17;13948:6;13906:69;:::i;:::-;13764:218;;;;:::o;13988:474::-;14056:6;14064;14113:2;14101:9;14092:7;14088:23;14084:32;14081:119;;;14119:79;;:::i;:::-;14081:119;14239:1;14264:53;14309:7;14300:6;14289:9;14285:22;14264:53;:::i;:::-;14254:63;;14210:117;14366:2;14392:53;14437:7;14428:6;14417:9;14413:22;14392:53;:::i;:::-;14382:63;;14337:118;13988:474;;;;;:::o;14468:180::-;14516:77;14513:1;14506:88;14613:4;14610:1;14603:15;14637:4;14634:1;14627:15;14654:320;14698:6;14735:1;14729:4;14725:12;14715:22;;14782:1;14776:4;14772:12;14803:18;14793:81;;14859:4;14851:6;14847:17;14837:27;;14793:81;14921:2;14913:6;14910:14;14890:18;14887:38;14884:84;;14940:18;;:::i;:::-;14884:84;14705:269;14654:320;;;:::o;14980:231::-;15120:34;15116:1;15108:6;15104:14;15097:58;15189:14;15184:2;15176:6;15172:15;15165:39;14980:231;:::o;15217:366::-;15359:3;15380:67;15444:2;15439:3;15380:67;:::i;:::-;15373:74;;15456:93;15545:3;15456:93;:::i;:::-;15574:2;15569:3;15565:12;15558:19;;15217:366;;;:::o;15589:419::-;15755:4;15793:2;15782:9;15778:18;15770:26;;15842:9;15836:4;15832:20;15828:1;15817:9;15813:17;15806:47;15870:131;15996:4;15870:131;:::i;:::-;15862:139;;15589:419;;;:::o;16014:220::-;16154:34;16150:1;16142:6;16138:14;16131:58;16223:3;16218:2;16210:6;16206:15;16199:28;16014:220;:::o;16240:366::-;16382:3;16403:67;16467:2;16462:3;16403:67;:::i;:::-;16396:74;;16479:93;16568:3;16479:93;:::i;:::-;16597:2;16592:3;16588:12;16581:19;;16240:366;;;:::o;16612:419::-;16778:4;16816:2;16805:9;16801:18;16793:26;;16865:9;16859:4;16855:20;16851:1;16840:9;16836:17;16829:47;16893:131;17019:4;16893:131;:::i;:::-;16885:139;;16612:419;;;:::o;17037:243::-;17177:34;17173:1;17165:6;17161:14;17154:58;17246:26;17241:2;17233:6;17229:15;17222:51;17037:243;:::o;17286:366::-;17428:3;17449:67;17513:2;17508:3;17449:67;:::i;:::-;17442:74;;17525:93;17614:3;17525:93;:::i;:::-;17643:2;17638:3;17634:12;17627:19;;17286:366;;;:::o;17658:419::-;17824:4;17862:2;17851:9;17847:18;17839:26;;17911:9;17905:4;17901:20;17897:1;17886:9;17882:17;17875:47;17939:131;18065:4;17939:131;:::i;:::-;17931:139;;17658:419;;;:::o;18083:182::-;18223:34;18219:1;18211:6;18207:14;18200:58;18083:182;:::o;18271:366::-;18413:3;18434:67;18498:2;18493:3;18434:67;:::i;:::-;18427:74;;18510:93;18599:3;18510:93;:::i;:::-;18628:2;18623:3;18619:12;18612:19;;18271:366;;;:::o;18643:419::-;18809:4;18847:2;18836:9;18832:18;18824:26;;18896:9;18890:4;18886:20;18882:1;18871:9;18867:17;18860:47;18924:131;19050:4;18924:131;:::i;:::-;18916:139;;18643:419;;;:::o;19068:236::-;19208:34;19204:1;19196:6;19192:14;19185:58;19277:19;19272:2;19264:6;19260:15;19253:44;19068:236;:::o;19310:366::-;19452:3;19473:67;19537:2;19532:3;19473:67;:::i;:::-;19466:74;;19549:93;19638:3;19549:93;:::i;:::-;19667:2;19662:3;19658:12;19651:19;;19310:366;;;:::o;19682:419::-;19848:4;19886:2;19875:9;19871:18;19863:26;;19935:9;19929:4;19925:20;19921:1;19910:9;19906:17;19899:47;19963:131;20089:4;19963:131;:::i;:::-;19955:139;;19682:419;;;:::o;20107:141::-;20156:4;20179:3;20171:11;;20202:3;20199:1;20192:14;20236:4;20233:1;20223:18;20215:26;;20107:141;;;:::o;20254:93::-;20291:6;20338:2;20333;20326:5;20322:14;20318:23;20308:33;;20254:93;;;:::o;20353:107::-;20397:8;20447:5;20441:4;20437:16;20416:37;;20353:107;;;;:::o;20466:393::-;20535:6;20585:1;20573:10;20569:18;20608:97;20638:66;20627:9;20608:97;:::i;:::-;20726:39;20756:8;20745:9;20726:39;:::i;:::-;20714:51;;20798:4;20794:9;20787:5;20783:21;20774:30;;20847:4;20837:8;20833:19;20826:5;20823:30;20813:40;;20542:317;;20466:393;;;;;:::o;20865:60::-;20893:3;20914:5;20907:12;;20865:60;;;:::o;20931:142::-;20981:9;21014:53;21032:34;21041:24;21059:5;21041:24;:::i;:::-;21032:34;:::i;:::-;21014:53;:::i;:::-;21001:66;;20931:142;;;:::o;21079:75::-;21122:3;21143:5;21136:12;;21079:75;;;:::o;21160:269::-;21270:39;21301:7;21270:39;:::i;:::-;21331:91;21380:41;21404:16;21380:41;:::i;:::-;21372:6;21365:4;21359:11;21331:91;:::i;:::-;21325:4;21318:105;21236:193;21160:269;;;:::o;21435:73::-;21480:3;21435:73;:::o;21514:189::-;21591:32;;:::i;:::-;21632:65;21690:6;21682;21676:4;21632:65;:::i;:::-;21567:136;21514:189;;:::o;21709:186::-;21769:120;21786:3;21779:5;21776:14;21769:120;;;21840:39;21877:1;21870:5;21840:39;:::i;:::-;21813:1;21806:5;21802:13;21793:22;;21769:120;;;21709:186;;:::o;21901:543::-;22002:2;21997:3;21994:11;21991:446;;;22036:38;22068:5;22036:38;:::i;:::-;22120:29;22138:10;22120:29;:::i;:::-;22110:8;22106:44;22303:2;22291:10;22288:18;22285:49;;;22324:8;22309:23;;22285:49;22347:80;22403:22;22421:3;22403:22;:::i;:::-;22393:8;22389:37;22376:11;22347:80;:::i;:::-;22006:431;;21991:446;21901:543;;;:::o;22450:117::-;22504:8;22554:5;22548:4;22544:16;22523:37;;22450:117;;;;:::o;22573:169::-;22617:6;22650:51;22698:1;22694:6;22686:5;22683:1;22679:13;22650:51;:::i;:::-;22646:56;22731:4;22725;22721:15;22711:25;;22624:118;22573:169;;;;:::o;22747:295::-;22823:4;22969:29;22994:3;22988:4;22969:29;:::i;:::-;22961:37;;23031:3;23028:1;23024:11;23018:4;23015:21;23007:29;;22747:295;;;;:::o;23047:1395::-;23164:37;23197:3;23164:37;:::i;:::-;23266:18;23258:6;23255:30;23252:56;;;23288:18;;:::i;:::-;23252:56;23332:38;23364:4;23358:11;23332:38;:::i;:::-;23417:67;23477:6;23469;23463:4;23417:67;:::i;:::-;23511:1;23535:4;23522:17;;23567:2;23559:6;23556:14;23584:1;23579:618;;;;24241:1;24258:6;24255:77;;;24307:9;24302:3;24298:19;24292:26;24283:35;;24255:77;24358:67;24418:6;24411:5;24358:67;:::i;:::-;24352:4;24345:81;24214:222;23549:887;;23579:618;23631:4;23627:9;23619:6;23615:22;23665:37;23697:4;23665:37;:::i;:::-;23724:1;23738:208;23752:7;23749:1;23746:14;23738:208;;;23831:9;23826:3;23822:19;23816:26;23808:6;23801:42;23882:1;23874:6;23870:14;23860:24;;23929:2;23918:9;23914:18;23901:31;;23775:4;23772:1;23768:12;23763:17;;23738:208;;;23974:6;23965:7;23962:19;23959:179;;;24032:9;24027:3;24023:19;24017:26;24075:48;24117:4;24109:6;24105:17;24094:9;24075:48;:::i;:::-;24067:6;24060:64;23982:156;23959:179;24184:1;24180;24172:6;24168:14;24164:22;24158:4;24151:36;23586:611;;;23549:887;;23139:1303;;;23047:1395;;:::o;24448:228::-;24588:34;24584:1;24576:6;24572:14;24565:58;24657:11;24652:2;24644:6;24640:15;24633:36;24448:228;:::o;24682:366::-;24824:3;24845:67;24909:2;24904:3;24845:67;:::i;:::-;24838:74;;24921:93;25010:3;24921:93;:::i;:::-;25039:2;25034:3;25030:12;25023:19;;24682:366;;;:::o;25054:419::-;25220:4;25258:2;25247:9;25243:18;25235:26;;25307:9;25301:4;25297:20;25293:1;25282:9;25278:17;25271:47;25335:131;25461:4;25335:131;:::i;:::-;25327:139;;25054:419;;;:::o;25479:229::-;25619:34;25615:1;25607:6;25603:14;25596:58;25688:12;25683:2;25675:6;25671:15;25664:37;25479:229;:::o;25714:366::-;25856:3;25877:67;25941:2;25936:3;25877:67;:::i;:::-;25870:74;;25953:93;26042:3;25953:93;:::i;:::-;26071:2;26066:3;26062:12;26055:19;;25714:366;;;:::o;26086:419::-;26252:4;26290:2;26279:9;26275:18;26267:26;;26339:9;26333:4;26329:20;26325:1;26314:9;26310:17;26303:47;26367:131;26493:4;26367:131;:::i;:::-;26359:139;;26086:419;;;:::o;26511:164::-;26651:16;26647:1;26639:6;26635:14;26628:40;26511:164;:::o;26681:366::-;26823:3;26844:67;26908:2;26903:3;26844:67;:::i;:::-;26837:74;;26920:93;27009:3;26920:93;:::i;:::-;27038:2;27033:3;27029:12;27022:19;;26681:366;;;:::o;27053:419::-;27219:4;27257:2;27246:9;27242:18;27234:26;;27306:9;27300:4;27296:20;27292:1;27281:9;27277:17;27270:47;27334:131;27460:4;27334:131;:::i;:::-;27326:139;;27053:419;;;:::o;27478:237::-;27618:34;27614:1;27606:6;27602:14;27595:58;27687:20;27682:2;27674:6;27670:15;27663:45;27478:237;:::o;27721:366::-;27863:3;27884:67;27948:2;27943:3;27884:67;:::i;:::-;27877:74;;27960:93;28049:3;27960:93;:::i;:::-;28078:2;28073:3;28069:12;28062:19;;27721:366;;;:::o;28093:419::-;28259:4;28297:2;28286:9;28282:18;28274:26;;28346:9;28340:4;28336:20;28332:1;28321:9;28317:17;28310:47;28374:131;28500:4;28374:131;:::i;:::-;28366:139;;28093:419;;;:::o;28518:178::-;28658:30;28654:1;28646:6;28642:14;28635:54;28518:178;:::o;28702:366::-;28844:3;28865:67;28929:2;28924:3;28865:67;:::i;:::-;28858:74;;28941:93;29030:3;28941:93;:::i;:::-;29059:2;29054:3;29050:12;29043:19;;28702:366;;;:::o;29074:419::-;29240:4;29278:2;29267:9;29263:18;29255:26;;29327:9;29321:4;29317:20;29313:1;29302:9;29298:17;29291:47;29355:131;29481:4;29355:131;:::i;:::-;29347:139;;29074:419;;;:::o;29499:180::-;29639:32;29635:1;29627:6;29623:14;29616:56;29499:180;:::o;29685:366::-;29827:3;29848:67;29912:2;29907:3;29848:67;:::i;:::-;29841:74;;29924:93;30013:3;29924:93;:::i;:::-;30042:2;30037:3;30033:12;30026:19;;29685:366;;;:::o;30057:419::-;30223:4;30261:2;30250:9;30246:18;30238:26;;30310:9;30304:4;30300:20;30296:1;30285:9;30281:17;30274:47;30338:131;30464:4;30338:131;:::i;:::-;30330:139;;30057:419;;;:::o;30482:180::-;30530:77;30527:1;30520:88;30627:4;30624:1;30617:15;30651:4;30648:1;30641:15;30668:167;30705:3;30728:22;30744:5;30728:22;:::i;:::-;30719:31;;30772:4;30765:5;30762:15;30759:41;;30780:18;;:::i;:::-;30759:41;30827:1;30820:5;30816:13;30809:20;;30668:167;;;:::o;30841:::-;30981:19;30977:1;30969:6;30965:14;30958:43;30841:167;:::o;31014:366::-;31156:3;31177:67;31241:2;31236:3;31177:67;:::i;:::-;31170:74;;31253:93;31342:3;31253:93;:::i;:::-;31371:2;31366:3;31362:12;31355:19;;31014:366;;;:::o;31386:419::-;31552:4;31590:2;31579:9;31575:18;31567:26;;31639:9;31633:4;31629:20;31625:1;31614:9;31610:17;31603:47;31667:131;31793:4;31667:131;:::i;:::-;31659:139;;31386:419;;;:::o;31811:188::-;31850:4;31870:19;31887:1;31870:19;:::i;:::-;31865:24;;31903:19;31920:1;31903:19;:::i;:::-;31898:24;;31941:1;31938;31935:8;31932:34;;;31946:18;;:::i;:::-;31932:34;31991:1;31988;31984:9;31976:17;;31811:188;;;;:::o;32005:148::-;32107:11;32144:3;32129:18;;32005:148;;;;:::o;32183:874::-;32286:3;32323:5;32317:12;32352:36;32378:9;32352:36;:::i;:::-;32404:89;32486:6;32481:3;32404:89;:::i;:::-;32397:96;;32524:1;32513:9;32509:17;32540:1;32535:166;;;;32715:1;32710:341;;;;32502:549;;32535:166;32619:4;32615:9;32604;32600:25;32595:3;32588:38;32681:6;32674:14;32667:22;32659:6;32655:35;32650:3;32646:45;32639:52;;32535:166;;32710:341;32777:38;32809:5;32777:38;:::i;:::-;32837:1;32851:154;32865:6;32862:1;32859:13;32851:154;;;32939:7;32933:14;32929:1;32924:3;32920:11;32913:35;32989:1;32980:7;32976:15;32965:26;;32887:4;32884:1;32880:12;32875:17;;32851:154;;;33034:6;33029:3;33025:16;33018:23;;32717:334;;32502:549;;32290:767;;32183:874;;;;:::o;33063:377::-;33169:3;33197:39;33230:5;33197:39;:::i;:::-;33252:89;33334:6;33329:3;33252:89;:::i;:::-;33245:96;;33350:52;33395:6;33390:3;33383:4;33376:5;33372:16;33350:52;:::i;:::-;33427:6;33422:3;33418:16;33411:23;;33173:267;33063:377;;;;:::o;33446:429::-;33623:3;33645:92;33733:3;33724:6;33645:92;:::i;:::-;33638:99;;33754:95;33845:3;33836:6;33754:95;:::i;:::-;33747:102;;33866:3;33859:10;;33446:429;;;;;:::o;33881:236::-;34021:34;34017:1;34009:6;34005:14;33998:58;34090:19;34085:2;34077:6;34073:15;34066:44;33881:236;:::o;34123:366::-;34265:3;34286:67;34350:2;34345:3;34286:67;:::i;:::-;34279:74;;34362:93;34451:3;34362:93;:::i;:::-;34480:2;34475:3;34471:12;34464:19;;34123:366;;;:::o;34495:419::-;34661:4;34699:2;34688:9;34684:18;34676:26;;34748:9;34742:4;34738:20;34734:1;34723:9;34719:17;34712:47;34776:131;34902:4;34776:131;:::i;:::-;34768:139;;34495:419;;;:::o;34920:435::-;35100:3;35122:95;35213:3;35204:6;35122:95;:::i;:::-;35115:102;;35234:95;35325:3;35316:6;35234:95;:::i;:::-;35227:102;;35346:3;35339:10;;34920:435;;;;;:::o;35361:225::-;35501:34;35497:1;35489:6;35485:14;35478:58;35570:8;35565:2;35557:6;35553:15;35546:33;35361:225;:::o;35592:366::-;35734:3;35755:67;35819:2;35814:3;35755:67;:::i;:::-;35748:74;;35831:93;35920:3;35831:93;:::i;:::-;35949:2;35944:3;35940:12;35933:19;;35592:366;;;:::o;35964:419::-;36130:4;36168:2;36157:9;36153:18;36145:26;;36217:9;36211:4;36207:20;36203:1;36192:9;36188:17;36181:47;36245:131;36371:4;36245:131;:::i;:::-;36237:139;;35964:419;;;:::o;36389:231::-;36529:34;36525:1;36517:6;36513:14;36506:58;36598:14;36593:2;36585:6;36581:15;36574:39;36389:231;:::o;36626:366::-;36768:3;36789:67;36853:2;36848:3;36789:67;:::i;:::-;36782:74;;36865:93;36954:3;36865:93;:::i;:::-;36983:2;36978:3;36974:12;36967:19;;36626:366;;;:::o;36998:419::-;37164:4;37202:2;37191:9;37187:18;37179:26;;37251:9;37245:4;37241:20;37237:1;37226:9;37222:17;37215:47;37279:131;37405:4;37279:131;:::i;:::-;37271:139;;36998:419;;;:::o;37423:224::-;37563:34;37559:1;37551:6;37547:14;37540:58;37632:7;37627:2;37619:6;37615:15;37608:32;37423:224;:::o;37653:366::-;37795:3;37816:67;37880:2;37875:3;37816:67;:::i;:::-;37809:74;;37892:93;37981:3;37892:93;:::i;:::-;38010:2;38005:3;38001:12;37994:19;;37653:366;;;:::o;38025:419::-;38191:4;38229:2;38218:9;38214:18;38206:26;;38278:9;38272:4;38268:20;38264:1;38253:9;38249:17;38242:47;38306:131;38432:4;38306:131;:::i;:::-;38298:139;;38025:419;;;:::o;38450:223::-;38590:34;38586:1;38578:6;38574:14;38567:58;38659:6;38654:2;38646:6;38642:15;38635:31;38450:223;:::o;38679:366::-;38821:3;38842:67;38906:2;38901:3;38842:67;:::i;:::-;38835:74;;38918:93;39007:3;38918:93;:::i;:::-;39036:2;39031:3;39027:12;39020:19;;38679:366;;;:::o;39051:419::-;39217:4;39255:2;39244:9;39240:18;39232:26;;39304:9;39298:4;39294:20;39290:1;39279:9;39275:17;39268:47;39332:131;39458:4;39332:131;:::i;:::-;39324:139;;39051:419;;;:::o;39476:191::-;39516:4;39536:20;39554:1;39536:20;:::i;:::-;39531:25;;39570:20;39588:1;39570:20;:::i;:::-;39565:25;;39609:1;39606;39603:8;39600:34;;;39614:18;;:::i;:::-;39600:34;39659:1;39656;39652:9;39644:17;;39476:191;;;;:::o;39673:305::-;39713:3;39732:20;39750:1;39732:20;:::i;:::-;39727:25;;39766:20;39784:1;39766:20;:::i;:::-;39761:25;;39920:1;39852:66;39848:74;39845:1;39842:81;39839:107;;;39926:18;;:::i;:::-;39839:107;39970:1;39967;39963:9;39956:16;;39673:305;;;;:::o;39984:233::-;40023:3;40046:24;40064:5;40046:24;:::i;:::-;40037:33;;40092:66;40085:5;40082:77;40079:103;;40162:18;;:::i;:::-;40079:103;40209:1;40202:5;40198:13;40191:20;;39984:233;;;:::o;40223:180::-;40271:77;40268:1;40261:88;40368:4;40365:1;40358:15;40392:4;40389:1;40382:15;40409:185;40449:1;40466:20;40484:1;40466:20;:::i;:::-;40461:25;;40500:20;40518:1;40500:20;:::i;:::-;40495:25;;40539:1;40529:35;;40544:18;;:::i;:::-;40529:35;40586:1;40583;40579:9;40574:14;;40409:185;;;;:::o;40600:176::-;40632:1;40649:20;40667:1;40649:20;:::i;:::-;40644:25;;40683:20;40701:1;40683:20;:::i;:::-;40678:25;;40722:1;40712:35;;40727:18;;:::i;:::-;40712:35;40768:1;40765;40761:9;40756:14;;40600:176;;;;:::o;40782:180::-;40830:77;40827:1;40820:88;40927:4;40924:1;40917:15;40951:4;40948:1;40941:15;40968:175;41108:27;41104:1;41096:6;41092:14;41085:51;40968:175;:::o;41149:366::-;41291:3;41312:67;41376:2;41371:3;41312:67;:::i;:::-;41305:74;;41388:93;41477:3;41388:93;:::i;:::-;41506:2;41501:3;41497:12;41490:19;;41149:366;;;:::o;41521:419::-;41687:4;41725:2;41714:9;41710:18;41702:26;;41774:9;41768:4;41764:20;41760:1;41749:9;41745:17;41738:47;41802:131;41928:4;41802:131;:::i;:::-;41794:139;;41521:419;;;:::o;41946:237::-;42086:34;42082:1;42074:6;42070:14;42063:58;42155:20;42150:2;42142:6;42138:15;42131:45;41946:237;:::o;42189:366::-;42331:3;42352:67;42416:2;42411:3;42352:67;:::i;:::-;42345:74;;42428:93;42517:3;42428:93;:::i;:::-;42546:2;42541:3;42537:12;42530:19;;42189:366;;;:::o;42561:419::-;42727:4;42765:2;42754:9;42750:18;42742:26;;42814:9;42808:4;42804:20;42800:1;42789:9;42785:17;42778:47;42842:131;42968:4;42842:131;:::i;:::-;42834:139;;42561:419;;;:::o;42986:234::-;43126:34;43122:1;43114:6;43110:14;43103:58;43195:17;43190:2;43182:6;43178:15;43171:42;42986:234;:::o;43226:366::-;43368:3;43389:67;43453:2;43448:3;43389:67;:::i;:::-;43382:74;;43465:93;43554:3;43465:93;:::i;:::-;43583:2;43578:3;43574:12;43567:19;;43226:366;;;:::o;43598:419::-;43764:4;43802:2;43791:9;43787:18;43779:26;;43851:9;43845:4;43841:20;43837:1;43826:9;43822:17;43815:47;43879:131;44005:4;43879:131;:::i;:::-;43871:139;;43598:419;;;:::o;44023:98::-;44074:6;44108:5;44102:12;44092:22;;44023:98;;;:::o;44127:168::-;44210:11;44244:6;44239:3;44232:19;44284:4;44279:3;44275:14;44260:29;;44127:168;;;;:::o;44301:360::-;44387:3;44415:38;44447:5;44415:38;:::i;:::-;44469:70;44532:6;44527:3;44469:70;:::i;:::-;44462:77;;44548:52;44593:6;44588:3;44581:4;44574:5;44570:16;44548:52;:::i;:::-;44625:29;44647:6;44625:29;:::i;:::-;44620:3;44616:39;44609:46;;44391:270;44301:360;;;;:::o;44667:640::-;44862:4;44900:3;44889:9;44885:19;44877:27;;44914:71;44982:1;44971:9;44967:17;44958:6;44914:71;:::i;:::-;44995:72;45063:2;45052:9;45048:18;45039:6;44995:72;:::i;:::-;45077;45145:2;45134:9;45130:18;45121:6;45077:72;:::i;:::-;45196:9;45190:4;45186:20;45181:2;45170:9;45166:18;45159:48;45224:76;45295:4;45286:6;45224:76;:::i;:::-;45216:84;;44667:640;;;;;;;:::o;45313:141::-;45369:5;45400:6;45394:13;45385:22;;45416:32;45442:5;45416:32;:::i;:::-;45313:141;;;;:::o;45460:349::-;45529:6;45578:2;45566:9;45557:7;45553:23;45549:32;45546:119;;;45584:79;;:::i;:::-;45546:119;45704:1;45729:63;45784:7;45775:6;45764:9;45760:22;45729:63;:::i;:::-;45719:73;;45675:127;45460:349;;;;:::o;45815:182::-;45955:34;45951:1;45943:6;45939:14;45932:58;45815:182;:::o;46003:366::-;46145:3;46166:67;46230:2;46225:3;46166:67;:::i;:::-;46159:74;;46242:93;46331:3;46242:93;:::i;:::-;46360:2;46355:3;46351:12;46344:19;;46003:366;;;:::o;46375:419::-;46541:4;46579:2;46568:9;46564:18;46556:26;;46628:9;46622:4;46618:20;46614:1;46603:9;46599:17;46592:47;46656:131;46782:4;46656:131;:::i;:::-;46648:139;;46375:419;;;:::o

Swarm Source

ipfs://e7a3ee4f8d486245ad3efc3930abea2e45559de9aadd2bd7acc6fca8ec8bf18c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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