ETH Price: $3,400.96 (+1.84%)

Token

XANA: Genesis (XGS)
 

Overview

Max Total Supply

0 XGS

Holders

0

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
0 XGS
0x69a9b26853d8a1d1d1b3dfc876258efef5285009
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Your metaverse AI partner. The first-ever original a personalized AI NFT collection of XANA.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CollectionProxy

Compiler Version
v0.8.4+commit.c7e474f2

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-21
*/

// File: contracts\CollectionProxy\IERC1538.sol

pragma solidity ^0.8.0;

/// @title ERC1538 Transparent Contract Standard
/// @dev Required interface
///  Note: the ERC-165 identifier for this interface is 0x61455567
interface IERC1538 {

    /// @dev This emits when one or a set of functions are updated in a transparent contract.
    ///  The message string should give a short description of the change and why
    ///  the change was made.
    event CommitMessage(string message);

    /// @dev This emits for each function that is updated in a transparent contract.
    ///  functionId is the bytes4 of the keccak256 of the function signature.
    ///  oldDelegate is the delegate contract address of the old delegate contract if
    ///  the function is being replaced or removed.
    ///  oldDelegate is the zero value address(0) if a function is being added for the
    ///  first time.
    ///  newDelegate is the delegate contract address of the new delegate contract if
    ///  the function is being added for the first time or if the function is being
    ///  replaced.
    ///  newDelegate is the zero value address(0) if the function is being removed.
    event FunctionUpdate(bytes4 indexed functionId, address indexed oldDelegate, address indexed newDelegate, string functionSignature);

    /// @notice Updates functions in a transparent contract.
    /// @dev If the value of _delegate is zero then the functions specified
    ///  in _functionSignatures are removed.
    ///  If the value of _delegate is a delegate contract address then the functions
    ///  specified in _functionSignatures will be delegated to that address.
    /// @param _delegate The address of a delegate contract to delegate to or zero
    ///        to remove functions.
    /// @param _functionSignatures A list of function signatures listed one after the other
    /// @param _commitMessage A short description of the change and why it is made
    ///        This message is passed to the CommitMessage event.
    function updateContract(address _delegate, string calldata _functionSignatures, string calldata _commitMessage) external;
}

// File: contracts\CollectionProxy\ProxyBaseStorage.sol

pragma solidity ^0.8.0;

///////////////////////////////////////////////////////////////////////////////////////////////////
/**
 * @title ProxyBaseStorage
 * @dev Defining base storage for the proxy contract.
 */
///////////////////////////////////////////////////////////////////////////////////////////////////

contract ProxyBaseStorage {

    //////////////////////////////////////////// VARS /////////////////////////////////////////////

    // maps functions to the delegate contracts that execute the functions.
    // funcId => delegate contract
    mapping(bytes4 => address) public delegates;

    // array of function signatures supported by the contract.
    bytes[] public funcSignatures;

    // maps each function signature to its position in the funcSignatures array.
    // signature => index+1
    mapping(bytes => uint256) internal funcSignatureToIndex;

    // proxy address of itself, can be used for cross-delegate calls but also safety checking.
    address proxy;

    ///////////////////////////////////////////////////////////////////////////////////////////////

}

// 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\token\ERC721\IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @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\utils\Address.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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\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\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: contracts\ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;







error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal returns(uint256, uint256) {
       return _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement 
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal returns(uint256, uint256) {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                // emit MintWithTokenURI(address(this), updatedIndex, to, "");

                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
        return(startTokenId,_currentIndex-1);
    }

    

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                // emit MintWithTokenURI(address(this), updatedIndex, to, "");
                emit Transfer(address(0), to, updatedIndex++);
                
            } while (updatedIndex != end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transferAdmin(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);


        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

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

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
     event MintWithTokenURI(address indexed collection, uint256 indexed tokenId, address minter, string tokenURI);
}

// File: contracts\extensions\ERC721AQueryable.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;

error InvalidQueryRange();

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _currentIndex) {
            return ownership;
        }
        ownership = _ownerships[tokenId];
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory) {
        unchecked {
            if (start > stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _currentIndex + 1;
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, _currentIndex)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx <= tokenIdsLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts\CollectionProxy\CollectionStorage.sol


pragma solidity >=0.4.22 <0.9.0;

/**
> Collection
@notice this contract is standard ERC721 to used as xanalia user's collection managing his NFTs
 */
contract CollectionStorage {
using Counters for Counters.Counter;

// Counters.Counter tokenIds;
string public baseURI;
mapping(address => bool) _allowAddress;

 Counters.Counter roundId;
 struct Round {
     uint256 startTime;
     uint256 endTime;
     uint256 price;
     address seller;
     bool isPublic;
     uint256 limit;
     uint256 maxSupply;
     Counters.Counter supply;
     
 }
 mapping(uint256 => Round) roundInfo;
 struct userInfo {
     bool isWhiteList;
     Counters.Counter purchases;
 }
 mapping(address => mapping(uint256 => userInfo)) user;

 uint256 internal MaxSupply;
 uint256 internal supply;
}

// File: contracts\CollectionProxy\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() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

// File: contracts\CollectionProxy\CollectionProxy.sol

pragma solidity ^0.8.4;





///////////////////////////////////////////////////////////////////////////////////////////////////
/**
 * @title ProxyReceiver Contract
 * @dev Handles forwarding calls to receiver delegates while offering transparency of updates.
 *      Follows ERC-1538 standard.
 *
 *    NOTE: Not recommended for direct use in a production contract, as no security control.
 *          Provided as simple example only.
 */
///////////////////////////////////////////////////////////////////////////////////////////////////

contract CollectionProxy is ProxyBaseStorage, IERC1538, ERC721AQueryable, Ownable, CollectionStorage {
using Strings for uint256;

    constructor()ERC721A("XANA: Genesis", "XGS") {

        proxy = address(this);
        _allowAddress[msg.sender] = true;
        baseURI = "https://testapi.xanalia.com/xanalia/get-nft-meta?tokenId=";
        MaxSupply = 10000;
    
        //Adding ERC1538 updateContract function
        bytes memory signature = "updateContract(address,string,string)";
        bytes4 funcId = bytes4(keccak256(signature));
        delegates[funcId] = proxy;
        funcSignatures.push(signature);
        funcSignatureToIndex[signature] = funcSignatures.length;
       
        emit FunctionUpdate(funcId, address(0), proxy, string(signature));
        
        emit CommitMessage("Added ERC1538 updateContract function at contract creation");
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////

    fallback() external payable {
        if (msg.sig == bytes4(0) && msg.value != uint(0)) { // skipping ethers/BNB received to delegate
            return;
        }
        address delegate = delegates[msg.sig];
        require(delegate != address(0), "Function does not exist.");
        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize())
            let result := delegatecall(gas(), delegate, ptr, calldatasize(), 0, 0)
            let size := returndatasize()
            returndatacopy(ptr, 0, size)
            switch result
            case 0 {revert(ptr, size)}
            default {return (ptr, size)}
        }
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////

    /// @notice Updates functions in a transparent contract.
    /// @dev If the value of _delegate is zero then the functions specified
    ///  in _functionSignatures are removed.
    ///  If the value of _delegate is a delegate contract address then the functions
    ///  specified in _functionSignatures will be delegated to that address.
    /// @param _delegate The address of a delegate contract to delegate to or zero
    /// @param _functionSignatures A list of function signatures listed one after the other
    /// @param _commitMessage A short description of the change and why it is made
    ///        This message is passed to the CommitMessage event.
    function updateContract(address _delegate, string calldata _functionSignatures, string calldata _commitMessage) override onlyOwner external {
        // pos is first used to check the size of the delegate contract.
        // After that pos is the current memory location of _functionSignatures.
        // It is used to move through the characters of _functionSignatures
        uint256 pos;
        if(_delegate != address(0)) {
            assembly {
                pos := extcodesize(_delegate)
            }
            require(pos > 0, "_delegate address is not a contract and is not address(0)");
        }

        // creates a bytes version of _functionSignatures
        bytes memory signatures = bytes(_functionSignatures);
        // stores the position in memory where _functionSignatures ends.
        uint256 signaturesEnd;
        // stores the starting position of a function signature in _functionSignatures
        uint256 start;
        assembly {
            pos := add(signatures,32)
            start := pos
            signaturesEnd := add(pos,mload(signatures))
        }
        // the function id of the current function signature
        bytes4 funcId;
        // the delegate address that is being replaced or address(0) if removing functions
        address oldDelegate;
        // the length of the current function signature in _functionSignatures
        uint256 num;
        // the current character in _functionSignatures
        uint256 char;
        // the position of the current function signature in the funcSignatures array
        uint256 index;
        // the last position in the funcSignatures array
        uint256 lastIndex;
        // parse the _functionSignatures string and handle each function
        for (; pos < signaturesEnd; pos++) {
            assembly {char := byte(0,mload(pos))}
            // 0x29 == )
            if (char == 0x29) {
                pos++;
                num = (pos - start);
                start = pos;
                assembly {
                    mstore(signatures,num)
                }
                funcId = bytes4(keccak256(signatures));
                oldDelegate = delegates[funcId];
                if(_delegate == address(0)) {
                    index = funcSignatureToIndex[signatures];
                    require(index != 0, "Function does not exist.");
                    index--;
                    lastIndex = funcSignatures.length - 1;
                    if (index != lastIndex) {
                        funcSignatures[index] = funcSignatures[lastIndex];
                        funcSignatureToIndex[funcSignatures[lastIndex]] = index + 1;
                    }
                    funcSignatures.pop();
                    delete funcSignatureToIndex[signatures];
                    delete delegates[funcId];
                    emit FunctionUpdate(funcId, oldDelegate, address(0), string(signatures));
                }
                else if (funcSignatureToIndex[signatures] == 0) {
                    require(oldDelegate == address(0), "FuncId clash.");
                    delegates[funcId] = _delegate;
                    funcSignatures.push(signatures);
                    funcSignatureToIndex[signatures] = funcSignatures.length;
                    emit FunctionUpdate(funcId, address(0), _delegate, string(signatures));
                }
                else if (delegates[funcId] != _delegate) {
                    delegates[funcId] = _delegate;
                    emit FunctionUpdate(funcId, oldDelegate, _delegate, string(signatures));

                }
                assembly {signatures := add(signatures,num)}
            }
        }
        emit CommitMessage(_commitMessage);
    }

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

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

    ///////////////////////////////////////////////////////////////////////////////////////////////

}

///////////////////////////////////////////////////////////////////////////////////////////////////

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":false,"internalType":"string","name":"message","type":"string"}],"name":"CommitMessage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"functionId","type":"bytes4"},{"indexed":true,"internalType":"address","name":"oldDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"newDelegate","type":"address"},{"indexed":false,"internalType":"string","name":"functionSignature","type":"string"}],"name":"FunctionUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"MintWithTokenURI","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"funcSignatures","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"string","name":"_functionSignatures","type":"string"},{"internalType":"string","name":"_commitMessage","type":"string"}],"name":"updateContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600d81526020017f58414e413a2047656e65736973000000000000000000000000000000000000008152506040518060400160405280600381526020017f5847530000000000000000000000000000000000000000000000000000000000815250816006908051906020019062000096929190620004bf565b508060079080519060200190620000af929190620004bf565b50620000c0620003e860201b60201c565b6004819055505050620000e8620000dc620003f160201b60201c565b620003f960201b60201c565b30600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060405180606001604052806039815260200162004db460399139600d9080519060200190620001b2929190620004bf565b50612710601281905550600060405180606001604052806025815260200162004ded602591399050600081805190602001209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190620002d492919062000550565b50600180549050600283604051620002ed91906200069f565b908152602001604051809103902081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f535385604051620003a19190620006b8565b60405180910390a47faa1c0a0a78cec2470f9652e5d29540752e7a64d70f926933cebf13afaeda45de604051620003d890620006dc565b60405180910390a150506200082b565b60006001905090565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004cd9062000766565b90600052602060002090601f016020900481019282620004f157600085556200053d565b82601f106200050c57805160ff19168380011785556200053d565b828001600101855582156200053d579182015b828111156200053c5782518255916020019190600101906200051f565b5b5090506200054c9190620005e1565b5090565b8280546200055e9062000766565b90600052602060002090601f016020900481019282620005825760008555620005ce565b82601f106200059d57805160ff1916838001178555620005ce565b82800160010185558215620005ce579182015b82811115620005cd578251825591602001919060010190620005b0565b5b509050620005dd9190620005e1565b5090565b5b80821115620005fc576000816000905550600101620005e2565b5090565b60006200060d82620006fe565b62000619818562000714565b93506200062b81856020860162000730565b80840191505092915050565b6000620006448262000709565b6200065081856200071f565b93506200066281856020860162000730565b6200066d81620007cb565b840191505092915050565b600062000687603a836200071f565b91506200069482620007dc565b604082019050919050565b6000620006ad828462000600565b915081905092915050565b60006020820190508181036000830152620006d4818462000637565b905092915050565b60006020820190508181036000830152620006f78162000678565b9050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60005b838110156200075057808201518184015260208101905062000733565b8381111562000760576000848401525b50505050565b600060028204905060018216806200077f57607f821691505b602082108114156200079657620007956200079c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4164646564204552433135333820757064617465436f6e74726163742066756e60008201527f6374696f6e20617420636f6e7472616374206372656174696f6e000000000000602082015250565b614579806200083b6000396000f3fe60806040526004361061016a5760003560e01c806370a08231116100d1578063a0a2daf01161008a578063c23dc68f11610064578063c23dc68f14610725578063c87b56dd14610762578063e985e9c51461079f578063f2fde38b146107dc5761016b565b8063a0a2daf014610696578063a22cb465146106d3578063b88d4fde146106fc5761016b565b806370a0823114610572578063715018a6146105af5780638462151c146105c65780638da5cb5b1461060357806395d89b411461062e57806399a2557a146106595761016b565b806326a6860a1161012357806326a6860a1461043e57806342842e0e1461047b5780635bbb2177146104a457806361455567146104e15780636352211e1461050a5780636c0360eb146105475761016b565b806301ffc9a71461031c57806306fdde0314610359578063081812fc14610384578063095ea7b3146103c157806318160ddd146103ea57806323b872dd146104155761016b565b5b600060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480156101e1575060003414155b156101eb5761031a565b600080600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156102f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ea90613dd9565b60405180910390fd5b60405136600082376000803683855af43d806000843e8160008114610316578184f35b8184fd5b005b34801561032857600080fd5b50610343600480360381019061033e91906137b3565b610805565b6040516103509190613d56565b60405180910390f35b34801561036557600080fd5b5061036e6108e7565b60405161037b9190613db7565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190613805565b610979565b6040516103b89190613cab565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e391906136e7565b6109f5565b005b3480156103f657600080fd5b506103ff610b00565b60405161040c9190613eb4565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613558565b610b17565b005b34801561044a57600080fd5b5061046560048036038101906104609190613805565b610b27565b6040516104729190613d71565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613558565b610bd3565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613772565b610bf3565b6040516104d89190613d12565b60405180910390f35b3480156104ed57600080fd5b506105086004803603810190610503919061365e565b610d26565b005b34801561051657600080fd5b50610531600480360381019061052c9190613805565b6116b7565b60405161053e9190613cab565b60405180910390f35b34801561055357600080fd5b5061055c6116cd565b6040516105699190613db7565b60405180910390f35b34801561057e57600080fd5b50610599600480360381019061059491906134f3565b61175b565b6040516105a69190613eb4565b60405180910390f35b3480156105bb57600080fd5b506105c461182b565b005b3480156105d257600080fd5b506105ed60048036038101906105e891906134f3565b6118b3565b6040516105fa9190613d34565b60405180910390f35b34801561060f57600080fd5b50610618611b01565b6040516106259190613cab565b60405180910390f35b34801561063a57600080fd5b50610643611b2b565b6040516106509190613db7565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190613723565b611bbd565b60405161068d9190613d34565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b891906137b3565b611ed4565b6040516106ca9190613cab565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190613622565b611f07565b005b34801561070857600080fd5b50610723600480360381019061071e91906135a7565b61207f565b005b34801561073157600080fd5b5061074c60048036038101906107479190613805565b6120fb565b6040516107599190613e99565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613805565b612218565b6040516107969190613db7565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c1919061351c565b6122bf565b6040516107d39190613d56565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe91906134f3565b612353565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e057506108df8261244b565b5b9050919050565b6060600680546108f6906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610922906141d5565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b6000610984826124b5565b6109ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a00826116b7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a68576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a87612503565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ab95750610ab781610ab2612503565b6122bf565b155b15610af0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610afb83838361250b565b505050565b6000610b0a6125bd565b6005546004540303905090565b610b228383836125c6565b505050565b60018181548110610b3757600080fd5b906000526020600020016000915090508054610b52906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e906141d5565b8015610bcb5780601f10610ba057610100808354040283529160200191610bcb565b820191906000526020600020905b815481529060010190602001808311610bae57829003601f168201915b505050505081565b610bee8383836040518060200160405280600081525061207f565b505050565b606060008251905060008167ffffffffffffffff811115610c3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c7657816020015b610c6361318f565b815260200190600190039081610c5b5790505b50905060005b828114610d1b57610ccc858281518110610cbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516120fb565b828281518110610d05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250806001019050610c7c565b508092505050919050565b610d2e612503565b73ffffffffffffffffffffffffffffffffffffffff16610d4c611b01565b73ffffffffffffffffffffffffffffffffffffffff1614610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990613e59565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e1f57853b905060008111610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613e39565b60405180910390fd5b5b600085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090506000806020830193508390508251840191506000806000806000805b878a101561166d57895160001a9250602983141561165a578980610ea790614238565b9a5050868a610eb691906140ad565b935089965083895288805190602001209550600080877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169450600073ffffffffffffffffffffffffffffffffffffffff168f73ffffffffffffffffffffffffffffffffffffffff16141561128657600289604051610f809190613c59565b90815260200160405180910390205491506000821415610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc90613dd9565b60405180910390fd5b8180610fe0906141ab565b92505060018080549050610ff491906140ad565b90508082146111105760018181548110611037577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016001838154811061107b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001908054611091906141d5565b61109c9291906131d2565b506001826110aa9190614026565b6002600183815481106110e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040516110fd9190613c70565b9081526020016040518091039020819055505b6001805480611148577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000611164919061325f565b90556002896040516111769190613c59565b908152602001604051809103902060009055600080877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c6040516112799190613db7565b60405180910390a4611654565b600060028a6040516112989190613c59565b908152602001604051809103902054141561149a57600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390613e19565b60405180910390fd5b8e600080887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001899080600181540180825580915050600190039060005260206000200160009091909190915090805190602001906113e692919061329f565b5060018054905060028a6040516113fd9190613c59565b9081526020016040518091039020819055508e73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c60405161148d9190613db7565b60405180910390a4611653565b8e73ffffffffffffffffffffffffffffffffffffffff16600080887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611652578e600080887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508e73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c6040516116499190613db7565b60405180910390a45b5b5b83890198505b898061166590614238565b9a5050610e84565b7faa1c0a0a78cec2470f9652e5d29540752e7a64d70f926933cebf13afaeda45de8c8c60405161169e929190613d93565b60405180910390a1505050505050505050505050505050565b60006116c282612a7c565b600001519050919050565b600d80546116da906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611706906141d5565b80156117535780601f1061172857610100808354040283529160200191611753565b820191906000526020600020905b81548152906001019060200180831161173657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611833612503565b73ffffffffffffffffffffffffffffffffffffffff16611851611b01565b73ffffffffffffffffffffffffffffffffffffffff16146118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e90613e59565b60405180910390fd5b6118b16000612d0b565b565b606060008060006118c38561175b565b905060008167ffffffffffffffff811115611907577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119355781602001602082028036833780820191505090505b50905061194061318f565b600061194a6125bd565b90505b838611611af357600860008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015115611a2657611ae8565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a6657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ae75780838780600101985081518110611ada577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b80600101905061194d565b508195505050505050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054611b3a906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b66906141d5565b8015611bb35780601f10611b8857610100808354040283529160200191611bb3565b820191906000526020600020905b815481529060010190602001808311611b9657829003601f168201915b5050505050905090565b606081831115611bf9576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806001600454019050611c0c6125bd565b851015611c1e57611c1b6125bd565b94505b80841115611c2a578093505b6000611c358761175b565b905084861015611c58576000868603905081811015611c52578091505b50611c5d565b600090505b60008167ffffffffffffffff811115611c9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ccd5781602001602082028036833780820191505090505b5090506000821415611ce55780945050505050611ecd565b6000611cf0886120fb565b905060008160400151611d0557816000015190505b60008990505b888114158015611d1b5750848714155b15611ebf57600860008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015115611df257611eb4565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611e3257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb35780848880600101995081518110611ea6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b806001019050611d0b565b508583528296505050505050505b9392505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f0f612503565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f74576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b6000611f81612503565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661202e612503565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120739190613d56565b60405180910390a35050565b61208a8484846125c6565b6120a98373ffffffffffffffffffffffffffffffffffffffff16612dd1565b80156120be57506120bc84848484612de4565b155b156120f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61210361318f565b61210b61318f565b6121136125bd565b83108061212257506004548310155b156121305780915050612213565b600860008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156122065780915050612213565b61220f83612a7c565b9150505b919050565b6060612223826124b5565b612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990613e79565b60405180910390fd5b600061226c612f44565b9050600081511161228c57604051806020016040528060008152506122b7565b8061229684612fd6565b6040516020016122a7929190613c87565b6040516020818303038152906040525b915050919050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61235b612503565b73ffffffffffffffffffffffffffffffffffffffff16612379611b01565b73ffffffffffffffffffffffffffffffffffffffff16146123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690613e59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690613df9565b60405180910390fd5b61244881612d0b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816124c06125bd565b111580156124cf575060045482105b80156124fc575060086000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b82600a600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006125d182612a7c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461263c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661265d612503565b73ffffffffffffffffffffffffffffffffffffffff16148061268c575061268b85612686612503565b6122bf565b5b806126d1575061269a612503565b73ffffffffffffffffffffffffffffffffffffffff166126b984610979565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061270a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612771576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61277e8585856001613183565b61278a6000848761250b565b6001600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600860008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600860008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a0a576004548214612a0957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a758585856001613189565b5050505050565b612a8461318f565b600082905080612a926125bd565b11158015612aa1575060045481105b15612cd4576000600860008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612cd257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bb6578092505050612d06565b5b600115612cd157818060019003925050600860008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ccc578092505050612d06565b612bb7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e0a612503565b8786866040518563ffffffff1660e01b8152600401612e2c9493929190613cc6565b602060405180830381600087803b158015612e4657600080fd5b505af1925050508015612e7757506040513d601f19601f82011682018060405250810190612e7491906137dc565b60015b612ef1573d8060008114612ea7576040519150601f19603f3d011682016040523d82523d6000602084013e612eac565b606091505b50600081511415612ee9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054612f53906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f7f906141d5565b8015612fcc5780601f10612fa157610100808354040283529160200191612fcc565b820191906000526020600020905b815481529060010190602001808311612faf57829003601f168201915b5050505050905090565b6060600082141561301e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061317e565b600082905060005b6000821461305057808061303990614238565b915050600a82613049919061407c565b9150613026565b60008167ffffffffffffffff811115613092577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130c45781602001600182028036833780820191505090505b5090505b60008514613177576001826130dd91906140ad565b9150600a856130ec9190614281565b60306130f89190614026565b60f81b818381518110613134577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613170919061407c565b94506130c8565b8093505050505b919050565b50505050565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546131de906141d5565b90600052602060002090601f016020900481019282613200576000855561324e565b82601f10613211578054855561324e565b8280016001018555821561324e57600052602060002091601f016020900482015b8281111561324d578254825591600101919060010190613232565b5b50905061325b9190613325565b5090565b50805461326b906141d5565b6000825580601f1061327d575061329c565b601f01602090049060005260206000209081019061329b9190613325565b5b50565b8280546132ab906141d5565b90600052602060002090601f0160209004810192826132cd5760008555613314565b82601f106132e657805160ff1916838001178555613314565b82800160010185558215613314579182015b828111156133135782518255916020019190600101906132f8565b5b5090506133219190613325565b5090565b5b8082111561333e576000816000905550600101613326565b5090565b600061335561335084613ef4565b613ecf565b9050808382526020820190508285602086028201111561337457600080fd5b60005b858110156133a4578161338a88826134de565b845260208401935060208301925050600181019050613377565b5050509392505050565b60006133c16133bc84613f20565b613ecf565b9050828152602081018484840111156133d957600080fd5b6133e4848285614169565b509392505050565b6000813590506133fb816144e7565b92915050565b600082601f83011261341257600080fd5b8135613422848260208601613342565b91505092915050565b60008135905061343a816144fe565b92915050565b60008135905061344f81614515565b92915050565b60008151905061346481614515565b92915050565b600082601f83011261347b57600080fd5b813561348b8482602086016133ae565b91505092915050565b60008083601f8401126134a657600080fd5b8235905067ffffffffffffffff8111156134bf57600080fd5b6020830191508360018202830111156134d757600080fd5b9250929050565b6000813590506134ed8161452c565b92915050565b60006020828403121561350557600080fd5b6000613513848285016133ec565b91505092915050565b6000806040838503121561352f57600080fd5b600061353d858286016133ec565b925050602061354e858286016133ec565b9150509250929050565b60008060006060848603121561356d57600080fd5b600061357b868287016133ec565b935050602061358c868287016133ec565b925050604061359d868287016134de565b9150509250925092565b600080600080608085870312156135bd57600080fd5b60006135cb878288016133ec565b94505060206135dc878288016133ec565b93505060406135ed878288016134de565b925050606085013567ffffffffffffffff81111561360a57600080fd5b6136168782880161346a565b91505092959194509250565b6000806040838503121561363557600080fd5b6000613643858286016133ec565b92505060206136548582860161342b565b9150509250929050565b60008060008060006060868803121561367657600080fd5b6000613684888289016133ec565b955050602086013567ffffffffffffffff8111156136a157600080fd5b6136ad88828901613494565b9450945050604086013567ffffffffffffffff8111156136cc57600080fd5b6136d888828901613494565b92509250509295509295909350565b600080604083850312156136fa57600080fd5b6000613708858286016133ec565b9250506020613719858286016134de565b9150509250929050565b60008060006060848603121561373857600080fd5b6000613746868287016133ec565b9350506020613757868287016134de565b9250506040613768868287016134de565b9150509250925092565b60006020828403121561378457600080fd5b600082013567ffffffffffffffff81111561379e57600080fd5b6137aa84828501613401565b91505092915050565b6000602082840312156137c557600080fd5b60006137d384828501613440565b91505092915050565b6000602082840312156137ee57600080fd5b60006137fc84828501613455565b91505092915050565b60006020828403121561381757600080fd5b6000613825848285016134de565b91505092915050565b600061383a8383613ba8565b60608301905092915050565b60006138528383613c2c565b60208301905092915050565b613867816140e1565b82525050565b613876816140e1565b82525050565b600061388782613f86565b6138918185613fcc565b935061389c83613f51565b8060005b838110156138cd5781516138b4888261382e565b97506138bf83613fb2565b9250506001810190506138a0565b5085935050505092915050565b60006138e582613f91565b6138ef8185613fdd565b93506138fa83613f61565b8060005b8381101561392b5781516139128882613846565b975061391d83613fbf565b9250506001810190506138fe565b5085935050505092915050565b613941816140f3565b82525050565b613950816140f3565b82525050565b600061396182613f9c565b61396b8185613fee565b935061397b818560208601614178565b6139848161436e565b840191505092915050565b600061399a82613f9c565b6139a48185613fff565b93506139b4818560208601614178565b80840191505092915050565b600081546139cd816141d5565b6139d78186613fff565b945060018216600081146139f25760018114613a0357613a36565b60ff19831686528186019350613a36565b613a0c85613f71565b60005b83811015613a2e57815481890152600182019150602081019050613a0f565b838801955050505b50505092915050565b6000613a4b838561400a565b9350613a58838584614169565b613a618361436e565b840190509392505050565b6000613a7782613fa7565b613a81818561400a565b9350613a91818560208601614178565b613a9a8161436e565b840191505092915050565b6000613ab082613fa7565b613aba818561401b565b9350613aca818560208601614178565b80840191505092915050565b6000613ae360188361400a565b9150613aee8261437f565b602082019050919050565b6000613b0660268361400a565b9150613b11826143a8565b604082019050919050565b6000613b29600d8361400a565b9150613b34826143f7565b602082019050919050565b6000613b4c60398361400a565b9150613b5782614420565b604082019050919050565b6000613b6f60208361400a565b9150613b7a8261446f565b602082019050919050565b6000613b92602f8361400a565b9150613b9d82614498565b604082019050919050565b606082016000820151613bbe600085018261385e565b506020820151613bd16020850182613c4a565b506040820151613be46040850182613938565b50505050565b606082016000820151613c00600085018261385e565b506020820151613c136020850182613c4a565b506040820151613c266040850182613938565b50505050565b613c358161414b565b82525050565b613c448161414b565b82525050565b613c5381614155565b82525050565b6000613c65828461398f565b915081905092915050565b6000613c7c82846139c0565b915081905092915050565b6000613c938285613aa5565b9150613c9f8284613aa5565b91508190509392505050565b6000602082019050613cc0600083018461386d565b92915050565b6000608082019050613cdb600083018761386d565b613ce8602083018661386d565b613cf56040830185613c3b565b8181036060830152613d078184613956565b905095945050505050565b60006020820190508181036000830152613d2c818461387c565b905092915050565b60006020820190508181036000830152613d4e81846138da565b905092915050565b6000602082019050613d6b6000830184613947565b92915050565b60006020820190508181036000830152613d8b8184613956565b905092915050565b60006020820190508181036000830152613dae818486613a3f565b90509392505050565b60006020820190508181036000830152613dd18184613a6c565b905092915050565b60006020820190508181036000830152613df281613ad6565b9050919050565b60006020820190508181036000830152613e1281613af9565b9050919050565b60006020820190508181036000830152613e3281613b1c565b9050919050565b60006020820190508181036000830152613e5281613b3f565b9050919050565b60006020820190508181036000830152613e7281613b62565b9050919050565b60006020820190508181036000830152613e9281613b85565b9050919050565b6000606082019050613eae6000830184613bea565b92915050565b6000602082019050613ec96000830184613c3b565b92915050565b6000613ed9613eea565b9050613ee58282614207565b919050565b6000604051905090565b600067ffffffffffffffff821115613f0f57613f0e61433f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f3b57613f3a61433f565b5b613f448261436e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140318261414b565b915061403c8361414b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614071576140706142b2565b5b828201905092915050565b60006140878261414b565b91506140928361414b565b9250826140a2576140a16142e1565b5b828204905092915050565b60006140b88261414b565b91506140c38361414b565b9250828210156140d6576140d56142b2565b5b828203905092915050565b60006140ec8261412b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561419657808201518184015260208101905061417b565b838111156141a5576000848401525b50505050565b60006141b68261414b565b915060008214156141ca576141c96142b2565b5b600182039050919050565b600060028204905060018216806141ed57607f821691505b6020821081141561420157614200614310565b5b50919050565b6142108261436e565b810181811067ffffffffffffffff8211171561422f5761422e61433f565b5b80604052505050565b60006142438261414b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614276576142756142b2565b5b600182019050919050565b600061428c8261414b565b91506142978361414b565b9250826142a7576142a66142e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f46756e6374696f6e20646f6573206e6f742065786973742e0000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e63496420636c6173682e00000000000000000000000000000000000000600082015250565b7f5f64656c65676174652061646472657373206973206e6f74206120636f6e747260008201527f61637420616e64206973206e6f74206164647265737328302900000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6144f0816140e1565b81146144fb57600080fd5b50565b614507816140f3565b811461451257600080fd5b50565b61451e816140ff565b811461452957600080fd5b50565b6145358161414b565b811461454057600080fd5b5056fea26469706673582212202e162d460b6dd6245171086dc621a04edc92f3a756d594fee1aa390dc9be616064736f6c6343000804003368747470733a2f2f746573746170692e78616e616c69612e636f6d2f78616e616c69612f6765742d6e66742d6d6574613f746f6b656e49643d757064617465436f6e747261637428616464726573732c737472696e672c737472696e6729

Deployed Bytecode

0x60806040526004361061016a5760003560e01c806370a08231116100d1578063a0a2daf01161008a578063c23dc68f11610064578063c23dc68f14610725578063c87b56dd14610762578063e985e9c51461079f578063f2fde38b146107dc5761016b565b8063a0a2daf014610696578063a22cb465146106d3578063b88d4fde146106fc5761016b565b806370a0823114610572578063715018a6146105af5780638462151c146105c65780638da5cb5b1461060357806395d89b411461062e57806399a2557a146106595761016b565b806326a6860a1161012357806326a6860a1461043e57806342842e0e1461047b5780635bbb2177146104a457806361455567146104e15780636352211e1461050a5780636c0360eb146105475761016b565b806301ffc9a71461031c57806306fdde0314610359578063081812fc14610384578063095ea7b3146103c157806318160ddd146103ea57806323b872dd146104155761016b565b5b600060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480156101e1575060003414155b156101eb5761031a565b600080600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156102f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ea90613dd9565b60405180910390fd5b60405136600082376000803683855af43d806000843e8160008114610316578184f35b8184fd5b005b34801561032857600080fd5b50610343600480360381019061033e91906137b3565b610805565b6040516103509190613d56565b60405180910390f35b34801561036557600080fd5b5061036e6108e7565b60405161037b9190613db7565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190613805565b610979565b6040516103b89190613cab565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e391906136e7565b6109f5565b005b3480156103f657600080fd5b506103ff610b00565b60405161040c9190613eb4565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613558565b610b17565b005b34801561044a57600080fd5b5061046560048036038101906104609190613805565b610b27565b6040516104729190613d71565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613558565b610bd3565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613772565b610bf3565b6040516104d89190613d12565b60405180910390f35b3480156104ed57600080fd5b506105086004803603810190610503919061365e565b610d26565b005b34801561051657600080fd5b50610531600480360381019061052c9190613805565b6116b7565b60405161053e9190613cab565b60405180910390f35b34801561055357600080fd5b5061055c6116cd565b6040516105699190613db7565b60405180910390f35b34801561057e57600080fd5b50610599600480360381019061059491906134f3565b61175b565b6040516105a69190613eb4565b60405180910390f35b3480156105bb57600080fd5b506105c461182b565b005b3480156105d257600080fd5b506105ed60048036038101906105e891906134f3565b6118b3565b6040516105fa9190613d34565b60405180910390f35b34801561060f57600080fd5b50610618611b01565b6040516106259190613cab565b60405180910390f35b34801561063a57600080fd5b50610643611b2b565b6040516106509190613db7565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190613723565b611bbd565b60405161068d9190613d34565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b891906137b3565b611ed4565b6040516106ca9190613cab565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190613622565b611f07565b005b34801561070857600080fd5b50610723600480360381019061071e91906135a7565b61207f565b005b34801561073157600080fd5b5061074c60048036038101906107479190613805565b6120fb565b6040516107599190613e99565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613805565b612218565b6040516107969190613db7565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c1919061351c565b6122bf565b6040516107d39190613d56565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe91906134f3565b612353565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e057506108df8261244b565b5b9050919050565b6060600680546108f6906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610922906141d5565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b6000610984826124b5565b6109ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a00826116b7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a68576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a87612503565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ab95750610ab781610ab2612503565b6122bf565b155b15610af0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610afb83838361250b565b505050565b6000610b0a6125bd565b6005546004540303905090565b610b228383836125c6565b505050565b60018181548110610b3757600080fd5b906000526020600020016000915090508054610b52906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e906141d5565b8015610bcb5780601f10610ba057610100808354040283529160200191610bcb565b820191906000526020600020905b815481529060010190602001808311610bae57829003601f168201915b505050505081565b610bee8383836040518060200160405280600081525061207f565b505050565b606060008251905060008167ffffffffffffffff811115610c3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c7657816020015b610c6361318f565b815260200190600190039081610c5b5790505b50905060005b828114610d1b57610ccc858281518110610cbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516120fb565b828281518110610d05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250806001019050610c7c565b508092505050919050565b610d2e612503565b73ffffffffffffffffffffffffffffffffffffffff16610d4c611b01565b73ffffffffffffffffffffffffffffffffffffffff1614610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990613e59565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e1f57853b905060008111610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613e39565b60405180910390fd5b5b600085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090506000806020830193508390508251840191506000806000806000805b878a101561166d57895160001a9250602983141561165a578980610ea790614238565b9a5050868a610eb691906140ad565b935089965083895288805190602001209550600080877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169450600073ffffffffffffffffffffffffffffffffffffffff168f73ffffffffffffffffffffffffffffffffffffffff16141561128657600289604051610f809190613c59565b90815260200160405180910390205491506000821415610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc90613dd9565b60405180910390fd5b8180610fe0906141ab565b92505060018080549050610ff491906140ad565b90508082146111105760018181548110611037577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016001838154811061107b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001908054611091906141d5565b61109c9291906131d2565b506001826110aa9190614026565b6002600183815481106110e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040516110fd9190613c70565b9081526020016040518091039020819055505b6001805480611148577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000611164919061325f565b90556002896040516111769190613c59565b908152602001604051809103902060009055600080877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c6040516112799190613db7565b60405180910390a4611654565b600060028a6040516112989190613c59565b908152602001604051809103902054141561149a57600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390613e19565b60405180910390fd5b8e600080887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001899080600181540180825580915050600190039060005260206000200160009091909190915090805190602001906113e692919061329f565b5060018054905060028a6040516113fd9190613c59565b9081526020016040518091039020819055508e73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c60405161148d9190613db7565b60405180910390a4611653565b8e73ffffffffffffffffffffffffffffffffffffffff16600080887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611652578e600080887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508e73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c6040516116499190613db7565b60405180910390a45b5b5b83890198505b898061166590614238565b9a5050610e84565b7faa1c0a0a78cec2470f9652e5d29540752e7a64d70f926933cebf13afaeda45de8c8c60405161169e929190613d93565b60405180910390a1505050505050505050505050505050565b60006116c282612a7c565b600001519050919050565b600d80546116da906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611706906141d5565b80156117535780601f1061172857610100808354040283529160200191611753565b820191906000526020600020905b81548152906001019060200180831161173657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611833612503565b73ffffffffffffffffffffffffffffffffffffffff16611851611b01565b73ffffffffffffffffffffffffffffffffffffffff16146118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e90613e59565b60405180910390fd5b6118b16000612d0b565b565b606060008060006118c38561175b565b905060008167ffffffffffffffff811115611907577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119355781602001602082028036833780820191505090505b50905061194061318f565b600061194a6125bd565b90505b838611611af357600860008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015115611a2657611ae8565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a6657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ae75780838780600101985081518110611ada577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b80600101905061194d565b508195505050505050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054611b3a906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b66906141d5565b8015611bb35780601f10611b8857610100808354040283529160200191611bb3565b820191906000526020600020905b815481529060010190602001808311611b9657829003601f168201915b5050505050905090565b606081831115611bf9576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806001600454019050611c0c6125bd565b851015611c1e57611c1b6125bd565b94505b80841115611c2a578093505b6000611c358761175b565b905084861015611c58576000868603905081811015611c52578091505b50611c5d565b600090505b60008167ffffffffffffffff811115611c9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ccd5781602001602082028036833780820191505090505b5090506000821415611ce55780945050505050611ecd565b6000611cf0886120fb565b905060008160400151611d0557816000015190505b60008990505b888114158015611d1b5750848714155b15611ebf57600860008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015115611df257611eb4565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611e3257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb35780848880600101995081518110611ea6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b806001019050611d0b565b508583528296505050505050505b9392505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f0f612503565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f74576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b6000611f81612503565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661202e612503565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120739190613d56565b60405180910390a35050565b61208a8484846125c6565b6120a98373ffffffffffffffffffffffffffffffffffffffff16612dd1565b80156120be57506120bc84848484612de4565b155b156120f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61210361318f565b61210b61318f565b6121136125bd565b83108061212257506004548310155b156121305780915050612213565b600860008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156122065780915050612213565b61220f83612a7c565b9150505b919050565b6060612223826124b5565b612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990613e79565b60405180910390fd5b600061226c612f44565b9050600081511161228c57604051806020016040528060008152506122b7565b8061229684612fd6565b6040516020016122a7929190613c87565b6040516020818303038152906040525b915050919050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61235b612503565b73ffffffffffffffffffffffffffffffffffffffff16612379611b01565b73ffffffffffffffffffffffffffffffffffffffff16146123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690613e59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690613df9565b60405180910390fd5b61244881612d0b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816124c06125bd565b111580156124cf575060045482105b80156124fc575060086000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b82600a600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006125d182612a7c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461263c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661265d612503565b73ffffffffffffffffffffffffffffffffffffffff16148061268c575061268b85612686612503565b6122bf565b5b806126d1575061269a612503565b73ffffffffffffffffffffffffffffffffffffffff166126b984610979565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061270a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612771576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61277e8585856001613183565b61278a6000848761250b565b6001600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600860008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600860008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a0a576004548214612a0957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a758585856001613189565b5050505050565b612a8461318f565b600082905080612a926125bd565b11158015612aa1575060045481105b15612cd4576000600860008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612cd257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bb6578092505050612d06565b5b600115612cd157818060019003925050600860008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ccc578092505050612d06565b612bb7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e0a612503565b8786866040518563ffffffff1660e01b8152600401612e2c9493929190613cc6565b602060405180830381600087803b158015612e4657600080fd5b505af1925050508015612e7757506040513d601f19601f82011682018060405250810190612e7491906137dc565b60015b612ef1573d8060008114612ea7576040519150601f19603f3d011682016040523d82523d6000602084013e612eac565b606091505b50600081511415612ee9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054612f53906141d5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f7f906141d5565b8015612fcc5780601f10612fa157610100808354040283529160200191612fcc565b820191906000526020600020905b815481529060010190602001808311612faf57829003601f168201915b5050505050905090565b6060600082141561301e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061317e565b600082905060005b6000821461305057808061303990614238565b915050600a82613049919061407c565b9150613026565b60008167ffffffffffffffff811115613092577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130c45781602001600182028036833780820191505090505b5090505b60008514613177576001826130dd91906140ad565b9150600a856130ec9190614281565b60306130f89190614026565b60f81b818381518110613134577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613170919061407c565b94506130c8565b8093505050505b919050565b50505050565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546131de906141d5565b90600052602060002090601f016020900481019282613200576000855561324e565b82601f10613211578054855561324e565b8280016001018555821561324e57600052602060002091601f016020900482015b8281111561324d578254825591600101919060010190613232565b5b50905061325b9190613325565b5090565b50805461326b906141d5565b6000825580601f1061327d575061329c565b601f01602090049060005260206000209081019061329b9190613325565b5b50565b8280546132ab906141d5565b90600052602060002090601f0160209004810192826132cd5760008555613314565b82601f106132e657805160ff1916838001178555613314565b82800160010185558215613314579182015b828111156133135782518255916020019190600101906132f8565b5b5090506133219190613325565b5090565b5b8082111561333e576000816000905550600101613326565b5090565b600061335561335084613ef4565b613ecf565b9050808382526020820190508285602086028201111561337457600080fd5b60005b858110156133a4578161338a88826134de565b845260208401935060208301925050600181019050613377565b5050509392505050565b60006133c16133bc84613f20565b613ecf565b9050828152602081018484840111156133d957600080fd5b6133e4848285614169565b509392505050565b6000813590506133fb816144e7565b92915050565b600082601f83011261341257600080fd5b8135613422848260208601613342565b91505092915050565b60008135905061343a816144fe565b92915050565b60008135905061344f81614515565b92915050565b60008151905061346481614515565b92915050565b600082601f83011261347b57600080fd5b813561348b8482602086016133ae565b91505092915050565b60008083601f8401126134a657600080fd5b8235905067ffffffffffffffff8111156134bf57600080fd5b6020830191508360018202830111156134d757600080fd5b9250929050565b6000813590506134ed8161452c565b92915050565b60006020828403121561350557600080fd5b6000613513848285016133ec565b91505092915050565b6000806040838503121561352f57600080fd5b600061353d858286016133ec565b925050602061354e858286016133ec565b9150509250929050565b60008060006060848603121561356d57600080fd5b600061357b868287016133ec565b935050602061358c868287016133ec565b925050604061359d868287016134de565b9150509250925092565b600080600080608085870312156135bd57600080fd5b60006135cb878288016133ec565b94505060206135dc878288016133ec565b93505060406135ed878288016134de565b925050606085013567ffffffffffffffff81111561360a57600080fd5b6136168782880161346a565b91505092959194509250565b6000806040838503121561363557600080fd5b6000613643858286016133ec565b92505060206136548582860161342b565b9150509250929050565b60008060008060006060868803121561367657600080fd5b6000613684888289016133ec565b955050602086013567ffffffffffffffff8111156136a157600080fd5b6136ad88828901613494565b9450945050604086013567ffffffffffffffff8111156136cc57600080fd5b6136d888828901613494565b92509250509295509295909350565b600080604083850312156136fa57600080fd5b6000613708858286016133ec565b9250506020613719858286016134de565b9150509250929050565b60008060006060848603121561373857600080fd5b6000613746868287016133ec565b9350506020613757868287016134de565b9250506040613768868287016134de565b9150509250925092565b60006020828403121561378457600080fd5b600082013567ffffffffffffffff81111561379e57600080fd5b6137aa84828501613401565b91505092915050565b6000602082840312156137c557600080fd5b60006137d384828501613440565b91505092915050565b6000602082840312156137ee57600080fd5b60006137fc84828501613455565b91505092915050565b60006020828403121561381757600080fd5b6000613825848285016134de565b91505092915050565b600061383a8383613ba8565b60608301905092915050565b60006138528383613c2c565b60208301905092915050565b613867816140e1565b82525050565b613876816140e1565b82525050565b600061388782613f86565b6138918185613fcc565b935061389c83613f51565b8060005b838110156138cd5781516138b4888261382e565b97506138bf83613fb2565b9250506001810190506138a0565b5085935050505092915050565b60006138e582613f91565b6138ef8185613fdd565b93506138fa83613f61565b8060005b8381101561392b5781516139128882613846565b975061391d83613fbf565b9250506001810190506138fe565b5085935050505092915050565b613941816140f3565b82525050565b613950816140f3565b82525050565b600061396182613f9c565b61396b8185613fee565b935061397b818560208601614178565b6139848161436e565b840191505092915050565b600061399a82613f9c565b6139a48185613fff565b93506139b4818560208601614178565b80840191505092915050565b600081546139cd816141d5565b6139d78186613fff565b945060018216600081146139f25760018114613a0357613a36565b60ff19831686528186019350613a36565b613a0c85613f71565b60005b83811015613a2e57815481890152600182019150602081019050613a0f565b838801955050505b50505092915050565b6000613a4b838561400a565b9350613a58838584614169565b613a618361436e565b840190509392505050565b6000613a7782613fa7565b613a81818561400a565b9350613a91818560208601614178565b613a9a8161436e565b840191505092915050565b6000613ab082613fa7565b613aba818561401b565b9350613aca818560208601614178565b80840191505092915050565b6000613ae360188361400a565b9150613aee8261437f565b602082019050919050565b6000613b0660268361400a565b9150613b11826143a8565b604082019050919050565b6000613b29600d8361400a565b9150613b34826143f7565b602082019050919050565b6000613b4c60398361400a565b9150613b5782614420565b604082019050919050565b6000613b6f60208361400a565b9150613b7a8261446f565b602082019050919050565b6000613b92602f8361400a565b9150613b9d82614498565b604082019050919050565b606082016000820151613bbe600085018261385e565b506020820151613bd16020850182613c4a565b506040820151613be46040850182613938565b50505050565b606082016000820151613c00600085018261385e565b506020820151613c136020850182613c4a565b506040820151613c266040850182613938565b50505050565b613c358161414b565b82525050565b613c448161414b565b82525050565b613c5381614155565b82525050565b6000613c65828461398f565b915081905092915050565b6000613c7c82846139c0565b915081905092915050565b6000613c938285613aa5565b9150613c9f8284613aa5565b91508190509392505050565b6000602082019050613cc0600083018461386d565b92915050565b6000608082019050613cdb600083018761386d565b613ce8602083018661386d565b613cf56040830185613c3b565b8181036060830152613d078184613956565b905095945050505050565b60006020820190508181036000830152613d2c818461387c565b905092915050565b60006020820190508181036000830152613d4e81846138da565b905092915050565b6000602082019050613d6b6000830184613947565b92915050565b60006020820190508181036000830152613d8b8184613956565b905092915050565b60006020820190508181036000830152613dae818486613a3f565b90509392505050565b60006020820190508181036000830152613dd18184613a6c565b905092915050565b60006020820190508181036000830152613df281613ad6565b9050919050565b60006020820190508181036000830152613e1281613af9565b9050919050565b60006020820190508181036000830152613e3281613b1c565b9050919050565b60006020820190508181036000830152613e5281613b3f565b9050919050565b60006020820190508181036000830152613e7281613b62565b9050919050565b60006020820190508181036000830152613e9281613b85565b9050919050565b6000606082019050613eae6000830184613bea565b92915050565b6000602082019050613ec96000830184613c3b565b92915050565b6000613ed9613eea565b9050613ee58282614207565b919050565b6000604051905090565b600067ffffffffffffffff821115613f0f57613f0e61433f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f3b57613f3a61433f565b5b613f448261436e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140318261414b565b915061403c8361414b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614071576140706142b2565b5b828201905092915050565b60006140878261414b565b91506140928361414b565b9250826140a2576140a16142e1565b5b828204905092915050565b60006140b88261414b565b91506140c38361414b565b9250828210156140d6576140d56142b2565b5b828203905092915050565b60006140ec8261412b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561419657808201518184015260208101905061417b565b838111156141a5576000848401525b50505050565b60006141b68261414b565b915060008214156141ca576141c96142b2565b5b600182039050919050565b600060028204905060018216806141ed57607f821691505b6020821081141561420157614200614310565b5b50919050565b6142108261436e565b810181811067ffffffffffffffff8211171561422f5761422e61433f565b5b80604052505050565b60006142438261414b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614276576142756142b2565b5b600182019050919050565b600061428c8261414b565b91506142978361414b565b9250826142a7576142a66142e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f46756e6374696f6e20646f6573206e6f742065786973742e0000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e63496420636c6173682e00000000000000000000000000000000000000600082015250565b7f5f64656c65676174652061646472657373206973206e6f74206120636f6e747260008201527f61637420616e64206973206e6f74206164647265737328302900000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6144f0816140e1565b81146144fb57600080fd5b50565b614507816140f3565b811461451257600080fd5b50565b61451e816140ff565b811461452957600080fd5b50565b6145358161414b565b811461454057600080fd5b5056fea26469706673582212202e162d460b6dd6245171086dc621a04edc92f3a756d594fee1aa390dc9be616064736f6c63430008040033

Deployed Bytecode Sourcemap

60133:6898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61196:1;61189:9;;61178:20;;;:7;;;;:20;;;;:44;;;;;61220:1;61202:9;:20;;61178:44;61174:127;;;61283:7;;61174:127;61311:16;61330:9;:18;61340:7;;;;61330:18;;;;;;;;;;;;;;;;;;;;;;;;;;;61311:37;;61387:1;61367:22;;:8;:22;;;;61359:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;61470:4;61464:11;61510:14;61507:1;61502:3;61489:36;61607:1;61604;61588:14;61583:3;61573:8;61566:5;61553:56;61635:16;61688:4;61685:1;61680:3;61665:28;61714:6;61739:1;61734:26;;;;61796:4;61791:3;61783:18;61734:26;61754:4;61749:3;61742:17;61438:375;60133:6898;27442:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30555:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32058:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31621:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26691:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32923:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2930:29;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33164:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50217:459;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62608:3799;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30363:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56690:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27811:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58886:94;;;;;;;;;;;;;:::i;:::-;;54016:882;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58235:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30724:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51066:2501;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2814:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32334:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33420:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49649:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66589:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32692:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59135:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27442:305;27544:4;27596:25;27581:40;;;:11;:40;;;;:105;;;;27653:33;27638:48;;;:11;:48;;;;27581:105;:158;;;;27703:36;27727:11;27703:23;:36::i;:::-;27581:158;27561:178;;27442:305;;;:::o;30555:100::-;30609:13;30642:5;30635:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30555:100;:::o;32058:204::-;32126:7;32151:16;32159:7;32151;:16::i;:::-;32146:64;;32176:34;;;;;;;;;;;;;;32146:64;32230:15;:24;32246:7;32230:24;;;;;;;;;;;;;;;;;;;;;32223:31;;32058:204;;;:::o;31621:371::-;31694:13;31710:24;31726:7;31710:15;:24::i;:::-;31694:40;;31755:5;31749:11;;:2;:11;;;31745:48;;;31769:24;;;;;;;;;;;;;;31745:48;31826:5;31810:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;31836:37;31853:5;31860:12;:10;:12::i;:::-;31836:16;:37::i;:::-;31835:38;31810:63;31806:138;;;31897:35;;;;;;;;;;;;;;31806:138;31956:28;31965:2;31969:7;31978:5;31956:8;:28::i;:::-;31621:371;;;:::o;26691:303::-;26735:7;26960:15;:13;:15::i;:::-;26945:12;;26929:13;;:28;:46;26922:53;;26691:303;:::o;32923:170::-;33057:28;33067:4;33073:2;33077:7;33057:9;:28::i;:::-;32923:170;;;:::o;2930:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33164:185::-;33302:39;33319:4;33325:2;33329:7;33302:39;;;;;;;;;;;;:16;:39::i;:::-;33164:185;;;:::o;50217:459::-;50297:23;50358:22;50383:8;:15;50358:40;;50413:34;50471:14;50450:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;50413:73;;50506:9;50501:125;50522:14;50517:1;:19;50501:125;;50578:32;50598:8;50607:1;50598:11;;;;;;;;;;;;;;;;;;;;;;50578:19;:32::i;:::-;50562:10;50573:1;50562:13;;;;;;;;;;;;;;;;;;;;;:48;;;;50538:3;;;;;50501:125;;;;50647:10;50640:17;;;;50217:459;;;:::o;62608:3799::-;58466:12;:10;:12::i;:::-;58455:23;;:7;:5;:7::i;:::-;:23;;;58447:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62992:11:::1;63038:1:::0;63017:23:::1;;:9;:23;;;63014:218;;63104:9;63092:22;63085:29;;63157:1;63151:3;:7;63143:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63014:218;63303:23;63335:19;;63303:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63440:21;63560:13:::0;63630:2:::1;63619:10;63615:18;63608:25;;63656:3;63647:12;;63704:10;63698:17;63694:3;63690:26;63673:43;;63799:13;63915:19:::0;64025:11:::1;64104:12:::0;64214:13:::1;64296:17:::0;64398:1957:::1;64411:13;64405:3;:19;64398:1957;;;64479:3;64473:10;64471:1;64466:18;64458:26;;64537:4;64529;:12;64525:1819;;;64562:5;;;;;:::i;:::-;;;;64599;64593:3;:11;;;;:::i;:::-;64586:19;;64632:3;64624:11;;64704:3;64693:10;64686:22;64771:10;64761:21;;;;;;64745:38;;64816:9;:17:::0;64826:6:::1;64816:17;;;;;;;;;;;;;;;;;;;;;;;;;;;64802:31;;64876:1;64855:23;;:9;:23;;;64852:1415;;;64911:20;64932:10;64911:32;;;;;;:::i;:::-;;;;;;;;;;;;;;64903:40;;64983:1;64974:5;:10;;64966:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;65036:7;;;;;:::i;:::-;;;;65102:1;65078:14:::0;:21:::1;;;;:25;;;;:::i;:::-;65066:37;;65139:9;65130:5;:18;65126:210;;65201:14;65216:9;65201:25;;;;;;;;;;;;;;;;;;;;;;;65177:14;65192:5;65177:21;;;;;;;;;;;;;;;;;;;;;;;:49;;;;;;:::i;:::-;;;;;;:::i;:::-;;65311:1;65303:5;:9;;;;:::i;:::-;65253:20;65274:14;65289:9;65274:25;;;;;;;;;;;;;;;;;;;;;;;65253:47;;;;;;:::i;:::-;;;;;;;;;;;;;:59;;;;65126:210;65358:14;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65408;65429:10;65408:32;;;;;;:::i;:::-;;;;;;;;;;;;;65401:39;;;65470:9;:17:::0;65480:6:::1;65470:17;;;;;;;;;;;;;;;;;;65463:24;;;;;;;;;;;65559:1;65515:67;;65538:11;65515:67;;65530:6;65515:67;;;;65570:10;65515:67;;;;;;:::i;:::-;;;;;;;;64852:1415;;;65665:1;65629:20;65650:10;65629:32;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;65625:642;;;65722:1;65699:25;;:11;:25;;;65691:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;65785:9;65765;:17:::0;65775:6:::1;65765:17;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;65817:14;65837:10;65817:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65906:14;:21;;;;65871:20;65892:10;65871:32;;;;;;:::i;:::-;;;;;;;;;;;;;:56;;;;65990:9;65955:65;;65986:1;65955:65;;65970:6;65955:65;;;;66008:10;65955:65;;;;;;:::i;:::-;;;;;;;;65625:642;;;66088:9;66067:30;;:9;:17:::0;66077:6:::1;66067:17;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;66063:204;;66142:9;66122;:17:::0;66132:6:::1;66122:17;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;66215:9;66179:66;;66202:11;66179:66;;66194:6;66179:66;;;;66233:10;66179:66;;;;;;:::i;:::-;;;;;;;;66063:204;65625:642;64852:1415;66324:3;66313:10;66309:19;66295:33;;66294:35;64426:5;;;;;:::i;:::-;;;;64398:1957;;;66370:29;66384:14;;66370:29;;;;;;;:::i;:::-;;;;;;;;58526:1;;;;;;;;;;62608:3799:::0;;;;;:::o;30363:125::-;30427:7;30454:21;30467:7;30454:12;:21::i;:::-;:26;;;30447:33;;30363:125;;;:::o;56690:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27811:206::-;27875:7;27916:1;27899:19;;:5;:19;;;27895:60;;;27927:28;;;;;;;;;;;;;;27895:60;27981:12;:19;27994:5;27981:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27973:36;;27966:43;;27811:206;;;:::o;58886:94::-;58466:12;:10;:12::i;:::-;58455:23;;:7;:5;:7::i;:::-;:23;;;58447:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58951:21:::1;58969:1;58951:9;:21::i;:::-;58886:94::o:0;54016:882::-;54077:16;54131:19;54165:25;54205:22;54230:16;54240:5;54230:9;:16::i;:::-;54205:41;;54261:25;54303:14;54289:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54261:57;;54333:31;;:::i;:::-;54384:9;54396:15;:13;:15::i;:::-;54384:27;;54379:471;54428:14;54413:11;:29;54379:471;;54480:11;:14;54492:1;54480:14;;;;;;;;;;;54468:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54517:9;:16;;;54513:73;;;54558:8;;54513:73;54634:1;54608:28;;:9;:14;;;:28;;;54604:111;;54681:9;:14;;;54661:34;;54604:111;54758:5;54737:26;;:17;:26;;;54733:102;;;54814:1;54788:8;54797:13;;;;;;54788:23;;;;;;;;;;;;;;;;;;;;;:27;;;;;54733:102;54379:471;54444:3;;;;;54379:471;;;;54871:8;54864:15;;;;;;;54016:882;;;:::o;58235:87::-;58281:7;58308:6;;;;;;;;;;;58301:13;;58235:87;:::o;30724:104::-;30780:13;30813:7;30806:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30724:104;:::o;51066:2501::-;51192:16;51258:4;51250:5;:12;51246:44;;;51271:19;;;;;;;;;;;;;;51246:44;51305:19;51339:17;51375:1;51359:13;;:17;51339:37;;51462:15;:13;:15::i;:::-;51454:5;:23;51450:87;;;51506:15;:13;:15::i;:::-;51498:23;;51450:87;51617:9;51610:4;:16;51606:73;;;51654:9;51647:16;;51606:73;51693:25;51721:16;51731:5;51721:9;:16::i;:::-;51693:44;;51915:4;51907:5;:12;51903:278;;;51940:19;51969:5;51962:4;:12;51940:34;;52011:17;51997:11;:31;51993:111;;;52073:11;52053:31;;51993:111;51903:278;;;;52164:1;52144:21;;51903:278;52195:25;52237:17;52223:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52195:60;;52295:1;52274:17;:22;52270:78;;;52324:8;52317:15;;;;;;;;52270:78;52492:31;52526:26;52546:5;52526:19;:26::i;:::-;52492:60;;52567:25;52812:9;:16;;;52807:92;;52869:9;:14;;;52849:34;;52807:92;52918:9;52930:5;52918:17;;52913:477;52942:4;52937:1;:9;;:45;;;;;52965:17;52950:11;:32;;52937:45;52913:477;;;53020:11;:14;53032:1;53020:14;;;;;;;;;;;53008:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53057:9;:16;;;53053:73;;;53098:8;;53053:73;53174:1;53148:28;;:9;:14;;;:28;;;53144:111;;53221:9;:14;;;53201:34;;53144:111;53298:5;53277:26;;:17;:26;;;53273:102;;;53354:1;53328:8;53337:13;;;;;;53328:23;;;;;;;;;;;;;;;;;;;;;:27;;;;;53273:102;52913:477;52984:3;;;;;52913:477;;;;53492:11;53482:8;53475:29;53540:8;53533:15;;;;;;;;51066:2501;;;;;;:::o;2814:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;32334:287::-;32445:12;:10;:12::i;:::-;32433:24;;:8;:24;;;32429:54;;;32466:17;;;;;;;;;;;;;;32429:54;32541:8;32496:18;:32;32515:12;:10;:12::i;:::-;32496:32;;;;;;;;;;;;;;;:42;32529:8;32496:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32594:8;32565:48;;32580:12;:10;:12::i;:::-;32565:48;;;32604:8;32565:48;;;;;;:::i;:::-;;;;;;;;32334:287;;:::o;33420:369::-;33587:28;33597:4;33603:2;33607:7;33587:9;:28::i;:::-;33630:15;:2;:13;;;:15::i;:::-;:76;;;;;33650:56;33681:4;33687:2;33691:7;33700:5;33650:30;:56::i;:::-;33649:57;33630:76;33626:156;;;33730:40;;;;;;;;;;;;;;33626:156;33420:369;;;;:::o;49649:409::-;49716:21;;:::i;:::-;49750:31;;:::i;:::-;49806:15;:13;:15::i;:::-;49796:7;:25;:53;;;;49836:13;;49825:7;:24;;49796:53;49792:102;;;49873:9;49866:16;;;;;49792:102;49916:11;:20;49928:7;49916:20;;;;;;;;;;;49904:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49951:9;:16;;;49947:65;;;49991:9;49984:16;;;;;49947:65;50029:21;50042:7;50029:12;:21::i;:::-;50022:28;;;49649:409;;;;:::o;66589:334::-;66662:13;66696:16;66704:7;66696;:16::i;:::-;66688:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;66777:21;66801:10;:8;:10::i;:::-;66777:34;;66853:1;66835:7;66829:21;:25;:86;;;;;;;;;;;;;;;;;66881:7;66890:18;:7;:16;:18::i;:::-;66864:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66829:86;66822:93;;;66589:334;;;:::o;32692:164::-;32789:4;32813:18;:25;32832:5;32813:25;;;;;;;;;;;;;;;:35;32839:8;32813:35;;;;;;;;;;;;;;;;;;;;;;;;;32806:42;;32692:164;;;;:::o;59135:192::-;58466:12;:10;:12::i;:::-;58455:23;;:7;:5;:7::i;:::-;:23;;;58447:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59244:1:::1;59224:22;;:8;:22;;;;59216:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59300:19;59310:8;59300:9;:19::i;:::-;59135:192:::0;:::o;23015:157::-;23100:4;23139:25;23124:40;;;:11;:40;;;;23117:47;;23015:157;;;:::o;34044:174::-;34101:4;34144:7;34125:15;:13;:15::i;:::-;:26;;:53;;;;;34165:13;;34155:7;:23;34125:53;:85;;;;;34183:11;:20;34195:7;34183:20;;;;;;;;;;;:27;;;;;;;;;;;;34182:28;34125:85;34118:92;;34044:174;;;:::o;19814:98::-;19867:7;19894:10;19887:17;;19814:98;:::o;45633:196::-;45775:2;45748:15;:24;45764:7;45748:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45813:7;45809:2;45793:28;;45802:5;45793:28;;;;;;;;;;;;45633:196;;;:::o;26465:92::-;26521:7;26548:1;26541:8;;26465:92;:::o;38511:2131::-;38627:35;38665:21;38678:7;38665:12;:21::i;:::-;38627:59;;38725:4;38703:26;;:13;:18;;;:26;;;38699:67;;38738:28;;;;;;;;;;;;;;38699:67;38779:22;38821:4;38805:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;38842:36;38859:4;38865:12;:10;:12::i;:::-;38842:16;:36::i;:::-;38805:73;:126;;;;38919:12;:10;:12::i;:::-;38895:36;;:20;38907:7;38895:11;:20::i;:::-;:36;;;38805:126;38779:153;;38950:17;38945:66;;38976:35;;;;;;;;;;;;;;38945:66;39040:1;39026:16;;:2;:16;;;39022:52;;;39051:23;;;;;;;;;;;;;;39022:52;39087:43;39109:4;39115:2;39119:7;39128:1;39087:21;:43::i;:::-;39195:35;39212:1;39216:7;39225:4;39195:8;:35::i;:::-;39556:1;39526:12;:18;39539:4;39526:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39600:1;39572:12;:16;39585:2;39572:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39618:31;39652:11;:20;39664:7;39652:20;;;;;;;;;;;39618:54;;39703:2;39687:8;:13;;;:18;;;;;;;;;;;;;;;;;;39753:15;39720:8;:23;;;:49;;;;;;;;;;;;;;;;;;40021:19;40053:1;40043:7;:11;40021:33;;40069:31;40103:11;:24;40115:11;40103:24;;;;;;;;;;;40069:58;;40171:1;40146:27;;:8;:13;;;;;;;;;;;;:27;;;40142:384;;;40356:13;;40341:11;:28;40337:174;;40410:4;40394:8;:13;;;:20;;;;;;;;;;;;;;;;;;40463:13;:28;;;40437:8;:23;;;:54;;;;;;;;;;;;;;;;;;40337:174;40142:384;38511:2131;;;40573:7;40569:2;40554:27;;40563:4;40554:27;;;;;;;;;;;;40592:42;40613:4;40619:2;40623:7;40632:1;40592:20;:42::i;:::-;38511:2131;;;;;:::o;29192:1109::-;29254:21;;:::i;:::-;29288:12;29303:7;29288:22;;29371:4;29352:15;:13;:15::i;:::-;:23;;:47;;;;;29386:13;;29379:4;:20;29352:47;29348:886;;;29420:31;29454:11;:17;29466:4;29454:17;;;;;;;;;;;29420:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29495:9;:16;;;29490:729;;29566:1;29540:28;;:9;:14;;;:28;;;29536:101;;29604:9;29597:16;;;;;;29536:101;29939:261;29946:4;29939:261;;;29979:6;;;;;;;;30024:11;:17;30036:4;30024:17;;;;;;;;;;;30012:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30098:1;30072:28;;:9;:14;;;:28;;;30068:109;;30140:9;30133:16;;;;;;30068:109;29939:261;;;29490:729;29348:886;;30262:31;;;;;;;;;;;;;;29192:1109;;;;:::o;59335:174::-;59392:16;59411:6;;;;;;;;;;;59392:25;;59437:8;59428:6;;:17;;;;;;;;;;;;;;;;;;59492:8;59461:40;;59482:8;59461:40;;;;;;;;;;;;59335:174;;:::o;11804:387::-;11864:4;12072:12;12139:7;12127:20;12119:28;;12182:1;12175:4;:8;12168:15;;;11804:387;;;:::o;46321:668::-;46485:4;46522:2;46506:36;;;46543:12;:10;:12::i;:::-;46557:4;46563:7;46572:5;46506:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46502:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46757:1;46740:6;:13;:18;46736:235;;;46786:40;;;;;;;;;;;;;;46736:235;46929:6;46923:13;46914:6;46910:2;46906:15;46899:38;46502:480;46635:45;;;46625:55;;;:6;:55;;;;46618:62;;;46321:668;;;;;;:::o;66415:106::-;66475:13;66506:7;66499:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66415:106;:::o;20393:723::-;20449:13;20679:1;20670:5;:10;20666:53;;;20697:10;;;;;;;;;;;;;;;;;;;;;20666:53;20729:12;20744:5;20729:20;;20760:14;20785:78;20800:1;20792:4;:9;20785:78;;20818:8;;;;;:::i;:::-;;;;20849:2;20841:10;;;;;:::i;:::-;;;20785:78;;;20873:19;20905:6;20895:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20873:39;;20923:154;20939:1;20930:5;:10;20923:154;;20967:1;20957:11;;;;;:::i;:::-;;;21034:2;21026:5;:10;;;;:::i;:::-;21013:2;:24;;;;:::i;:::-;21000:39;;20983:6;20990;20983:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;21063:2;21054:11;;;;;:::i;:::-;;;20923:154;;;21101:6;21087:21;;;;;20393:723;;;;:::o;47637:159::-;;;;;:::o;48455:158::-;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:139::-;1080:5;1118:6;1105:20;1096:29;;1134:33;1161:5;1134:33;:::i;:::-;1086:87;;;;:::o;1196:303::-;1267:5;1316:3;1309:4;1301:6;1297:17;1293:27;1283:2;;1334:1;1331;1324:12;1283:2;1374:6;1361:20;1399:94;1489:3;1481:6;1474:4;1466:6;1462:17;1399:94;:::i;:::-;1390:103;;1273:226;;;;;:::o;1505:133::-;1548:5;1586:6;1573:20;1564:29;;1602:30;1626:5;1602:30;:::i;:::-;1554:84;;;;:::o;1644:137::-;1689:5;1727:6;1714:20;1705:29;;1743:32;1769:5;1743:32;:::i;:::-;1695:86;;;;:::o;1787:141::-;1843:5;1874:6;1868:13;1859:22;;1890:32;1916:5;1890:32;:::i;:::-;1849:79;;;;:::o;1947:271::-;2002:5;2051:3;2044:4;2036:6;2032:17;2028:27;2018:2;;2069:1;2066;2059:12;2018:2;2109:6;2096:20;2134:78;2208:3;2200:6;2193:4;2185:6;2181:17;2134:78;:::i;:::-;2125:87;;2008:210;;;;;:::o;2238:352::-;2296:8;2306:6;2356:3;2349:4;2341:6;2337:17;2333:27;2323:2;;2374:1;2371;2364:12;2323:2;2410:6;2397:20;2387:30;;2440:18;2432:6;2429:30;2426:2;;;2472:1;2469;2462:12;2426:2;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:2;;;2580:1;2577;2570:12;2523:2;2313:277;;;;;:::o;2596:139::-;2642:5;2680:6;2667:20;2658:29;;2696:33;2723:5;2696:33;:::i;:::-;2648:87;;;;:::o;2741:262::-;2800:6;2849:2;2837:9;2828:7;2824:23;2820:32;2817:2;;;2865:1;2862;2855:12;2817:2;2908:1;2933:53;2978:7;2969:6;2958:9;2954:22;2933:53;:::i;:::-;2923:63;;2879:117;2807:196;;;;:::o;3009:407::-;3077:6;3085;3134:2;3122:9;3113:7;3109:23;3105:32;3102:2;;;3150:1;3147;3140:12;3102:2;3193:1;3218:53;3263:7;3254:6;3243:9;3239:22;3218:53;:::i;:::-;3208:63;;3164:117;3320:2;3346:53;3391:7;3382:6;3371:9;3367:22;3346:53;:::i;:::-;3336:63;;3291:118;3092:324;;;;;:::o;3422:552::-;3499:6;3507;3515;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;3580:1;3577;3570:12;3532:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;3522:452;;;;;:::o;3980:809::-;4075:6;4083;4091;4099;4148:3;4136:9;4127:7;4123:23;4119:33;4116:2;;;4165:1;4162;4155:12;4116:2;4208:1;4233:53;4278:7;4269:6;4258:9;4254:22;4233:53;:::i;:::-;4223:63;;4179:117;4335:2;4361:53;4406:7;4397:6;4386:9;4382:22;4361:53;:::i;:::-;4351:63;;4306:118;4463:2;4489:53;4534:7;4525:6;4514:9;4510:22;4489:53;:::i;:::-;4479:63;;4434:118;4619:2;4608:9;4604:18;4591:32;4650:18;4642:6;4639:30;4636:2;;;4682:1;4679;4672:12;4636:2;4710:62;4764:7;4755:6;4744:9;4740:22;4710:62;:::i;:::-;4700:72;;4562:220;4106:683;;;;;;;:::o;4795:401::-;4860:6;4868;4917:2;4905:9;4896:7;4892:23;4888:32;4885:2;;;4933:1;4930;4923:12;4885:2;4976:1;5001:53;5046:7;5037:6;5026:9;5022:22;5001:53;:::i;:::-;4991:63;;4947:117;5103:2;5129:50;5171:7;5162:6;5151:9;5147:22;5129:50;:::i;:::-;5119:60;;5074:115;4875:321;;;;;:::o;5202:818::-;5303:6;5311;5319;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:2;;;5400:1;5397;5390:12;5352:2;5443:1;5468:53;5513:7;5504:6;5493:9;5489:22;5468:53;:::i;:::-;5458:63;;5414:117;5598:2;5587:9;5583:18;5570:32;5629:18;5621:6;5618:30;5615:2;;;5661:1;5658;5651:12;5615:2;5697:65;5754:7;5745:6;5734:9;5730:22;5697:65;:::i;:::-;5679:83;;;;5541:231;5839:2;5828:9;5824:18;5811:32;5870:18;5862:6;5859:30;5856:2;;;5902:1;5899;5892:12;5856:2;5938:65;5995:7;5986:6;5975:9;5971:22;5938:65;:::i;:::-;5920:83;;;;5782:231;5342:678;;;;;;;;:::o;6026:407::-;6094:6;6102;6151:2;6139:9;6130:7;6126:23;6122:32;6119:2;;;6167:1;6164;6157:12;6119:2;6210:1;6235:53;6280:7;6271:6;6260:9;6256:22;6235:53;:::i;:::-;6225:63;;6181:117;6337:2;6363:53;6408:7;6399:6;6388:9;6384:22;6363:53;:::i;:::-;6353:63;;6308:118;6109:324;;;;;:::o;6439:552::-;6516:6;6524;6532;6581:2;6569:9;6560:7;6556:23;6552:32;6549:2;;;6597:1;6594;6587:12;6549:2;6640:1;6665:53;6710:7;6701:6;6690:9;6686:22;6665:53;:::i;:::-;6655:63;;6611:117;6767:2;6793:53;6838:7;6829:6;6818:9;6814:22;6793:53;:::i;:::-;6783:63;;6738:118;6895:2;6921:53;6966:7;6957:6;6946:9;6942:22;6921:53;:::i;:::-;6911:63;;6866:118;6539:452;;;;;:::o;6997:405::-;7081:6;7130:2;7118:9;7109:7;7105:23;7101:32;7098:2;;;7146:1;7143;7136:12;7098:2;7217:1;7206:9;7202:17;7189:31;7247:18;7239:6;7236:30;7233:2;;;7279:1;7276;7269:12;7233:2;7307:78;7377:7;7368:6;7357:9;7353:22;7307:78;:::i;:::-;7297:88;;7160:235;7088:314;;;;:::o;7408:260::-;7466:6;7515:2;7503:9;7494:7;7490:23;7486:32;7483:2;;;7531:1;7528;7521:12;7483:2;7574:1;7599:52;7643:7;7634:6;7623:9;7619:22;7599:52;:::i;:::-;7589:62;;7545:116;7473:195;;;;:::o;7674:282::-;7743:6;7792:2;7780:9;7771:7;7767:23;7763:32;7760:2;;;7808:1;7805;7798:12;7760:2;7851:1;7876:63;7931:7;7922:6;7911:9;7907:22;7876:63;:::i;:::-;7866:73;;7822:127;7750:206;;;;:::o;7962:262::-;8021:6;8070:2;8058:9;8049:7;8045:23;8041:32;8038:2;;;8086:1;8083;8076:12;8038:2;8129:1;8154:53;8199:7;8190:6;8179:9;8175:22;8154:53;:::i;:::-;8144:63;;8100:117;8028:196;;;;:::o;8230:303::-;8361:10;8382:108;8486:3;8478:6;8382:108;:::i;:::-;8522:4;8517:3;8513:14;8499:28;;8372:161;;;;:::o;8539:179::-;8608:10;8629:46;8671:3;8663:6;8629:46;:::i;:::-;8707:4;8702:3;8698:14;8684:28;;8619:99;;;;:::o;8724:108::-;8801:24;8819:5;8801:24;:::i;:::-;8796:3;8789:37;8779:53;;:::o;8838:118::-;8925:24;8943:5;8925:24;:::i;:::-;8920:3;8913:37;8903:53;;:::o;9036:980::-;9217:3;9246:85;9325:5;9246:85;:::i;:::-;9347:117;9457:6;9452:3;9347:117;:::i;:::-;9340:124;;9488:87;9569:5;9488:87;:::i;:::-;9598:7;9629:1;9614:377;9639:6;9636:1;9633:13;9614:377;;;9715:6;9709:13;9742:125;9863:3;9848:13;9742:125;:::i;:::-;9735:132;;9890:91;9974:6;9890:91;:::i;:::-;9880:101;;9674:317;9661:1;9658;9654:9;9649:14;;9614:377;;;9618:14;10007:3;10000:10;;9222:794;;;;;;;:::o;10052:732::-;10171:3;10200:54;10248:5;10200:54;:::i;:::-;10270:86;10349:6;10344:3;10270:86;:::i;:::-;10263:93;;10380:56;10430:5;10380:56;:::i;:::-;10459:7;10490:1;10475:284;10500:6;10497:1;10494:13;10475:284;;;10576:6;10570:13;10603:63;10662:3;10647:13;10603:63;:::i;:::-;10596:70;;10689:60;10742:6;10689:60;:::i;:::-;10679:70;;10535:224;10522:1;10519;10515:9;10510:14;;10475:284;;;10479:14;10775:3;10768:10;;10176:608;;;;;;;:::o;10790:99::-;10861:21;10876:5;10861:21;:::i;:::-;10856:3;10849:34;10839:50;;:::o;10895:109::-;10976:21;10991:5;10976:21;:::i;:::-;10971:3;10964:34;10954:50;;:::o;11010:360::-;11096:3;11124:38;11156:5;11124:38;:::i;:::-;11178:70;11241:6;11236:3;11178:70;:::i;:::-;11171:77;;11257:52;11302:6;11297:3;11290:4;11283:5;11279:16;11257:52;:::i;:::-;11334:29;11356:6;11334:29;:::i;:::-;11329:3;11325:39;11318:46;;11100:270;;;;;:::o;11376:373::-;11480:3;11508:38;11540:5;11508:38;:::i;:::-;11562:88;11643:6;11638:3;11562:88;:::i;:::-;11555:95;;11659:52;11704:6;11699:3;11692:4;11685:5;11681:16;11659:52;:::i;:::-;11736:6;11731:3;11727:16;11720:23;;11484:265;;;;;:::o;11777:841::-;11878:3;11915:5;11909:12;11944:36;11970:9;11944:36;:::i;:::-;11996:88;12077:6;12072:3;11996:88;:::i;:::-;11989:95;;12115:1;12104:9;12100:17;12131:1;12126:137;;;;12277:1;12272:340;;;;12093:519;;12126:137;12210:4;12206:9;12195;12191:25;12186:3;12179:38;12246:6;12241:3;12237:16;12230:23;;12126:137;;12272:340;12339:37;12370:5;12339:37;:::i;:::-;12398:1;12412:154;12426:6;12423:1;12420:13;12412:154;;;12500:7;12494:14;12490:1;12485:3;12481:11;12474:35;12550:1;12541:7;12537:15;12526:26;;12448:4;12445:1;12441:12;12436:17;;12412:154;;;12595:6;12590:3;12586:16;12579:23;;12279:333;;12093:519;;11882:736;;;;;;:::o;12648:304::-;12746:3;12767:71;12831:6;12826:3;12767:71;:::i;:::-;12760:78;;12848:43;12884:6;12879:3;12872:5;12848:43;:::i;:::-;12916:29;12938:6;12916:29;:::i;:::-;12911:3;12907:39;12900:46;;12750:202;;;;;:::o;12958:364::-;13046:3;13074:39;13107:5;13074:39;:::i;:::-;13129:71;13193:6;13188:3;13129:71;:::i;:::-;13122:78;;13209:52;13254:6;13249:3;13242:4;13235:5;13231:16;13209:52;:::i;:::-;13286:29;13308:6;13286:29;:::i;:::-;13281:3;13277:39;13270:46;;13050:272;;;;;:::o;13328:377::-;13434:3;13462:39;13495:5;13462:39;:::i;:::-;13517:89;13599:6;13594:3;13517:89;:::i;:::-;13510:96;;13615:52;13660:6;13655:3;13648:4;13641:5;13637:16;13615:52;:::i;:::-;13692:6;13687:3;13683:16;13676:23;;13438:267;;;;;:::o;13711:366::-;13853:3;13874:67;13938:2;13933:3;13874:67;:::i;:::-;13867:74;;13950:93;14039:3;13950:93;:::i;:::-;14068:2;14063:3;14059:12;14052:19;;13857:220;;;:::o;14083:366::-;14225:3;14246:67;14310:2;14305:3;14246:67;:::i;:::-;14239:74;;14322:93;14411:3;14322:93;:::i;:::-;14440:2;14435:3;14431:12;14424:19;;14229:220;;;:::o;14455:366::-;14597:3;14618:67;14682:2;14677:3;14618:67;:::i;:::-;14611:74;;14694:93;14783:3;14694:93;:::i;:::-;14812:2;14807:3;14803:12;14796:19;;14601:220;;;:::o;14827:366::-;14969:3;14990:67;15054:2;15049:3;14990:67;:::i;:::-;14983:74;;15066:93;15155:3;15066:93;:::i;:::-;15184:2;15179:3;15175:12;15168:19;;14973:220;;;:::o;15199:366::-;15341:3;15362:67;15426:2;15421:3;15362:67;:::i;:::-;15355:74;;15438:93;15527:3;15438:93;:::i;:::-;15556:2;15551:3;15547:12;15540:19;;15345:220;;;:::o;15571:366::-;15713:3;15734:67;15798:2;15793:3;15734:67;:::i;:::-;15727:74;;15810:93;15899:3;15810:93;:::i;:::-;15928:2;15923:3;15919:12;15912:19;;15717:220;;;:::o;16013:687::-;16162:4;16157:3;16153:14;16249:4;16242:5;16238:16;16232:23;16268:63;16325:4;16320:3;16316:14;16302:12;16268:63;:::i;:::-;16177:164;16433:4;16426:5;16422:16;16416:23;16452:61;16507:4;16502:3;16498:14;16484:12;16452:61;:::i;:::-;16351:172;16607:4;16600:5;16596:16;16590:23;16626:57;16677:4;16672:3;16668:14;16654:12;16626:57;:::i;:::-;16533:160;16131:569;;;:::o;16776:697::-;16935:4;16930:3;16926:14;17022:4;17015:5;17011:16;17005:23;17041:63;17098:4;17093:3;17089:14;17075:12;17041:63;:::i;:::-;16950:164;17206:4;17199:5;17195:16;17189:23;17225:61;17280:4;17275:3;17271:14;17257:12;17225:61;:::i;:::-;17124:172;17380:4;17373:5;17369:16;17363:23;17399:57;17450:4;17445:3;17441:14;17427:12;17399:57;:::i;:::-;17306:160;16904:569;;;:::o;17479:108::-;17556:24;17574:5;17556:24;:::i;:::-;17551:3;17544:37;17534:53;;:::o;17593:118::-;17680:24;17698:5;17680:24;:::i;:::-;17675:3;17668:37;17658:53;;:::o;17717:105::-;17792:23;17809:5;17792:23;:::i;:::-;17787:3;17780:36;17770:52;;:::o;17828:271::-;17958:3;17980:93;18069:3;18060:6;17980:93;:::i;:::-;17973:100;;18090:3;18083:10;;17962:137;;;;:::o;18105:265::-;18232:3;18254:90;18340:3;18331:6;18254:90;:::i;:::-;18247:97;;18361:3;18354:10;;18236:134;;;;:::o;18376:435::-;18556:3;18578:95;18669:3;18660:6;18578:95;:::i;:::-;18571:102;;18690:95;18781:3;18772:6;18690:95;:::i;:::-;18683:102;;18802:3;18795:10;;18560:251;;;;;:::o;18817:222::-;18910:4;18948:2;18937:9;18933:18;18925:26;;18961:71;19029:1;19018:9;19014:17;19005:6;18961:71;:::i;:::-;18915:124;;;;:::o;19045:640::-;19240:4;19278:3;19267:9;19263:19;19255:27;;19292:71;19360:1;19349:9;19345:17;19336:6;19292:71;:::i;:::-;19373:72;19441:2;19430:9;19426:18;19417:6;19373:72;:::i;:::-;19455;19523:2;19512:9;19508:18;19499:6;19455:72;:::i;:::-;19574:9;19568:4;19564:20;19559:2;19548:9;19544:18;19537:48;19602:76;19673:4;19664:6;19602:76;:::i;:::-;19594:84;;19245:440;;;;;;;:::o;19691:497::-;19896:4;19934:2;19923:9;19919:18;19911:26;;19983:9;19977:4;19973:20;19969:1;19958:9;19954:17;19947:47;20011:170;20176:4;20167:6;20011:170;:::i;:::-;20003:178;;19901:287;;;;:::o;20194:373::-;20337:4;20375:2;20364:9;20360:18;20352:26;;20424:9;20418:4;20414:20;20410:1;20399:9;20395:17;20388:47;20452:108;20555:4;20546:6;20452:108;:::i;:::-;20444:116;;20342:225;;;;:::o;20573:210::-;20660:4;20698:2;20687:9;20683:18;20675:26;;20711:65;20773:1;20762:9;20758:17;20749:6;20711:65;:::i;:::-;20665:118;;;;:::o;20789:309::-;20900:4;20938:2;20927:9;20923:18;20915:26;;20987:9;20981:4;20977:20;20973:1;20962:9;20958:17;20951:47;21015:76;21086:4;21077:6;21015:76;:::i;:::-;21007:84;;20905:193;;;;:::o;21104:333::-;21227:4;21265:2;21254:9;21250:18;21242:26;;21314:9;21308:4;21304:20;21300:1;21289:9;21285:17;21278:47;21342:88;21425:4;21416:6;21408;21342:88;:::i;:::-;21334:96;;21232:205;;;;;:::o;21443:313::-;21556:4;21594:2;21583:9;21579:18;21571:26;;21643:9;21637:4;21633:20;21629:1;21618:9;21614:17;21607:47;21671:78;21744:4;21735:6;21671:78;:::i;:::-;21663:86;;21561:195;;;;:::o;21762:419::-;21928:4;21966:2;21955:9;21951:18;21943:26;;22015:9;22009:4;22005:20;22001:1;21990:9;21986:17;21979:47;22043:131;22169:4;22043:131;:::i;:::-;22035:139;;21933:248;;;:::o;22187:419::-;22353:4;22391:2;22380:9;22376:18;22368:26;;22440:9;22434:4;22430:20;22426:1;22415:9;22411:17;22404:47;22468:131;22594:4;22468:131;:::i;:::-;22460:139;;22358:248;;;:::o;22612:419::-;22778:4;22816:2;22805:9;22801:18;22793:26;;22865:9;22859:4;22855:20;22851:1;22840:9;22836:17;22829:47;22893:131;23019:4;22893:131;:::i;:::-;22885:139;;22783:248;;;:::o;23037:419::-;23203:4;23241:2;23230:9;23226:18;23218:26;;23290:9;23284:4;23280:20;23276:1;23265:9;23261:17;23254:47;23318:131;23444:4;23318:131;:::i;:::-;23310:139;;23208:248;;;:::o;23462:419::-;23628:4;23666:2;23655:9;23651:18;23643:26;;23715:9;23709:4;23705:20;23701:1;23690:9;23686:17;23679:47;23743:131;23869:4;23743:131;:::i;:::-;23735:139;;23633:248;;;:::o;23887:419::-;24053:4;24091:2;24080:9;24076:18;24068:26;;24140:9;24134:4;24130:20;24126:1;24115:9;24111:17;24104:47;24168:131;24294:4;24168:131;:::i;:::-;24160:139;;24058:248;;;:::o;24312:346::-;24467:4;24505:2;24494:9;24490:18;24482:26;;24518:133;24648:1;24637:9;24633:17;24624:6;24518:133;:::i;:::-;24472:186;;;;:::o;24664:222::-;24757:4;24795:2;24784:9;24780:18;24772:26;;24808:71;24876:1;24865:9;24861:17;24852:6;24808:71;:::i;:::-;24762:124;;;;:::o;24892:129::-;24926:6;24953:20;;:::i;:::-;24943:30;;24982:33;25010:4;25002:6;24982:33;:::i;:::-;24933:88;;;:::o;25027:75::-;25060:6;25093:2;25087:9;25077:19;;25067:35;:::o;25108:311::-;25185:4;25275:18;25267:6;25264:30;25261:2;;;25297:18;;:::i;:::-;25261:2;25347:4;25339:6;25335:17;25327:25;;25407:4;25401;25397:15;25389:23;;25190:229;;;:::o;25425:307::-;25486:4;25576:18;25568:6;25565:30;25562:2;;;25598:18;;:::i;:::-;25562:2;25636:29;25658:6;25636:29;:::i;:::-;25628:37;;25720:4;25714;25710:15;25702:23;;25491:241;;;:::o;25738:163::-;25836:4;25859:3;25851:11;;25889:4;25884:3;25880:14;25872:22;;25841:60;;;:::o;25907:132::-;25974:4;25997:3;25989:11;;26027:4;26022:3;26018:14;26010:22;;25979:60;;;:::o;26045:140::-;26093:4;26116:3;26108:11;;26139:3;26136:1;26129:14;26173:4;26170:1;26160:18;26152:26;;26098:87;;;:::o;26191:145::-;26289:6;26323:5;26317:12;26307:22;;26296:40;;;:::o;26342:114::-;26409:6;26443:5;26437:12;26427:22;;26416:40;;;:::o;26462:98::-;26513:6;26547:5;26541:12;26531:22;;26520:40;;;:::o;26566:99::-;26618:6;26652:5;26646:12;26636:22;;26625:40;;;:::o;26671:144::-;26772:4;26804;26799:3;26795:14;26787:22;;26777:38;;;:::o;26821:113::-;26891:4;26923;26918:3;26914:14;26906:22;;26896:38;;;:::o;26940:215::-;27070:11;27104:6;27099:3;27092:19;27144:4;27139:3;27135:14;27120:29;;27082:73;;;;:::o;27161:184::-;27260:11;27294:6;27289:3;27282:19;27334:4;27329:3;27325:14;27310:29;;27272:73;;;;:::o;27351:168::-;27434:11;27468:6;27463:3;27456:19;27508:4;27503:3;27499:14;27484:29;;27446:73;;;;:::o;27525:147::-;27626:11;27663:3;27648:18;;27638:34;;;;:::o;27678:169::-;27762:11;27796:6;27791:3;27784:19;27836:4;27831:3;27827:14;27812:29;;27774:73;;;;:::o;27853:148::-;27955:11;27992:3;27977:18;;27967:34;;;;:::o;28007:305::-;28047:3;28066:20;28084:1;28066:20;:::i;:::-;28061:25;;28100:20;28118:1;28100:20;:::i;:::-;28095:25;;28254:1;28186:66;28182:74;28179:1;28176:81;28173:2;;;28260:18;;:::i;:::-;28173:2;28304:1;28301;28297:9;28290:16;;28051:261;;;;:::o;28318:185::-;28358:1;28375:20;28393:1;28375:20;:::i;:::-;28370:25;;28409:20;28427:1;28409:20;:::i;:::-;28404:25;;28448:1;28438:2;;28453:18;;:::i;:::-;28438:2;28495:1;28492;28488:9;28483:14;;28360:143;;;;:::o;28509:191::-;28549:4;28569:20;28587:1;28569:20;:::i;:::-;28564:25;;28603:20;28621:1;28603:20;:::i;:::-;28598:25;;28642:1;28639;28636:8;28633:2;;;28647:18;;:::i;:::-;28633:2;28692:1;28689;28685:9;28677:17;;28554:146;;;;:::o;28706:96::-;28743:7;28772:24;28790:5;28772:24;:::i;:::-;28761:35;;28751:51;;;:::o;28808:90::-;28842:7;28885:5;28878:13;28871:21;28860:32;;28850:48;;;:::o;28904:149::-;28940:7;28980:66;28973:5;28969:78;28958:89;;28948:105;;;:::o;29059:126::-;29096:7;29136:42;29129:5;29125:54;29114:65;;29104:81;;;:::o;29191:77::-;29228:7;29257:5;29246:16;;29236:32;;;:::o;29274:101::-;29310:7;29350:18;29343:5;29339:30;29328:41;;29318:57;;;:::o;29381:154::-;29465:6;29460:3;29455;29442:30;29527:1;29518:6;29513:3;29509:16;29502:27;29432:103;;;:::o;29541:307::-;29609:1;29619:113;29633:6;29630:1;29627:13;29619:113;;;29718:1;29713:3;29709:11;29703:18;29699:1;29694:3;29690:11;29683:39;29655:2;29652:1;29648:10;29643:15;;29619:113;;;29750:6;29747:1;29744:13;29741:2;;;29830:1;29821:6;29816:3;29812:16;29805:27;29741:2;29590:258;;;;:::o;29854:171::-;29893:3;29916:24;29934:5;29916:24;:::i;:::-;29907:33;;29962:4;29955:5;29952:15;29949:2;;;29970:18;;:::i;:::-;29949:2;30017:1;30010:5;30006:13;29999:20;;29897:128;;;:::o;30031:320::-;30075:6;30112:1;30106:4;30102:12;30092:22;;30159:1;30153:4;30149:12;30180:18;30170:2;;30236:4;30228:6;30224:17;30214:27;;30170:2;30298;30290:6;30287:14;30267:18;30264:38;30261:2;;;30317:18;;:::i;:::-;30261:2;30082:269;;;;:::o;30357:281::-;30440:27;30462:4;30440:27;:::i;:::-;30432:6;30428:40;30570:6;30558:10;30555:22;30534:18;30522:10;30519:34;30516:62;30513:2;;;30581:18;;:::i;:::-;30513:2;30621:10;30617:2;30610:22;30400:238;;;:::o;30644:233::-;30683:3;30706:24;30724:5;30706:24;:::i;:::-;30697:33;;30752:66;30745:5;30742:77;30739:2;;;30822:18;;:::i;:::-;30739:2;30869:1;30862:5;30858:13;30851:20;;30687:190;;;:::o;30883:176::-;30915:1;30932:20;30950:1;30932:20;:::i;:::-;30927:25;;30966:20;30984:1;30966:20;:::i;:::-;30961:25;;31005:1;30995:2;;31010:18;;:::i;:::-;30995:2;31051:1;31048;31044:9;31039:14;;30917:142;;;;:::o;31065:180::-;31113:77;31110:1;31103:88;31210:4;31207:1;31200:15;31234:4;31231:1;31224:15;31251:180;31299:77;31296:1;31289:88;31396:4;31393:1;31386:15;31420:4;31417:1;31410:15;31437:180;31485:77;31482:1;31475:88;31582:4;31579:1;31572:15;31606:4;31603:1;31596:15;31623:180;31671:77;31668:1;31661:88;31768:4;31765:1;31758:15;31792:4;31789:1;31782:15;31809:102;31850:6;31901:2;31897:7;31892:2;31885:5;31881:14;31877:28;31867:38;;31857:54;;;:::o;31917:174::-;32057:26;32053:1;32045:6;32041:14;32034:50;32023:68;:::o;32097:225::-;32237:34;32233:1;32225:6;32221:14;32214:58;32306:8;32301:2;32293:6;32289:15;32282:33;32203:119;:::o;32328:163::-;32468:15;32464:1;32456:6;32452:14;32445:39;32434:57;:::o;32497:244::-;32637:34;32633:1;32625:6;32621:14;32614:58;32706:27;32701:2;32693:6;32689:15;32682:52;32603:138;:::o;32747:182::-;32887:34;32883:1;32875:6;32871:14;32864:58;32853:76;:::o;32935:234::-;33075:34;33071:1;33063:6;33059:14;33052:58;33144:17;33139:2;33131:6;33127:15;33120:42;33041:128;:::o;33175:122::-;33248:24;33266:5;33248:24;:::i;:::-;33241:5;33238:35;33228:2;;33287:1;33284;33277:12;33228:2;33218:79;:::o;33303:116::-;33373:21;33388:5;33373:21;:::i;:::-;33366:5;33363:32;33353:2;;33409:1;33406;33399:12;33353:2;33343:76;:::o;33425:120::-;33497:23;33514:5;33497:23;:::i;:::-;33490:5;33487:34;33477:2;;33535:1;33532;33525:12;33477:2;33467:78;:::o;33551:122::-;33624:24;33642:5;33624:24;:::i;:::-;33617:5;33614:35;33604:2;;33663:1;33660;33653:12;33604:2;33594:79;:::o

Swarm Source

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