ETH Price: $3,232.95 (-0.66%)
Gas: 1 Gwei

Token

Sick of Editions (SOE)
 

Overview

Max Total Supply

500 SOE

Holders

186

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SOE
0x0755d98751ebd89c2b6991fa1cb9d5acf8714b30
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SICKOFEDITIONS

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-10
*/

/**
 *Submitted for verification at Etherscan.io on 2023-01-06
*/

// SPDX-License-Identifier: MIT

//not an edition.not an edition.not an edition.not an edition.not an edition.not an edition.not an edition.not an edition.not an edition.not an edition.


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts 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/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts 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/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: contracts/new.sol




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) private _addressData;

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

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

    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 0;
    }

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

    function _safeMint(address to, uint256 quantity) internal {
        _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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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;

            if (safe && 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 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
    ) private {
        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 This is 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
    ) private 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 {}
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
pragma solidity ^0.8.13;



abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
pragma solidity ^0.8.13;



abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
    pragma solidity ^0.8.7;
    
    contract SICKOFEDITIONS is ERC721A,DefaultOperatorFilterer , Ownable {
    using Strings for uint256;


  string private uriPrefix ;
  string private uriSuffix = ".json";
  string public hiddenURL;

  
  

  uint256 public cost = 0.01 ether;
  uint256 public whiteListCost = 0 ;
  

  uint16 public maxSupply = 500;
  uint8 public maxMintAmountPerTx = 50;
  uint8 public maxMintAmountPerWallet = 100;
    uint8 public maxFreeMintAmountPerWallet = 1;
                                                             
  bool public WLpaused = true;
  bool public paused = true;
  bool public reveal =false;
  mapping (address => uint8) public NFTPerWLAddress;
   mapping (address => uint8) public NFTPerPublicAddress;
  mapping (address => bool) public isWhitelisted;
 
  
  
 
  

  constructor() ERC721A("Sick of Editions", "SOE") {
  }

 
  

  
 
  function Mint(uint8 _mintAmount) external payable  {
     uint16 totalSupply = uint16(totalSupply());
     uint8 nft = NFTPerPublicAddress[msg.sender];
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
    require(_mintAmount + nft <= maxMintAmountPerWallet, "Exceeds max per Wallet.");
    require(_mintAmount  <= maxMintAmountPerTx, "Exceeds max per Wallet.");

    require(!paused, "The contract is paused!");
    
      if(nft >= maxFreeMintAmountPerWallet)
    {
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    }
    else {
         uint8 costAmount = _mintAmount + nft;
        if(costAmount > maxFreeMintAmountPerWallet)
       {
        costAmount = costAmount - maxFreeMintAmountPerWallet;
        require(msg.value >= cost * costAmount, "Insufficient funds!");
       }
       
         
    }
    


    _safeMint(msg.sender , _mintAmount);

    NFTPerPublicAddress[msg.sender] = _mintAmount + nft;
     
     delete totalSupply;
     delete _mintAmount;
  }
  
  function Reserve(uint16 _mintAmount, address _receiver) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
     _safeMint(_receiver , _mintAmount);
     delete _mintAmount;
     delete _receiver;
     delete totalSupply;
  }

  function  Airdrop(uint8 _amountPerAddress, address[] calldata addresses) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
     uint totalAmount =   _amountPerAddress * addresses.length;
    require(totalSupply + totalAmount <= maxSupply, "Exceees max supply.");
     for (uint256 i = 0; i < addresses.length; i++) {
            _safeMint(addresses[i], _amountPerAddress);
        }

     delete _amountPerAddress;
     delete totalSupply;
  }

 

  function setMaxSupply(uint16 _maxSupply) external onlyOwner {
      maxSupply = _maxSupply;
  }



   
  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
  
if ( reveal == false)
{
    return hiddenURL;
}
    

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString() ,uriSuffix))
        : "";
  }
 
   function setWLPaused() external onlyOwner {
    WLpaused = !WLpaused;
  }
  function setWLCost(uint256 _cost) external onlyOwner {
    whiteListCost = _cost;
    delete _cost;
  }



 function setFreeMaxLimitPerAddress(uint8 _limit) external onlyOwner{
    maxFreeMintAmountPerWallet = _limit;
   delete _limit;

}

    
  function addToPresaleWhitelist(address[] calldata entries) external onlyOwner {
        for(uint8 i = 0; i < entries.length; i++) {
            isWhitelisted[entries[i]] = true;
        }   
    }

    function removeFromPresaleWhitelist(address[] calldata entries) external onlyOwner {
        for(uint8 i = 0; i < entries.length; i++) {
             isWhitelisted[entries[i]] = false;
        }
    }

function whitelistMint(uint8 _mintAmount) external payable {
        
    
        uint8 nft = NFTPerWLAddress[msg.sender];
        uint16 totalSupply = uint16(totalSupply());
       require(isWhitelisted[msg.sender],  "You are not whitelisted");
       require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");

       require (nft + _mintAmount <= maxMintAmountPerWallet, "Exceeds max  limit  per address");
        require (_mintAmount <= maxMintAmountPerTx, "Exceeds max  limit  per tx");
      


    require(!WLpaused, "Whitelist minting is over!");
         if(nft >= maxFreeMintAmountPerWallet)
    {
    require(msg.value >= whiteListCost * _mintAmount, "Insufficient funds!");
    }
    else {
         uint8 costAmount = _mintAmount + nft;
        if(costAmount > maxFreeMintAmountPerWallet)
       {
        costAmount = costAmount - maxFreeMintAmountPerWallet;
        require(msg.value >= whiteListCost * costAmount, "Insufficient funds!");
       }
       
         
    }
    
    

     _safeMint(msg.sender , _mintAmount);
      NFTPerWLAddress[msg.sender] =nft + _mintAmount;
     
      delete _mintAmount;
       delete nft;
    
    }

  function setUriPrefix(string memory _uriPrefix) external onlyOwner {
    uriPrefix = _uriPrefix;
  }
   function setHiddenUri(string memory _uriPrefix) external onlyOwner {
    hiddenURL = _uriPrefix;
  }


  function setPaused() external onlyOwner {
    paused = !paused;
    WLpaused = true;
  }

  function setCost(uint _cost) external onlyOwner{
      cost = _cost;

  }

 function setRevealed() external onlyOwner{
     reveal = !reveal;
 }

  function setMaxMintAmountPerTx(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerTx = _maxtx;

  }

  
  function setMaxMintAmountPerWallet(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerWallet = _maxtx;

  }

 

  function withdraw() external onlyOwner {
  uint _balance = address(this).balance;
     payable(msg.sender).transfer(_balance ); 
       
  }


  function _baseURI() internal view  override returns (string memory) {
    return uriPrefix;
  }
   function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

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":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint8","name":"_amountPerAddress","type":"uint8"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerPublicAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerWLAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WLpaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setFreeMaxLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setHiddenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWLCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWLPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000051929190620004f1565b50662386f26fc10000600c556000600d556101f4600e60006101000a81548161ffff021916908361ffff1602179055506032600e60026101000a81548160ff021916908360ff1602179055506064600e60036101000a81548160ff021916908360ff1602179055506001600e60046101000a81548160ff021916908360ff1602179055506001600e60056101000a81548160ff0219169083151502179055506001600e60066101000a81548160ff0219169083151502179055506000600e60076101000a81548160ff0219169083151502179055503480156200013357600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601081526020017f5369636b206f662045646974696f6e73000000000000000000000000000000008152506040518060400160405280600381526020017f534f4500000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001cf929190620004f1565b508060039080519060200190620001e8929190620004f1565b50620001f96200041e60201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003f6578015620002bc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000282929190620005e6565b600060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b50505050620003f5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000376576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200033c929190620005e6565b600060405180830381600087803b1580156200035757600080fd5b505af11580156200036c573d6000803e3d6000fd5b50505050620003f4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003bf919062000613565b600060405180830381600087803b158015620003da57600080fd5b505af1158015620003ef573d6000803e3d6000fd5b505050505b5b5b5050620004186200040c6200042360201b60201c565b6200042b60201b60201c565b62000694565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004ff906200065f565b90600052602060002090601f0160209004810192826200052357600085556200056f565b82601f106200053e57805160ff19168380011785556200056f565b828001600101855582156200056f579182015b828111156200056e57825182559160200191906001019062000551565b5b5090506200057e919062000582565b5090565b5b808211156200059d57600081600090555060010162000583565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005ce82620005a1565b9050919050565b620005e081620005c1565b82525050565b6000604082019050620005fd6000830185620005d5565b6200060c6020830184620005d5565b9392505050565b60006020820190506200062a6000830184620005d5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200067857607f821691505b6020821081036200068e576200068d62000630565b5b50919050565b6155bd80620006a46000396000f3fe6080604052600436106102935760003560e01c8063715018a61161015a578063aa062290116100c1578063d5abeb011161007a578063d5abeb0114610980578063e94053c7146109ab578063e985e9c5146109e8578063eef440af14610a25578063f2fde38b14610a50578063f8bf517214610a7957610293565b8063aa06229014610874578063b88d4fde1461089d578063bc951b91146108c6578063c87b56dd146108f1578063cffb6e201461092e578063d1d192131461095757610293565b80639257e044116101135780639257e0441461078357806394354fd0146107ae57806395d89b41146107d9578063a22cb46514610804578063a2522d2d1461082d578063a475b5dd1461084957610293565b8063715018a61461069b5780637ec4a659146106b25780637f6e9093146106db5780638da5cb5b146107065780638e07484c146107315780638f65fe0a1461075a57610293565b806337a66d85116101fe5780634d9c1848116101b75780634d9c18481461057457806359bf5dbb1461059d5780635c975abb146105da57806360e85cde146106055780636352211e1461062157806370a082311461065e57610293565b806337a66d85146104a05780633af32abf146104b75780633bd64968146104f45780633ccfd60b1461050b57806342842e0e1461052257806344a0d68a1461054b57610293565b80631067fcc7116102505780631067fcc7146103a657806313faede6146103cf57806318160ddd146103fa57806323b872dd1461042557806328b60d151461044e5780632f6f98e11461047757610293565b806301ffc9a71461029857806306421c2f146102d557806306fdde03146102fe578063081812fc14610329578063093cfa6314610366578063095ea7b31461037d575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba91906141e6565b610aa4565b6040516102cc919061422e565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190614283565b610b86565b005b34801561030a57600080fd5b50610313610c22565b6040516103209190614349565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906143a1565b610cb4565b60405161035d919061440f565b60405180910390f35b34801561037257600080fd5b5061037b610d30565b005b34801561038957600080fd5b506103a4600480360381019061039f9190614456565b610dd8565b005b3480156103b257600080fd5b506103cd60048036038101906103c891906145cb565b610ee2565b005b3480156103db57600080fd5b506103e4610f78565b6040516103f19190614623565b60405180910390f35b34801561040657600080fd5b5061040f610f7e565b60405161041c9190614623565b60405180910390f35b34801561043157600080fd5b5061044c6004803603810190610447919061463e565b610f95565b005b34801561045a57600080fd5b50610475600480360381019061047091906146ca565b611177565b005b34801561048357600080fd5b5061049e600480360381019061049991906146f7565b611211565b005b3480156104ac57600080fd5b506104b561131e565b005b3480156104c357600080fd5b506104de60048036038101906104d99190614737565b6113e1565b6040516104eb919061422e565b60405180910390f35b34801561050057600080fd5b50610509611401565b005b34801561051757600080fd5b506105206114a9565b005b34801561052e57600080fd5b506105496004803603810190610544919061463e565b611574565b005b34801561055757600080fd5b50610572600480360381019061056d91906143a1565b611756565b005b34801561058057600080fd5b5061059b600480360381019061059691906146ca565b6117dc565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190614737565b61187a565b6040516105d19190614773565b60405180910390f35b3480156105e657600080fd5b506105ef61189a565b6040516105fc919061422e565b60405180910390f35b61061f600480360381019061061a91906146ca565b6118ad565b005b34801561062d57600080fd5b50610648600480360381019061064391906143a1565b611c9b565b604051610655919061440f565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190614737565b611cb1565b6040516106929190614623565b60405180910390f35b3480156106a757600080fd5b506106b0611d80565b005b3480156106be57600080fd5b506106d960048036038101906106d491906145cb565b611e08565b005b3480156106e757600080fd5b506106f0611e9e565b6040516106fd919061422e565b60405180910390f35b34801561071257600080fd5b5061071b611eb1565b604051610728919061440f565b60405180910390f35b34801561073d57600080fd5b50610758600480360381019061075391906147ee565b611edb565b005b34801561076657600080fd5b50610781600480360381019061077c91906147ee565b612002565b005b34801561078f57600080fd5b50610798612129565b6040516107a59190614623565b60405180910390f35b3480156107ba57600080fd5b506107c361212f565b6040516107d09190614773565b60405180910390f35b3480156107e557600080fd5b506107ee612142565b6040516107fb9190614349565b60405180910390f35b34801561081057600080fd5b5061082b60048036038101906108269190614867565b6121d4565b005b610847600480360381019061084291906146ca565b61234b565b005b34801561085557600080fd5b5061085e6126ad565b60405161086b919061422e565b60405180910390f35b34801561088057600080fd5b5061089b600480360381019061089691906146ca565b6126c0565b005b3480156108a957600080fd5b506108c460048036038101906108bf9190614948565b61275a565b005b3480156108d257600080fd5b506108db61293f565b6040516108e89190614773565b60405180910390f35b3480156108fd57600080fd5b50610918600480360381019061091391906143a1565b612952565b6040516109259190614349565b60405180910390f35b34801561093a57600080fd5b50610955600480360381019061095091906149cb565b612aaa565b005b34801561096357600080fd5b5061097e600480360381019061097991906143a1565b612c13565b005b34801561098c57600080fd5b50610995612c9d565b6040516109a29190614a3a565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd9190614737565b612cb1565b6040516109df9190614773565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190614a55565b612cd1565b604051610a1c919061422e565b60405180910390f35b348015610a3157600080fd5b50610a3a612d65565b604051610a479190614349565b60405180910390f35b348015610a5c57600080fd5b50610a776004803603810190610a729190614737565b612df3565b005b348015610a8557600080fd5b50610a8e612eea565b604051610a9b9190614773565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b7f5750610b7e82612efd565b5b9050919050565b610b8e612f67565b73ffffffffffffffffffffffffffffffffffffffff16610bac611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990614ae1565b60405180910390fd5b80600e60006101000a81548161ffff021916908361ffff16021790555050565b606060028054610c3190614b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5d90614b30565b8015610caa5780601f10610c7f57610100808354040283529160200191610caa565b820191906000526020600020905b815481529060010190602001808311610c8d57829003601f168201915b5050505050905090565b6000610cbf82612f6f565b610cf5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610d38612f67565b73ffffffffffffffffffffffffffffffffffffffff16610d56611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390614ae1565b60405180910390fd5b600e60059054906101000a900460ff1615600e60056101000a81548160ff021916908315150217905550565b6000610de382611c9b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e4a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e69612f67565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e9b5750610e9981610e94612f67565b612cd1565b155b15610ed2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610edd838383612fbd565b505050565b610eea612f67565b73ffffffffffffffffffffffffffffffffffffffff16610f08611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614ae1565b60405180910390fd5b80600b9080519060200190610f74929190614094565b5050565b600c5481565b6000610f8861306f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611165573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100757611002848484613074565b611171565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611050929190614b61565b602060405180830381865afa15801561106d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110919190614b9f565b801561112357506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016110e1929190614b61565b602060405180830381865afa1580156110fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190614b9f565b5b61116457336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161115b919061440f565b60405180910390fd5b5b611170848484613074565b5b50505050565b61117f612f67565b73ffffffffffffffffffffffffffffffffffffffff1661119d611eb1565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90614ae1565b60405180910390fd5b80600e60036101000a81548160ff021916908360ff16021790555050565b611219612f67565b73ffffffffffffffffffffffffffffffffffffffff16611237611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490614ae1565b60405180910390fd5b6000611297610f7e565b9050600e60009054906101000a900461ffff1661ffff1683826112ba9190614bfb565b61ffff1611156112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614c7f565b60405180910390fd5b61130d828461ffff16613084565b600092506000915060009050505050565b611326612f67565b73ffffffffffffffffffffffffffffffffffffffff16611344611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614ae1565b60405180910390fd5b600e60069054906101000a900460ff1615600e60066101000a81548160ff0219169083151502179055506001600e60056101000a81548160ff021916908315150217905550565b60116020528060005260406000206000915054906101000a900460ff1681565b611409612f67565b73ffffffffffffffffffffffffffffffffffffffff16611427611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490614ae1565b60405180910390fd5b600e60079054906101000a900460ff1615600e60076101000a81548160ff021916908315150217905550565b6114b1612f67565b73ffffffffffffffffffffffffffffffffffffffff166114cf611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90614ae1565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611570573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611744573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115e6576115e18484846130a2565b611750565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161162f929190614b61565b602060405180830381865afa15801561164c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116709190614b9f565b801561170257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016116c0929190614b61565b602060405180830381865afa1580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117019190614b9f565b5b61174357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161173a919061440f565b60405180910390fd5b5b61174f8484846130a2565b5b50505050565b61175e612f67565b73ffffffffffffffffffffffffffffffffffffffff1661177c611eb1565b73ffffffffffffffffffffffffffffffffffffffff16146117d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c990614ae1565b60405180910390fd5b80600c8190555050565b6117e4612f67565b73ffffffffffffffffffffffffffffffffffffffff16611802611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90614ae1565b60405180910390fd5b80600e60046101000a81548160ff021916908360ff1602179055506000905050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600e60069054906101000a900460ff1681565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000611908610f7e565b9050601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90614ceb565b60405180910390fd5b600e60009054906101000a900461ffff1661ffff168360ff16826119ba9190614bfb565b61ffff1611156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690614c7f565b60405180910390fd5b600e60039054906101000a900460ff1660ff168383611a1e9190614d0b565b60ff161115611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990614d8e565b60405180910390fd5b600e60029054906101000a900460ff1660ff168360ff161115611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab190614dfa565b60405180910390fd5b600e60059054906101000a900460ff1615611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614e66565b60405180910390fd5b600e60049054906101000a900460ff1660ff168260ff1610611b7e578260ff16600d54611b379190614e86565b341015611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090614f2c565b60405180910390fd5b611c1e565b60008284611b8c9190614d0b565b9050600e60049054906101000a900460ff1660ff168160ff161115611c1c57600e60049054906101000a900460ff1681611bc69190614f4c565b90508060ff16600d54611bd99190614e86565b341015611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290614f2c565b60405180910390fd5b5b505b611c2b338460ff16613084565b8282611c379190614d0b565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000925060009150505050565b6000611ca6826130c2565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d18576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611d88612f67565b73ffffffffffffffffffffffffffffffffffffffff16611da6611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df390614ae1565b60405180910390fd5b611e066000613351565b565b611e10612f67565b73ffffffffffffffffffffffffffffffffffffffff16611e2e611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7b90614ae1565b60405180910390fd5b8060099080519060200190611e9a929190614094565b5050565b600e60059054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ee3612f67565b73ffffffffffffffffffffffffffffffffffffffff16611f01611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4e90614ae1565b60405180910390fd5b60005b828290508160ff161015611ffd5760016011600085858560ff16818110611f8457611f83614f80565b5b9050602002016020810190611f999190614737565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ff590614faf565b915050611f5a565b505050565b61200a612f67565b73ffffffffffffffffffffffffffffffffffffffff16612028611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590614ae1565b60405180910390fd5b60005b828290508160ff1610156121245760006011600085858560ff168181106120ab576120aa614f80565b5b90506020020160208101906120c09190614737565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061211c90614faf565b915050612081565b505050565b600d5481565b600e60029054906101000a900460ff1681565b60606003805461215190614b30565b80601f016020809104026020016040519081016040528092919081815260200182805461217d90614b30565b80156121ca5780601f1061219f576101008083540402835291602001916121ca565b820191906000526020600020905b8154815290600101906020018083116121ad57829003601f168201915b5050505050905090565b6121dc612f67565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612240576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061224d612f67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122fa612f67565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161233f919061422e565b60405180910390a35050565b6000612355610f7e565b90506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600e60009054906101000a900461ffff1661ffff168360ff16836123cc9190614bfb565b61ffff161115612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890614c7f565b60405180910390fd5b600e60039054906101000a900460ff1660ff1681846124309190614d0b565b60ff161115612474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246b90615024565b60405180910390fd5b600e60029054906101000a900460ff1660ff168360ff1611156124cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c390615024565b60405180910390fd5b600e60069054906101000a900460ff161561251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251390615090565b60405180910390fd5b600e60049054906101000a900460ff1660ff168160ff1610612590578260ff16600c546125499190614e86565b34101561258b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258290614f2c565b60405180910390fd5b612630565b6000818461259e9190614d0b565b9050600e60049054906101000a900460ff1660ff168160ff16111561262e57600e60049054906101000a900460ff16816125d89190614f4c565b90508060ff16600c546125eb9190614e86565b34101561262d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262490614f2c565b60405180910390fd5b5b505b61263d338460ff16613084565b80836126499190614d0b565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b600e60079054906101000a900460ff1681565b6126c8612f67565b73ffffffffffffffffffffffffffffffffffffffff166126e6611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461273c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273390614ae1565b60405180910390fd5b80600e60026101000a81548160ff021916908360ff16021790555050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561292b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127cd576127c885858585613417565b612938565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401612816929190614b61565b602060405180830381865afa158015612833573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128579190614b9f565b80156128e957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016128a7929190614b61565b602060405180830381865afa1580156128c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e89190614b9f565b5b61292a57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612921919061440f565b60405180910390fd5b5b61293785858585613417565b5b5050505050565b600e60039054906101000a900460ff1681565b606061295d82612f6f565b61299c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299390615122565b60405180910390fd5b60001515600e60079054906101000a900460ff16151503612a4957600b80546129c490614b30565b80601f01602080910402602001604051908101604052809291908181526020018280546129f090614b30565b8015612a3d5780601f10612a1257610100808354040283529160200191612a3d565b820191906000526020600020905b815481529060010190602001808311612a2057829003601f168201915b50505050509050612aa5565b6000612a53613493565b90506000815111612a735760405180602001604052806000815250612aa1565b80612a7d84613525565b600a604051602001612a9193929190615212565b6040516020818303038152906040525b9150505b919050565b612ab2612f67565b73ffffffffffffffffffffffffffffffffffffffff16612ad0611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614ae1565b60405180910390fd5b6000612b30610f7e565b90506000838390508560ff16612b469190614e86565b9050600e60009054906101000a900461ffff1661ffff16818361ffff16612b6d9190615243565b1115612bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba5906152e5565b60405180910390fd5b60005b84849050811015612c0357612bf0858583818110612bd257612bd1614f80565b5b9050602002016020810190612be79190614737565b8760ff16613084565b8080612bfb90615305565b915050612bb1565b5060009450600091505050505050565b612c1b612f67565b73ffffffffffffffffffffffffffffffffffffffff16612c39611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8690614ae1565b60405180910390fd5b80600d819055506000905050565b600e60009054906101000a900461ffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b8054612d7290614b30565b80601f0160208091040260200160405190810160405280929190818152602001828054612d9e90614b30565b8015612deb5780601f10612dc057610100808354040283529160200191612deb565b820191906000526020600020905b815481529060010190602001808311612dce57829003601f168201915b505050505081565b612dfb612f67565b73ffffffffffffffffffffffffffffffffffffffff16612e19611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6690614ae1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed5906153bf565b60405180910390fd5b612ee781613351565b50565b600e60049054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612f7a61306f565b11158015612f89575060005482105b8015612fb6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b61307f838383613685565b505050565b61309e828260405180602001604052806000815250613b39565b5050565b6130bd8383836040518060200160405280600081525061275a565b505050565b6130ca61411a565b6000829050806130d861306f565b111580156130e7575060005481105b1561331a576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161331857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131fc57809250505061334c565b5b60011561331757818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461331257809250505061334c565b6131fd565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613422848484613685565b6134418373ffffffffffffffffffffffffffffffffffffffff16613b4b565b8015613456575061345484848484613b6e565b155b1561348d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600980546134a290614b30565b80601f01602080910402602001604051908101604052809291908181526020018280546134ce90614b30565b801561351b5780601f106134f05761010080835404028352916020019161351b565b820191906000526020600020905b8154815290600101906020018083116134fe57829003601f168201915b5050505050905090565b60606000820361356c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613680565b600082905060005b6000821461359e57808061358790615305565b915050600a82613597919061540e565b9150613574565b60008167ffffffffffffffff8111156135ba576135b96144a0565b5b6040519080825280601f01601f1916602001820160405280156135ec5781602001600182028036833780820191505090505b5090505b6000851461367957600182613605919061543f565b9150600a856136149190615473565b60306136209190615243565b60f81b81838151811061363657613635614f80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613672919061540e565b94506135f0565b8093505050505b919050565b6000613690826130c2565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146136fb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661371c612f67565b73ffffffffffffffffffffffffffffffffffffffff16148061374b575061374a85613745612f67565b612cd1565b5b806137905750613759612f67565b73ffffffffffffffffffffffffffffffffffffffff1661377884610cb4565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806137c9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361382f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61383c8585856001613cbe565b61384860008487612fbd565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613ac7576000548214613ac657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b328585856001613cc4565b5050505050565b613b468383836001613cca565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b94612f67565b8786866040518563ffffffff1660e01b8152600401613bb694939291906154f9565b6020604051808303816000875af1925050508015613bf257506040513d601f19601f82011682018060405250810190613bef919061555a565b60015b613c6b573d8060008114613c22576040519150601f19603f3d011682016040523d82523d6000602084013e613c27565b606091505b506000815103613c63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613d36576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613d70576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d7d6000868387613cbe565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613f475750613f468773ffffffffffffffffffffffffffffffffffffffff16613b4b565b5b1561400c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613fbc6000888480600101955088613b6e565b613ff2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203613f4d57826000541461400757600080fd5b614077565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361400d575b81600081905550505061408d6000868387613cc4565b5050505050565b8280546140a090614b30565b90600052602060002090601f0160209004810192826140c25760008555614109565b82601f106140db57805160ff1916838001178555614109565b82800160010185558215614109579182015b828111156141085782518255916020019190600101906140ed565b5b509050614116919061415d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561417657600081600090555060010161415e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141c38161418e565b81146141ce57600080fd5b50565b6000813590506141e0816141ba565b92915050565b6000602082840312156141fc576141fb614184565b5b600061420a848285016141d1565b91505092915050565b60008115159050919050565b61422881614213565b82525050565b6000602082019050614243600083018461421f565b92915050565b600061ffff82169050919050565b61426081614249565b811461426b57600080fd5b50565b60008135905061427d81614257565b92915050565b60006020828403121561429957614298614184565b5b60006142a78482850161426e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142ea5780820151818401526020810190506142cf565b838111156142f9576000848401525b50505050565b6000601f19601f8301169050919050565b600061431b826142b0565b61432581856142bb565b93506143358185602086016142cc565b61433e816142ff565b840191505092915050565b600060208201905081810360008301526143638184614310565b905092915050565b6000819050919050565b61437e8161436b565b811461438957600080fd5b50565b60008135905061439b81614375565b92915050565b6000602082840312156143b7576143b6614184565b5b60006143c58482850161438c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143f9826143ce565b9050919050565b614409816143ee565b82525050565b60006020820190506144246000830184614400565b92915050565b614433816143ee565b811461443e57600080fd5b50565b6000813590506144508161442a565b92915050565b6000806040838503121561446d5761446c614184565b5b600061447b85828601614441565b925050602061448c8582860161438c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144d8826142ff565b810181811067ffffffffffffffff821117156144f7576144f66144a0565b5b80604052505050565b600061450a61417a565b905061451682826144cf565b919050565b600067ffffffffffffffff821115614536576145356144a0565b5b61453f826142ff565b9050602081019050919050565b82818337600083830152505050565b600061456e6145698461451b565b614500565b90508281526020810184848401111561458a5761458961449b565b5b61459584828561454c565b509392505050565b600082601f8301126145b2576145b1614496565b5b81356145c284826020860161455b565b91505092915050565b6000602082840312156145e1576145e0614184565b5b600082013567ffffffffffffffff8111156145ff576145fe614189565b5b61460b8482850161459d565b91505092915050565b61461d8161436b565b82525050565b60006020820190506146386000830184614614565b92915050565b60008060006060848603121561465757614656614184565b5b600061466586828701614441565b935050602061467686828701614441565b92505060406146878682870161438c565b9150509250925092565b600060ff82169050919050565b6146a781614691565b81146146b257600080fd5b50565b6000813590506146c48161469e565b92915050565b6000602082840312156146e0576146df614184565b5b60006146ee848285016146b5565b91505092915050565b6000806040838503121561470e5761470d614184565b5b600061471c8582860161426e565b925050602061472d85828601614441565b9150509250929050565b60006020828403121561474d5761474c614184565b5b600061475b84828501614441565b91505092915050565b61476d81614691565b82525050565b60006020820190506147886000830184614764565b92915050565b600080fd5b600080fd5b60008083601f8401126147ae576147ad614496565b5b8235905067ffffffffffffffff8111156147cb576147ca61478e565b5b6020830191508360208202830111156147e7576147e6614793565b5b9250929050565b6000806020838503121561480557614804614184565b5b600083013567ffffffffffffffff81111561482357614822614189565b5b61482f85828601614798565b92509250509250929050565b61484481614213565b811461484f57600080fd5b50565b6000813590506148618161483b565b92915050565b6000806040838503121561487e5761487d614184565b5b600061488c85828601614441565b925050602061489d85828601614852565b9150509250929050565b600067ffffffffffffffff8211156148c2576148c16144a0565b5b6148cb826142ff565b9050602081019050919050565b60006148eb6148e6846148a7565b614500565b9050828152602081018484840111156149075761490661449b565b5b61491284828561454c565b509392505050565b600082601f83011261492f5761492e614496565b5b813561493f8482602086016148d8565b91505092915050565b6000806000806080858703121561496257614961614184565b5b600061497087828801614441565b945050602061498187828801614441565b93505060406149928782880161438c565b925050606085013567ffffffffffffffff8111156149b3576149b2614189565b5b6149bf8782880161491a565b91505092959194509250565b6000806000604084860312156149e4576149e3614184565b5b60006149f2868287016146b5565b935050602084013567ffffffffffffffff811115614a1357614a12614189565b5b614a1f86828701614798565b92509250509250925092565b614a3481614249565b82525050565b6000602082019050614a4f6000830184614a2b565b92915050565b60008060408385031215614a6c57614a6b614184565b5b6000614a7a85828601614441565b9250506020614a8b85828601614441565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614acb6020836142bb565b9150614ad682614a95565b602082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b4857607f821691505b602082108103614b5b57614b5a614b01565b5b50919050565b6000604082019050614b766000830185614400565b614b836020830184614400565b9392505050565b600081519050614b998161483b565b92915050565b600060208284031215614bb557614bb4614184565b5b6000614bc384828501614b8a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c0682614249565b9150614c1183614249565b92508261ffff03821115614c2857614c27614bcc565b5b828201905092915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000614c696013836142bb565b9150614c7482614c33565b602082019050919050565b60006020820190508181036000830152614c9881614c5c565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b6000614cd56017836142bb565b9150614ce082614c9f565b602082019050919050565b60006020820190508181036000830152614d0481614cc8565b9050919050565b6000614d1682614691565b9150614d2183614691565b92508260ff03821115614d3757614d36614bcc565b5b828201905092915050565b7f45786365656473206d617820206c696d69742020706572206164647265737300600082015250565b6000614d78601f836142bb565b9150614d8382614d42565b602082019050919050565b60006020820190508181036000830152614da781614d6b565b9050919050565b7f45786365656473206d617820206c696d69742020706572207478000000000000600082015250565b6000614de4601a836142bb565b9150614def82614dae565b602082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f57686974656c697374206d696e74696e67206973206f76657221000000000000600082015250565b6000614e50601a836142bb565b9150614e5b82614e1a565b602082019050919050565b60006020820190508181036000830152614e7f81614e43565b9050919050565b6000614e918261436b565b9150614e9c8361436b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ed557614ed4614bcc565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614f166013836142bb565b9150614f2182614ee0565b602082019050919050565b60006020820190508181036000830152614f4581614f09565b9050919050565b6000614f5782614691565b9150614f6283614691565b925082821015614f7557614f74614bcc565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614fba82614691565b915060ff8203614fcd57614fcc614bcc565b5b600182019050919050565b7f45786365656473206d6178207065722057616c6c65742e000000000000000000600082015250565b600061500e6017836142bb565b915061501982614fd8565b602082019050919050565b6000602082019050818103600083015261503d81615001565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061507a6017836142bb565b915061508582615044565b602082019050919050565b600060208201905081810360008301526150a98161506d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061510c602f836142bb565b9150615117826150b0565b604082019050919050565b6000602082019050818103600083015261513b816150ff565b9050919050565b600081905092915050565b6000615158826142b0565b6151628185615142565b93506151728185602086016142cc565b80840191505092915050565b60008190508160005260206000209050919050565b600081546151a081614b30565b6151aa8186615142565b945060018216600081146151c557600181146151d657615209565b60ff19831686528186019350615209565b6151df8561517e565b60005b83811015615201578154818901526001820191506020810190506151e2565b838801955050505b50505092915050565b600061521e828661514d565b915061522a828561514d565b91506152368284615193565b9150819050949350505050565b600061524e8261436b565b91506152598361436b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561528e5761528d614bcc565b5b828201905092915050565b7f45786365656573206d617820737570706c792e00000000000000000000000000600082015250565b60006152cf6013836142bb565b91506152da82615299565b602082019050919050565b600060208201905081810360008301526152fe816152c2565b9050919050565b60006153108261436b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361534257615341614bcc565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153a96026836142bb565b91506153b48261534d565b604082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006154198261436b565b91506154248361436b565b925082615434576154336153df565b5b828204905092915050565b600061544a8261436b565b91506154558361436b565b92508282101561546857615467614bcc565b5b828203905092915050565b600061547e8261436b565b91506154898361436b565b925082615499576154986153df565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006154cb826154a4565b6154d581856154af565b93506154e58185602086016142cc565b6154ee816142ff565b840191505092915050565b600060808201905061550e6000830187614400565b61551b6020830186614400565b6155286040830185614614565b818103606083015261553a81846154c0565b905095945050505050565b600081519050615554816141ba565b92915050565b6000602082840312156155705761556f614184565b5b600061557e84828501615545565b9150509291505056fea264697066735822122013e2d492ea431b85aed21f75b3c945deeab4bc42f8f8817921c00bb989175fbd64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102935760003560e01c8063715018a61161015a578063aa062290116100c1578063d5abeb011161007a578063d5abeb0114610980578063e94053c7146109ab578063e985e9c5146109e8578063eef440af14610a25578063f2fde38b14610a50578063f8bf517214610a7957610293565b8063aa06229014610874578063b88d4fde1461089d578063bc951b91146108c6578063c87b56dd146108f1578063cffb6e201461092e578063d1d192131461095757610293565b80639257e044116101135780639257e0441461078357806394354fd0146107ae57806395d89b41146107d9578063a22cb46514610804578063a2522d2d1461082d578063a475b5dd1461084957610293565b8063715018a61461069b5780637ec4a659146106b25780637f6e9093146106db5780638da5cb5b146107065780638e07484c146107315780638f65fe0a1461075a57610293565b806337a66d85116101fe5780634d9c1848116101b75780634d9c18481461057457806359bf5dbb1461059d5780635c975abb146105da57806360e85cde146106055780636352211e1461062157806370a082311461065e57610293565b806337a66d85146104a05780633af32abf146104b75780633bd64968146104f45780633ccfd60b1461050b57806342842e0e1461052257806344a0d68a1461054b57610293565b80631067fcc7116102505780631067fcc7146103a657806313faede6146103cf57806318160ddd146103fa57806323b872dd1461042557806328b60d151461044e5780632f6f98e11461047757610293565b806301ffc9a71461029857806306421c2f146102d557806306fdde03146102fe578063081812fc14610329578063093cfa6314610366578063095ea7b31461037d575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba91906141e6565b610aa4565b6040516102cc919061422e565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190614283565b610b86565b005b34801561030a57600080fd5b50610313610c22565b6040516103209190614349565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906143a1565b610cb4565b60405161035d919061440f565b60405180910390f35b34801561037257600080fd5b5061037b610d30565b005b34801561038957600080fd5b506103a4600480360381019061039f9190614456565b610dd8565b005b3480156103b257600080fd5b506103cd60048036038101906103c891906145cb565b610ee2565b005b3480156103db57600080fd5b506103e4610f78565b6040516103f19190614623565b60405180910390f35b34801561040657600080fd5b5061040f610f7e565b60405161041c9190614623565b60405180910390f35b34801561043157600080fd5b5061044c6004803603810190610447919061463e565b610f95565b005b34801561045a57600080fd5b50610475600480360381019061047091906146ca565b611177565b005b34801561048357600080fd5b5061049e600480360381019061049991906146f7565b611211565b005b3480156104ac57600080fd5b506104b561131e565b005b3480156104c357600080fd5b506104de60048036038101906104d99190614737565b6113e1565b6040516104eb919061422e565b60405180910390f35b34801561050057600080fd5b50610509611401565b005b34801561051757600080fd5b506105206114a9565b005b34801561052e57600080fd5b506105496004803603810190610544919061463e565b611574565b005b34801561055757600080fd5b50610572600480360381019061056d91906143a1565b611756565b005b34801561058057600080fd5b5061059b600480360381019061059691906146ca565b6117dc565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190614737565b61187a565b6040516105d19190614773565b60405180910390f35b3480156105e657600080fd5b506105ef61189a565b6040516105fc919061422e565b60405180910390f35b61061f600480360381019061061a91906146ca565b6118ad565b005b34801561062d57600080fd5b50610648600480360381019061064391906143a1565b611c9b565b604051610655919061440f565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190614737565b611cb1565b6040516106929190614623565b60405180910390f35b3480156106a757600080fd5b506106b0611d80565b005b3480156106be57600080fd5b506106d960048036038101906106d491906145cb565b611e08565b005b3480156106e757600080fd5b506106f0611e9e565b6040516106fd919061422e565b60405180910390f35b34801561071257600080fd5b5061071b611eb1565b604051610728919061440f565b60405180910390f35b34801561073d57600080fd5b50610758600480360381019061075391906147ee565b611edb565b005b34801561076657600080fd5b50610781600480360381019061077c91906147ee565b612002565b005b34801561078f57600080fd5b50610798612129565b6040516107a59190614623565b60405180910390f35b3480156107ba57600080fd5b506107c361212f565b6040516107d09190614773565b60405180910390f35b3480156107e557600080fd5b506107ee612142565b6040516107fb9190614349565b60405180910390f35b34801561081057600080fd5b5061082b60048036038101906108269190614867565b6121d4565b005b610847600480360381019061084291906146ca565b61234b565b005b34801561085557600080fd5b5061085e6126ad565b60405161086b919061422e565b60405180910390f35b34801561088057600080fd5b5061089b600480360381019061089691906146ca565b6126c0565b005b3480156108a957600080fd5b506108c460048036038101906108bf9190614948565b61275a565b005b3480156108d257600080fd5b506108db61293f565b6040516108e89190614773565b60405180910390f35b3480156108fd57600080fd5b50610918600480360381019061091391906143a1565b612952565b6040516109259190614349565b60405180910390f35b34801561093a57600080fd5b50610955600480360381019061095091906149cb565b612aaa565b005b34801561096357600080fd5b5061097e600480360381019061097991906143a1565b612c13565b005b34801561098c57600080fd5b50610995612c9d565b6040516109a29190614a3a565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd9190614737565b612cb1565b6040516109df9190614773565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190614a55565b612cd1565b604051610a1c919061422e565b60405180910390f35b348015610a3157600080fd5b50610a3a612d65565b604051610a479190614349565b60405180910390f35b348015610a5c57600080fd5b50610a776004803603810190610a729190614737565b612df3565b005b348015610a8557600080fd5b50610a8e612eea565b604051610a9b9190614773565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b7f5750610b7e82612efd565b5b9050919050565b610b8e612f67565b73ffffffffffffffffffffffffffffffffffffffff16610bac611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990614ae1565b60405180910390fd5b80600e60006101000a81548161ffff021916908361ffff16021790555050565b606060028054610c3190614b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5d90614b30565b8015610caa5780601f10610c7f57610100808354040283529160200191610caa565b820191906000526020600020905b815481529060010190602001808311610c8d57829003601f168201915b5050505050905090565b6000610cbf82612f6f565b610cf5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610d38612f67565b73ffffffffffffffffffffffffffffffffffffffff16610d56611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390614ae1565b60405180910390fd5b600e60059054906101000a900460ff1615600e60056101000a81548160ff021916908315150217905550565b6000610de382611c9b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e4a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e69612f67565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e9b5750610e9981610e94612f67565b612cd1565b155b15610ed2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610edd838383612fbd565b505050565b610eea612f67565b73ffffffffffffffffffffffffffffffffffffffff16610f08611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614ae1565b60405180910390fd5b80600b9080519060200190610f74929190614094565b5050565b600c5481565b6000610f8861306f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611165573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100757611002848484613074565b611171565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611050929190614b61565b602060405180830381865afa15801561106d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110919190614b9f565b801561112357506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016110e1929190614b61565b602060405180830381865afa1580156110fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190614b9f565b5b61116457336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161115b919061440f565b60405180910390fd5b5b611170848484613074565b5b50505050565b61117f612f67565b73ffffffffffffffffffffffffffffffffffffffff1661119d611eb1565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90614ae1565b60405180910390fd5b80600e60036101000a81548160ff021916908360ff16021790555050565b611219612f67565b73ffffffffffffffffffffffffffffffffffffffff16611237611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490614ae1565b60405180910390fd5b6000611297610f7e565b9050600e60009054906101000a900461ffff1661ffff1683826112ba9190614bfb565b61ffff1611156112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614c7f565b60405180910390fd5b61130d828461ffff16613084565b600092506000915060009050505050565b611326612f67565b73ffffffffffffffffffffffffffffffffffffffff16611344611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614ae1565b60405180910390fd5b600e60069054906101000a900460ff1615600e60066101000a81548160ff0219169083151502179055506001600e60056101000a81548160ff021916908315150217905550565b60116020528060005260406000206000915054906101000a900460ff1681565b611409612f67565b73ffffffffffffffffffffffffffffffffffffffff16611427611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490614ae1565b60405180910390fd5b600e60079054906101000a900460ff1615600e60076101000a81548160ff021916908315150217905550565b6114b1612f67565b73ffffffffffffffffffffffffffffffffffffffff166114cf611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90614ae1565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611570573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611744573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115e6576115e18484846130a2565b611750565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161162f929190614b61565b602060405180830381865afa15801561164c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116709190614b9f565b801561170257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016116c0929190614b61565b602060405180830381865afa1580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117019190614b9f565b5b61174357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161173a919061440f565b60405180910390fd5b5b61174f8484846130a2565b5b50505050565b61175e612f67565b73ffffffffffffffffffffffffffffffffffffffff1661177c611eb1565b73ffffffffffffffffffffffffffffffffffffffff16146117d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c990614ae1565b60405180910390fd5b80600c8190555050565b6117e4612f67565b73ffffffffffffffffffffffffffffffffffffffff16611802611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90614ae1565b60405180910390fd5b80600e60046101000a81548160ff021916908360ff1602179055506000905050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600e60069054906101000a900460ff1681565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000611908610f7e565b9050601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90614ceb565b60405180910390fd5b600e60009054906101000a900461ffff1661ffff168360ff16826119ba9190614bfb565b61ffff1611156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690614c7f565b60405180910390fd5b600e60039054906101000a900460ff1660ff168383611a1e9190614d0b565b60ff161115611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990614d8e565b60405180910390fd5b600e60029054906101000a900460ff1660ff168360ff161115611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab190614dfa565b60405180910390fd5b600e60059054906101000a900460ff1615611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614e66565b60405180910390fd5b600e60049054906101000a900460ff1660ff168260ff1610611b7e578260ff16600d54611b379190614e86565b341015611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090614f2c565b60405180910390fd5b611c1e565b60008284611b8c9190614d0b565b9050600e60049054906101000a900460ff1660ff168160ff161115611c1c57600e60049054906101000a900460ff1681611bc69190614f4c565b90508060ff16600d54611bd99190614e86565b341015611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290614f2c565b60405180910390fd5b5b505b611c2b338460ff16613084565b8282611c379190614d0b565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000925060009150505050565b6000611ca6826130c2565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d18576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611d88612f67565b73ffffffffffffffffffffffffffffffffffffffff16611da6611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df390614ae1565b60405180910390fd5b611e066000613351565b565b611e10612f67565b73ffffffffffffffffffffffffffffffffffffffff16611e2e611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7b90614ae1565b60405180910390fd5b8060099080519060200190611e9a929190614094565b5050565b600e60059054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ee3612f67565b73ffffffffffffffffffffffffffffffffffffffff16611f01611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4e90614ae1565b60405180910390fd5b60005b828290508160ff161015611ffd5760016011600085858560ff16818110611f8457611f83614f80565b5b9050602002016020810190611f999190614737565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ff590614faf565b915050611f5a565b505050565b61200a612f67565b73ffffffffffffffffffffffffffffffffffffffff16612028611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590614ae1565b60405180910390fd5b60005b828290508160ff1610156121245760006011600085858560ff168181106120ab576120aa614f80565b5b90506020020160208101906120c09190614737565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061211c90614faf565b915050612081565b505050565b600d5481565b600e60029054906101000a900460ff1681565b60606003805461215190614b30565b80601f016020809104026020016040519081016040528092919081815260200182805461217d90614b30565b80156121ca5780601f1061219f576101008083540402835291602001916121ca565b820191906000526020600020905b8154815290600101906020018083116121ad57829003601f168201915b5050505050905090565b6121dc612f67565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612240576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061224d612f67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122fa612f67565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161233f919061422e565b60405180910390a35050565b6000612355610f7e565b90506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600e60009054906101000a900461ffff1661ffff168360ff16836123cc9190614bfb565b61ffff161115612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890614c7f565b60405180910390fd5b600e60039054906101000a900460ff1660ff1681846124309190614d0b565b60ff161115612474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246b90615024565b60405180910390fd5b600e60029054906101000a900460ff1660ff168360ff1611156124cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c390615024565b60405180910390fd5b600e60069054906101000a900460ff161561251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251390615090565b60405180910390fd5b600e60049054906101000a900460ff1660ff168160ff1610612590578260ff16600c546125499190614e86565b34101561258b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258290614f2c565b60405180910390fd5b612630565b6000818461259e9190614d0b565b9050600e60049054906101000a900460ff1660ff168160ff16111561262e57600e60049054906101000a900460ff16816125d89190614f4c565b90508060ff16600c546125eb9190614e86565b34101561262d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262490614f2c565b60405180910390fd5b5b505b61263d338460ff16613084565b80836126499190614d0b565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b600e60079054906101000a900460ff1681565b6126c8612f67565b73ffffffffffffffffffffffffffffffffffffffff166126e6611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461273c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273390614ae1565b60405180910390fd5b80600e60026101000a81548160ff021916908360ff16021790555050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561292b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127cd576127c885858585613417565b612938565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401612816929190614b61565b602060405180830381865afa158015612833573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128579190614b9f565b80156128e957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016128a7929190614b61565b602060405180830381865afa1580156128c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e89190614b9f565b5b61292a57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612921919061440f565b60405180910390fd5b5b61293785858585613417565b5b5050505050565b600e60039054906101000a900460ff1681565b606061295d82612f6f565b61299c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299390615122565b60405180910390fd5b60001515600e60079054906101000a900460ff16151503612a4957600b80546129c490614b30565b80601f01602080910402602001604051908101604052809291908181526020018280546129f090614b30565b8015612a3d5780601f10612a1257610100808354040283529160200191612a3d565b820191906000526020600020905b815481529060010190602001808311612a2057829003601f168201915b50505050509050612aa5565b6000612a53613493565b90506000815111612a735760405180602001604052806000815250612aa1565b80612a7d84613525565b600a604051602001612a9193929190615212565b6040516020818303038152906040525b9150505b919050565b612ab2612f67565b73ffffffffffffffffffffffffffffffffffffffff16612ad0611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614ae1565b60405180910390fd5b6000612b30610f7e565b90506000838390508560ff16612b469190614e86565b9050600e60009054906101000a900461ffff1661ffff16818361ffff16612b6d9190615243565b1115612bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba5906152e5565b60405180910390fd5b60005b84849050811015612c0357612bf0858583818110612bd257612bd1614f80565b5b9050602002016020810190612be79190614737565b8760ff16613084565b8080612bfb90615305565b915050612bb1565b5060009450600091505050505050565b612c1b612f67565b73ffffffffffffffffffffffffffffffffffffffff16612c39611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8690614ae1565b60405180910390fd5b80600d819055506000905050565b600e60009054906101000a900461ffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b8054612d7290614b30565b80601f0160208091040260200160405190810160405280929190818152602001828054612d9e90614b30565b8015612deb5780601f10612dc057610100808354040283529160200191612deb565b820191906000526020600020905b815481529060010190602001808311612dce57829003601f168201915b505050505081565b612dfb612f67565b73ffffffffffffffffffffffffffffffffffffffff16612e19611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6690614ae1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed5906153bf565b60405180910390fd5b612ee781613351565b50565b600e60049054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612f7a61306f565b11158015612f89575060005482105b8015612fb6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b61307f838383613685565b505050565b61309e828260405180602001604052806000815250613b39565b5050565b6130bd8383836040518060200160405280600081525061275a565b505050565b6130ca61411a565b6000829050806130d861306f565b111580156130e7575060005481105b1561331a576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161331857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131fc57809250505061334c565b5b60011561331757818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461331257809250505061334c565b6131fd565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613422848484613685565b6134418373ffffffffffffffffffffffffffffffffffffffff16613b4b565b8015613456575061345484848484613b6e565b155b1561348d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600980546134a290614b30565b80601f01602080910402602001604051908101604052809291908181526020018280546134ce90614b30565b801561351b5780601f106134f05761010080835404028352916020019161351b565b820191906000526020600020905b8154815290600101906020018083116134fe57829003601f168201915b5050505050905090565b60606000820361356c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613680565b600082905060005b6000821461359e57808061358790615305565b915050600a82613597919061540e565b9150613574565b60008167ffffffffffffffff8111156135ba576135b96144a0565b5b6040519080825280601f01601f1916602001820160405280156135ec5781602001600182028036833780820191505090505b5090505b6000851461367957600182613605919061543f565b9150600a856136149190615473565b60306136209190615243565b60f81b81838151811061363657613635614f80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613672919061540e565b94506135f0565b8093505050505b919050565b6000613690826130c2565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146136fb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661371c612f67565b73ffffffffffffffffffffffffffffffffffffffff16148061374b575061374a85613745612f67565b612cd1565b5b806137905750613759612f67565b73ffffffffffffffffffffffffffffffffffffffff1661377884610cb4565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806137c9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361382f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61383c8585856001613cbe565b61384860008487612fbd565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613ac7576000548214613ac657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b328585856001613cc4565b5050505050565b613b468383836001613cca565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b94612f67565b8786866040518563ffffffff1660e01b8152600401613bb694939291906154f9565b6020604051808303816000875af1925050508015613bf257506040513d601f19601f82011682018060405250810190613bef919061555a565b60015b613c6b573d8060008114613c22576040519150601f19603f3d011682016040523d82523d6000602084013e613c27565b606091505b506000815103613c63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613d36576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613d70576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d7d6000868387613cbe565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613f475750613f468773ffffffffffffffffffffffffffffffffffffffff16613b4b565b5b1561400c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613fbc6000888480600101955088613b6e565b613ff2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203613f4d57826000541461400757600080fd5b614077565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361400d575b81600081905550505061408d6000868387613cc4565b5050505050565b8280546140a090614b30565b90600052602060002090601f0160209004810192826140c25760008555614109565b82601f106140db57805160ff1916838001178555614109565b82800160010185558215614109579182015b828111156141085782518255916020019190600101906140ed565b5b509050614116919061415d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561417657600081600090555060010161415e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141c38161418e565b81146141ce57600080fd5b50565b6000813590506141e0816141ba565b92915050565b6000602082840312156141fc576141fb614184565b5b600061420a848285016141d1565b91505092915050565b60008115159050919050565b61422881614213565b82525050565b6000602082019050614243600083018461421f565b92915050565b600061ffff82169050919050565b61426081614249565b811461426b57600080fd5b50565b60008135905061427d81614257565b92915050565b60006020828403121561429957614298614184565b5b60006142a78482850161426e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142ea5780820151818401526020810190506142cf565b838111156142f9576000848401525b50505050565b6000601f19601f8301169050919050565b600061431b826142b0565b61432581856142bb565b93506143358185602086016142cc565b61433e816142ff565b840191505092915050565b600060208201905081810360008301526143638184614310565b905092915050565b6000819050919050565b61437e8161436b565b811461438957600080fd5b50565b60008135905061439b81614375565b92915050565b6000602082840312156143b7576143b6614184565b5b60006143c58482850161438c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143f9826143ce565b9050919050565b614409816143ee565b82525050565b60006020820190506144246000830184614400565b92915050565b614433816143ee565b811461443e57600080fd5b50565b6000813590506144508161442a565b92915050565b6000806040838503121561446d5761446c614184565b5b600061447b85828601614441565b925050602061448c8582860161438c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144d8826142ff565b810181811067ffffffffffffffff821117156144f7576144f66144a0565b5b80604052505050565b600061450a61417a565b905061451682826144cf565b919050565b600067ffffffffffffffff821115614536576145356144a0565b5b61453f826142ff565b9050602081019050919050565b82818337600083830152505050565b600061456e6145698461451b565b614500565b90508281526020810184848401111561458a5761458961449b565b5b61459584828561454c565b509392505050565b600082601f8301126145b2576145b1614496565b5b81356145c284826020860161455b565b91505092915050565b6000602082840312156145e1576145e0614184565b5b600082013567ffffffffffffffff8111156145ff576145fe614189565b5b61460b8482850161459d565b91505092915050565b61461d8161436b565b82525050565b60006020820190506146386000830184614614565b92915050565b60008060006060848603121561465757614656614184565b5b600061466586828701614441565b935050602061467686828701614441565b92505060406146878682870161438c565b9150509250925092565b600060ff82169050919050565b6146a781614691565b81146146b257600080fd5b50565b6000813590506146c48161469e565b92915050565b6000602082840312156146e0576146df614184565b5b60006146ee848285016146b5565b91505092915050565b6000806040838503121561470e5761470d614184565b5b600061471c8582860161426e565b925050602061472d85828601614441565b9150509250929050565b60006020828403121561474d5761474c614184565b5b600061475b84828501614441565b91505092915050565b61476d81614691565b82525050565b60006020820190506147886000830184614764565b92915050565b600080fd5b600080fd5b60008083601f8401126147ae576147ad614496565b5b8235905067ffffffffffffffff8111156147cb576147ca61478e565b5b6020830191508360208202830111156147e7576147e6614793565b5b9250929050565b6000806020838503121561480557614804614184565b5b600083013567ffffffffffffffff81111561482357614822614189565b5b61482f85828601614798565b92509250509250929050565b61484481614213565b811461484f57600080fd5b50565b6000813590506148618161483b565b92915050565b6000806040838503121561487e5761487d614184565b5b600061488c85828601614441565b925050602061489d85828601614852565b9150509250929050565b600067ffffffffffffffff8211156148c2576148c16144a0565b5b6148cb826142ff565b9050602081019050919050565b60006148eb6148e6846148a7565b614500565b9050828152602081018484840111156149075761490661449b565b5b61491284828561454c565b509392505050565b600082601f83011261492f5761492e614496565b5b813561493f8482602086016148d8565b91505092915050565b6000806000806080858703121561496257614961614184565b5b600061497087828801614441565b945050602061498187828801614441565b93505060406149928782880161438c565b925050606085013567ffffffffffffffff8111156149b3576149b2614189565b5b6149bf8782880161491a565b91505092959194509250565b6000806000604084860312156149e4576149e3614184565b5b60006149f2868287016146b5565b935050602084013567ffffffffffffffff811115614a1357614a12614189565b5b614a1f86828701614798565b92509250509250925092565b614a3481614249565b82525050565b6000602082019050614a4f6000830184614a2b565b92915050565b60008060408385031215614a6c57614a6b614184565b5b6000614a7a85828601614441565b9250506020614a8b85828601614441565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614acb6020836142bb565b9150614ad682614a95565b602082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b4857607f821691505b602082108103614b5b57614b5a614b01565b5b50919050565b6000604082019050614b766000830185614400565b614b836020830184614400565b9392505050565b600081519050614b998161483b565b92915050565b600060208284031215614bb557614bb4614184565b5b6000614bc384828501614b8a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c0682614249565b9150614c1183614249565b92508261ffff03821115614c2857614c27614bcc565b5b828201905092915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000614c696013836142bb565b9150614c7482614c33565b602082019050919050565b60006020820190508181036000830152614c9881614c5c565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b6000614cd56017836142bb565b9150614ce082614c9f565b602082019050919050565b60006020820190508181036000830152614d0481614cc8565b9050919050565b6000614d1682614691565b9150614d2183614691565b92508260ff03821115614d3757614d36614bcc565b5b828201905092915050565b7f45786365656473206d617820206c696d69742020706572206164647265737300600082015250565b6000614d78601f836142bb565b9150614d8382614d42565b602082019050919050565b60006020820190508181036000830152614da781614d6b565b9050919050565b7f45786365656473206d617820206c696d69742020706572207478000000000000600082015250565b6000614de4601a836142bb565b9150614def82614dae565b602082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f57686974656c697374206d696e74696e67206973206f76657221000000000000600082015250565b6000614e50601a836142bb565b9150614e5b82614e1a565b602082019050919050565b60006020820190508181036000830152614e7f81614e43565b9050919050565b6000614e918261436b565b9150614e9c8361436b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ed557614ed4614bcc565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614f166013836142bb565b9150614f2182614ee0565b602082019050919050565b60006020820190508181036000830152614f4581614f09565b9050919050565b6000614f5782614691565b9150614f6283614691565b925082821015614f7557614f74614bcc565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614fba82614691565b915060ff8203614fcd57614fcc614bcc565b5b600182019050919050565b7f45786365656473206d6178207065722057616c6c65742e000000000000000000600082015250565b600061500e6017836142bb565b915061501982614fd8565b602082019050919050565b6000602082019050818103600083015261503d81615001565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061507a6017836142bb565b915061508582615044565b602082019050919050565b600060208201905081810360008301526150a98161506d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061510c602f836142bb565b9150615117826150b0565b604082019050919050565b6000602082019050818103600083015261513b816150ff565b9050919050565b600081905092915050565b6000615158826142b0565b6151628185615142565b93506151728185602086016142cc565b80840191505092915050565b60008190508160005260206000209050919050565b600081546151a081614b30565b6151aa8186615142565b945060018216600081146151c557600181146151d657615209565b60ff19831686528186019350615209565b6151df8561517e565b60005b83811015615201578154818901526001820191506020810190506151e2565b838801955050505b50505092915050565b600061521e828661514d565b915061522a828561514d565b91506152368284615193565b9150819050949350505050565b600061524e8261436b565b91506152598361436b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561528e5761528d614bcc565b5b828201905092915050565b7f45786365656573206d617820737570706c792e00000000000000000000000000600082015250565b60006152cf6013836142bb565b91506152da82615299565b602082019050919050565b600060208201905081810360008301526152fe816152c2565b9050919050565b60006153108261436b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361534257615341614bcc565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153a96026836142bb565b91506153b48261534d565b604082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006154198261436b565b91506154248361436b565b925082615434576154336153df565b5b828204905092915050565b600061544a8261436b565b91506154558361436b565b92508282101561546857615467614bcc565b5b828203905092915050565b600061547e8261436b565b91506154898361436b565b925082615499576154986153df565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006154cb826154a4565b6154d581856154af565b93506154e58185602086016142cc565b6154ee816142ff565b840191505092915050565b600060808201905061550e6000830187614400565b61551b6020830186614400565b6155286040830185614614565b818103606083015261553a81846154c0565b905095945050505050565b600081519050615554816141ba565b92915050565b6000602082840312156155705761556f614184565b5b600061557e84828501615545565b9150509291505056fea264697066735822122013e2d492ea431b85aed21f75b3c945deeab4bc42f8f8817921c00bb989175fbd64736f6c634300080d0033

Deployed Bytecode Sourcemap

48781:6891:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24670:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51544:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27783:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29286:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52154:75;;;;;;;;;;;;;:::i;:::-;;28849:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54230:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49000:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23919:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55091:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54711:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50728:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54340:91;;;;;;;;;;;;;:::i;:::-;;49520:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54518:70;;;;;;;;;;;;;:::i;:::-;;54837:144;;;;;;;;;;;;;:::i;:::-;;55262:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54437:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52348:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49407:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49347:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52910:1207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27591:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25039:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43492:103;;;;;;;;;;;;;:::i;:::-;;54123:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49315:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42840:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52494:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52702:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49037:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49115:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27952:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29562:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49668:1052;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49377:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54594:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55441:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49156:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51656:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51060:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52233:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49081:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49462:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29920:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48960:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43750:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49204:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24670:305;24772:4;24824:25;24809:40;;;:11;:40;;;;:105;;;;24881:33;24866:48;;;:11;:48;;;;24809:105;:158;;;;24931:36;24955:11;24931:23;:36::i;:::-;24809:158;24789:178;;24670:305;;;:::o;51544:97::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51625:10:::1;51613:9;;:22;;;;;;;;;;;;;;;;;;51544:97:::0;:::o;27783:100::-;27837:13;27870:5;27863:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27783:100;:::o;29286:204::-;29354:7;29379:16;29387:7;29379;:16::i;:::-;29374:64;;29404:34;;;;;;;;;;;;;;29374:64;29458:15;:24;29474:7;29458:24;;;;;;;;;;;;;;;;;;;;;29451:31;;29286:204;;;:::o;52154:75::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52215:8:::1;;;;;;;;;;;52214:9;52203:8;;:20;;;;;;;;;;;;;;;;;;52154:75::o:0;28849:371::-;28922:13;28938:24;28954:7;28938:15;:24::i;:::-;28922:40;;28983:5;28977:11;;:2;:11;;;28973:48;;28997:24;;;;;;;;;;;;;;28973:48;29054:5;29038:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;29064:37;29081:5;29088:12;:10;:12::i;:::-;29064:16;:37::i;:::-;29063:38;29038:63;29034:138;;;29125:35;;;;;;;;;;;;;;29034:138;29184:28;29193:2;29197:7;29206:5;29184:8;:28::i;:::-;28911:309;28849:371;;:::o;54230:102::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54316:10:::1;54304:9;:22;;;;;;;;;;;;:::i;:::-;;54230:102:::0;:::o;49000:32::-;;;;:::o;23919:303::-;23963:7;24188:15;:13;:15::i;:::-;24173:12;;24157:13;;:28;:46;24150:53;;23919:303;:::o;55091:163::-;55192:4;47802:1;46616:42;47756:43;;;:47;47752:699;;;48043:10;48035:18;;:4;:18;;;48031:85;;55209:37:::1;55228:4;55234:2;55238:7;55209:18;:37::i;:::-;48094:7:::0;;48031:85;46616:42;48176:40;;;48225:4;48232:10;48176:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46616:42;48272:40;;;48321:4;48328;48272:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48176:157;48130:310;;48413:10;48394:30;;;;;;;;;;;:::i;:::-;;;;;;;;48130:310;47752:699;55209:37:::1;55228:4;55234:2;55238:7;55209:18;:37::i;:::-;55091:163:::0;;;;;:::o;54711:115::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54812:6:::1;54787:22;;:31;;;;;;;;;;;;;;;;;;54711:115:::0;:::o;50728:326::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50811:18:::1;50839:13;:11;:13::i;:::-;50811:42;;50897:9;;;;;;;;;;;50868:38;;50882:11;50868;:25;;;;:::i;:::-;:38;;;;50860:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50938:34;50948:9;50960:11;50938:34;;:9;:34::i;:::-;50980:18;;;51006:16;;;51030:18;;;50803:251;50728:326:::0;;:::o;54340:91::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54397:6:::1;;;;;;;;;;;54396:7;54387:6;;:16;;;;;;;;;;;;;;;;;;54421:4;54410:8;;:15;;;;;;;;;;;;;;;;;;54340:91::o:0;49520:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;54518:70::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54577:6:::1;;;;;;;;;;;54576:7;54567:6;;:16;;;;;;;;;;;;;;;;;;54518:70::o:0;54837:144::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54881:13:::1;54897:21;54881:37;;54934:10;54926:28;;:39;54955:8;54926:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54876:105;54837:144::o:0;55262:171::-;55367:4;47802:1;46616:42;47756:43;;;:47;47752:699;;;48043:10;48035:18;;:4;:18;;;48031:85;;55384:41:::1;55407:4;55413:2;55417:7;55384:22;:41::i;:::-;48094:7:::0;;48031:85;46616:42;48176:40;;;48225:4;48232:10;48176:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46616:42;48272:40;;;48321:4;48328;48272:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48176:157;48130:310;;48413:10;48394:30;;;;;;;;;;;:::i;:::-;;;;;;;;48130:310;47752:699;55384:41:::1;55407:4;55413:2;55417:7;55384:22;:41::i;:::-;55262:171:::0;;;;;:::o;54437:76::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54500:5:::1;54493:4;:12;;;;54437:76:::0;:::o;52348:134::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52451:6:::1;52422:26;;:35;;;;;;;;;;;;;;;;;;52463:13;;;52348:134:::0;:::o;49407:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;49347:25::-;;;;;;;;;;;;;:::o;52910:1207::-;52996:9;53008:15;:27;53024:10;53008:27;;;;;;;;;;;;;;;;;;;;;;;;;52996:39;;53046:18;53074:13;:11;:13::i;:::-;53046:42;;53106:13;:25;53120:10;53106:25;;;;;;;;;;;;;;;;;;;;;;;;;53098:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53207:9;;;;;;;;;;;53178:38;;53192:11;53178:25;;:11;:25;;;;:::i;:::-;:38;;;;53170:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53282:22;;;;;;;;;;;53261:43;;53267:11;53261:3;:17;;;;:::i;:::-;:43;;;;53252:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;53375:18;;;;;;;;;;;53360:33;;:11;:33;;;;53351:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53452:8;;;;;;;;;;;53451:9;53443:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53513:26;;;;;;;;;;;53506:33;;:3;:33;;;53503:435;;53590:11;53574:27;;:13;;:27;;;;:::i;:::-;53561:9;:40;;53553:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53503:435;;;53656:16;53689:3;53675:11;:17;;;;:::i;:::-;53656:36;;53719:26;;;;;;;;;;;53706:39;;:10;:39;;;53703:208;;;53792:26;;;;;;;;;;;53779:10;:39;;;;:::i;:::-;53766:52;;53866:10;53850:26;;:13;;:26;;;;:::i;:::-;53837:9;:39;;53829:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53703:208;53644:294;53503:435;53959:35;53969:10;53982:11;53959:35;;:9;:35::i;:::-;54038:11;54032:3;:17;;;;:::i;:::-;54003:15;:27;54019:10;54003:27;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;54065:18;;;54093:10;;;52969:1148;;52910:1207;:::o;27591:125::-;27655:7;27682:21;27695:7;27682:12;:21::i;:::-;:26;;;27675:33;;27591:125;;;:::o;25039:206::-;25103:7;25144:1;25127:19;;:5;:19;;;25123:60;;25155:28;;;;;;;;;;;;;;25123:60;25209:12;:19;25222:5;25209:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25201:36;;25194:43;;25039:206;;;:::o;43492:103::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43557:30:::1;43584:1;43557:18;:30::i;:::-;43492:103::o:0;54123:102::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54209:10:::1;54197:9;:22;;;;;;;;;;;;:::i;:::-;;54123:102:::0;:::o;49315:27::-;;;;;;;;;;;;;:::o;42840:87::-;42886:7;42913:6;;;;;;;;;;;42906:13;;42840:87;:::o;52494:200::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52587:7:::1;52583:101;52604:7;;:14;;52600:1;:18;;;52583:101;;;52668:4;52640:13;:25;52654:7;;52662:1;52654:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52640:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;52620:3;;;;;:::i;:::-;;;;52583:101;;;;52494:200:::0;;:::o;52702:204::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52800:7:::1;52796:103;52817:7;;:14;;52813:1;:18;;;52796:103;;;52882:5;52854:13;:25;52868:7;;52876:1;52868:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52854:25;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;52833:3;;;;;:::i;:::-;;;;52796:103;;;;52702:204:::0;;:::o;49037:32::-;;;;:::o;49115:36::-;;;;;;;;;;;;;:::o;27952:104::-;28008:13;28041:7;28034:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27952:104;:::o;29562:287::-;29673:12;:10;:12::i;:::-;29661:24;;:8;:24;;;29657:54;;29694:17;;;;;;;;;;;;;;29657:54;29769:8;29724:18;:32;29743:12;:10;:12::i;:::-;29724:32;;;;;;;;;;;;;;;:42;29757:8;29724:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29822:8;29793:48;;29808:12;:10;:12::i;:::-;29793:48;;;29832:8;29793:48;;;;;;:::i;:::-;;;;;;;;29562:287;;:::o;49668:1052::-;49727:18;49755:13;:11;:13::i;:::-;49727:42;;49777:9;49789:19;:31;49809:10;49789:31;;;;;;;;;;;;;;;;;;;;;;;;;49777:43;;49864:9;;;;;;;;;;;49835:38;;49849:11;49835:25;;:11;:25;;;;:::i;:::-;:38;;;;49827:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49933:22;;;;;;;;;;;49912:43;;49926:3;49912:11;:17;;;;:::i;:::-;:43;;;;49904:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;50014:18;;;;;;;;;;;49998:34;;:11;:34;;;;49990:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50078:6;;;;;;;;;;;50077:7;50069:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;50137:26;;;;;;;;;;;50130:33;;:3;:33;;;50127:417;;50205:11;50198:18;;:4;;:18;;;;:::i;:::-;50185:9;:31;;50177:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50127:417;;;50271:16;50304:3;50290:11;:17;;;;:::i;:::-;50271:36;;50334:26;;;;;;;;;;;50321:39;;:10;:39;;;50318:199;;;50407:26;;;;;;;;;;;50394:10;:39;;;;:::i;:::-;50381:52;;50472:10;50465:17;;:4;;:17;;;;:::i;:::-;50452:9;:30;;50444:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50318:199;50259:285;50127:417;50560:35;50570:10;50583:11;50560:35;;:9;:35::i;:::-;50652:3;50638:11;:17;;;;:::i;:::-;50604:19;:31;50624:10;50604:31;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;50670:18;;;50696;;;49719:1001;;49668:1052;:::o;49377:25::-;;;;;;;;;;;;;:::o;54594:107::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54687:6:::1;54666:18;;:27;;;;;;;;;;;;;;;;;;54594:107:::0;:::o;55441:228::-;55592:4;47802:1;46616:42;47756:43;;;:47;47752:699;;;48043:10;48035:18;;:4;:18;;;48031:85;;55614:47:::1;55637:4;55643:2;55647:7;55656:4;55614:22;:47::i;:::-;48094:7:::0;;48031:85;46616:42;48176:40;;;48225:4;48232:10;48176:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46616:42;48272:40;;;48321:4;48328;48272:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48176:157;48130:310;;48413:10;48394:30;;;;;;;;;;;:::i;:::-;;;;;;;;48130:310;47752:699;55614:47:::1;55637:4;55643:2;55647:7;55656:4;55614:22;:47::i;:::-;55441:228:::0;;;;;;:::o;49156:41::-;;;;;;;;;;;;;:::o;51656:490::-;51755:13;51796:17;51804:8;51796:7;:17::i;:::-;51780:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;51906:5;51896:15;;:6;;;;;;;;;;;:15;;;51891:50;;51928:9;51921:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51891:50;51955:28;51986:10;:8;:10::i;:::-;51955:41;;52041:1;52016:14;52010:28;:32;:130;;;;;;;;;;;;;;;;;52078:14;52094:19;:8;:17;:19::i;:::-;52115:9;52061:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52010:130;52003:137;;;51656:490;;;;:::o;51060:473::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51160:18:::1;51188:13;:11;:13::i;:::-;51160:42;;51210:16;51251:9;;:16;;51231:17;:36;;;;;;:::i;:::-;51210:57;;51311:9;;;;;;;;;;;51282:38;;51296:11;51282;:25;;;;;;:::i;:::-;:38;;51274:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51357:9;51352:116;51376:9;;:16;;51372:1;:20;51352:116;;;51414:42;51424:9;;51434:1;51424:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51438:17;51414:42;;:9;:42::i;:::-;51394:3;;;;;:::i;:::-;;;;51352:116;;;;51477:24;;;51509:18;;;51152:381;;51060:473:::0;;;:::o;52233:106::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52309:5:::1;52293:13;:21;;;;52321:12;;;52233:106:::0;:::o;49081:29::-;;;;;;;;;;;;;:::o;49462:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;29920:164::-;30017:4;30041:18;:25;30060:5;30041:25;;;;;;;;;;;;;;;:35;30067:8;30041:35;;;;;;;;;;;;;;;;;;;;;;;;;30034:42;;29920:164;;;;:::o;48960:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43750:201::-;43071:12;:10;:12::i;:::-;43060:23;;:7;:5;:7::i;:::-;:23;;;43052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43859:1:::1;43839:22;;:8;:22;;::::0;43831:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43915:28;43934:8;43915:18;:28::i;:::-;43750:201:::0;:::o;49204:43::-;;;;;;;;;;;;;:::o;14595:157::-;14680:4;14719:25;14704:40;;;:11;:40;;;;14697:47;;14595:157;;;:::o;3065:98::-;3118:7;3145:10;3138:17;;3065:98;:::o;31272:187::-;31329:4;31372:7;31353:15;:13;:15::i;:::-;:26;;:53;;;;;31393:13;;31383:7;:23;31353:53;:98;;;;;31424:11;:20;31436:7;31424:20;;;;;;;;;;;:27;;;;;;;;;;;;31423:28;31353:98;31346:105;;31272:187;;;:::o;39442:196::-;39584:2;39557:15;:24;39573:7;39557:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39622:7;39618:2;39602:28;;39611:5;39602:28;;;;;;;;;;;;39442:196;;;:::o;23693:92::-;23749:7;23693:92;:::o;30151:170::-;30285:28;30295:4;30301:2;30305:7;30285:9;:28::i;:::-;30151:170;;;:::o;31467:104::-;31536:27;31546:2;31550:8;31536:27;;;;;;;;;;;;:9;:27::i;:::-;31467:104;;:::o;30392:185::-;30530:39;30547:4;30553:2;30557:7;30530:39;;;;;;;;;;;;:16;:39::i;:::-;30392:185;;;:::o;26420:1109::-;26482:21;;:::i;:::-;26516:12;26531:7;26516:22;;26599:4;26580:15;:13;:15::i;:::-;:23;;:47;;;;;26614:13;;26607:4;:20;26580:47;26576:886;;;26648:31;26682:11;:17;26694:4;26682:17;;;;;;;;;;;26648:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26723:9;:16;;;26718:729;;26794:1;26768:28;;:9;:14;;;:28;;;26764:101;;26832:9;26825:16;;;;;;26764:101;27167:261;27174:4;27167:261;;;27207:6;;;;;;;;27252:11;:17;27264:4;27252:17;;;;;;;;;;;27240:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27326:1;27300:28;;:9;:14;;;:28;;;27296:109;;27368:9;27361:16;;;;;;27296:109;27167:261;;;26718:729;26629:833;26576:886;27490:31;;;;;;;;;;;;;;26420:1109;;;;:::o;44111:191::-;44185:16;44204:6;;;;;;;;;;;44185:25;;44230:8;44221:6;;:17;;;;;;;;;;;;;;;;;;44285:8;44254:40;;44275:8;44254:40;;;;;;;;;;;;44174:128;44111:191;:::o;30648:369::-;30815:28;30825:4;30831:2;30835:7;30815:9;:28::i;:::-;30858:15;:2;:13;;;:15::i;:::-;:76;;;;;30878:56;30909:4;30915:2;30919:7;30928:5;30878:30;:56::i;:::-;30877:57;30858:76;30854:156;;;30958:40;;;;;;;;;;;;;;30854:156;30648:369;;;;:::o;54989:97::-;55042:13;55071:9;55064:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54989:97;:::o;627:723::-;683:13;913:1;904:5;:10;900:53;;931:10;;;;;;;;;;;;;;;;;;;;;900:53;963:12;978:5;963:20;;994:14;1019:78;1034:1;1026:4;:9;1019:78;;1052:8;;;;;:::i;:::-;;;;1083:2;1075:10;;;;;:::i;:::-;;;1019:78;;;1107:19;1139:6;1129:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107:39;;1157:154;1173:1;1164:5;:10;1157:154;;1201:1;1191:11;;;;;:::i;:::-;;;1268:2;1260:5;:10;;;;:::i;:::-;1247:2;:24;;;;:::i;:::-;1234:39;;1217:6;1224;1217:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1297:2;1288:11;;;;;:::i;:::-;;;1157:154;;;1335:6;1321:21;;;;;627:723;;;;:::o;34385:2130::-;34500:35;34538:21;34551:7;34538:12;:21::i;:::-;34500:59;;34598:4;34576:26;;:13;:18;;;:26;;;34572:67;;34611:28;;;;;;;;;;;;;;34572:67;34652:22;34694:4;34678:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34715:36;34732:4;34738:12;:10;:12::i;:::-;34715:16;:36::i;:::-;34678:73;:126;;;;34792:12;:10;:12::i;:::-;34768:36;;:20;34780:7;34768:11;:20::i;:::-;:36;;;34678:126;34652:153;;34823:17;34818:66;;34849:35;;;;;;;;;;;;;;34818:66;34913:1;34899:16;;:2;:16;;;34895:52;;34924:23;;;;;;;;;;;;;;34895:52;34960:43;34982:4;34988:2;34992:7;35001:1;34960:21;:43::i;:::-;35068:35;35085:1;35089:7;35098:4;35068:8;:35::i;:::-;35429:1;35399:12;:18;35412:4;35399:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35473:1;35445:12;:16;35458:2;35445:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35491:31;35525:11;:20;35537:7;35525:20;;;;;;;;;;;35491:54;;35576:2;35560:8;:13;;;:18;;;;;;;;;;;;;;;;;;35626:15;35593:8;:23;;;:49;;;;;;;;;;;;;;;;;;35894:19;35926:1;35916:7;:11;35894:33;;35942:31;35976:11;:24;35988:11;35976:24;;;;;;;;;;;35942:58;;36044:1;36019:27;;:8;:13;;;;;;;;;;;;:27;;;36015:384;;36229:13;;36214:11;:28;36210:174;;36283:4;36267:8;:13;;;:20;;;;;;;;;;;;;;;;;;36336:13;:28;;;36310:8;:23;;;:54;;;;;;;;;;;;;;;;;;36210:174;36015:384;35374:1036;;;36446:7;36442:2;36427:27;;36436:4;36427:27;;;;;;;;;;;;36465:42;36486:4;36492:2;36496:7;36505:1;36465:20;:42::i;:::-;34489:2026;;34385:2130;;;:::o;31934:163::-;32057:32;32063:2;32067:8;32077:5;32084:4;32057:5;:32::i;:::-;31934:163;;;:::o;4512:326::-;4572:4;4829:1;4807:7;:19;;;:23;4800:30;;4512:326;;;:::o;40130:667::-;40293:4;40330:2;40314:36;;;40351:12;:10;:12::i;:::-;40365:4;40371:7;40380:5;40314:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40310:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40565:1;40548:6;:13;:18;40544:235;;40594:40;;;;;;;;;;;;;;40544:235;40737:6;40731:13;40722:6;40718:2;40714:15;40707:38;40310:480;40443:45;;;40433:55;;;:6;:55;;;;40426:62;;;40130:667;;;;;;:::o;41445:159::-;;;;;:::o;42263:158::-;;;;;:::o;32356:1775::-;32495:20;32518:13;;32495:36;;32560:1;32546:16;;:2;:16;;;32542:48;;32571:19;;;;;;;;;;;;;;32542:48;32617:1;32605:8;:13;32601:44;;32627:18;;;;;;;;;;;;;;32601:44;32658:61;32688:1;32692:2;32696:12;32710:8;32658:21;:61::i;:::-;33031:8;32996:12;:16;33009:2;32996:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33095:8;33055:12;:16;33068:2;33055:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33154:2;33121:11;:25;33133:12;33121:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33221:15;33171:11;:25;33183:12;33171:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33254:20;33277:12;33254:35;;33304:11;33333:8;33318:12;:23;33304:37;;33362:4;:23;;;;;33370:15;:2;:13;;;:15::i;:::-;33362:23;33358:641;;;33406:314;33462:12;33458:2;33437:38;;33454:1;33437:38;;;;;;;;;;;;33503:69;33542:1;33546:2;33550:14;;;;;;33566:5;33503:30;:69::i;:::-;33498:174;;33608:40;;;;;;;;;;;;;;33498:174;33715:3;33699:12;:19;33406:314;;33801:12;33784:13;;:29;33780:43;;33815:8;;;33780:43;33358:641;;;33864:120;33920:14;;;;;;33916:2;33895:40;;33912:1;33895:40;;;;;;;;;;;;33979:3;33963:12;:19;33864:120;;33358:641;34029:12;34013:13;:28;;;;32971:1082;;34063:60;34092:1;34096:2;34100:12;34114:8;34063:20;:60::i;:::-;32484:1647;32356:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:89::-;1554:7;1594:6;1587:5;1583:18;1572:29;;1518:89;;;:::o;1613:120::-;1685:23;1702:5;1685:23;:::i;:::-;1678:5;1675:34;1665:62;;1723:1;1720;1713:12;1665:62;1613:120;:::o;1739:137::-;1784:5;1822:6;1809:20;1800:29;;1838:32;1864:5;1838:32;:::i;:::-;1739:137;;;;:::o;1882:327::-;1940:6;1989:2;1977:9;1968:7;1964:23;1960:32;1957:119;;;1995:79;;:::i;:::-;1957:119;2115:1;2140:52;2184:7;2175:6;2164:9;2160:22;2140:52;:::i;:::-;2130:62;;2086:116;1882:327;;;;:::o;2215:99::-;2267:6;2301:5;2295:12;2285:22;;2215:99;;;:::o;2320:169::-;2404:11;2438:6;2433:3;2426:19;2478:4;2473:3;2469:14;2454:29;;2320:169;;;;:::o;2495:307::-;2563:1;2573:113;2587:6;2584:1;2581:13;2573:113;;;2672:1;2667:3;2663:11;2657:18;2653:1;2648:3;2644:11;2637:39;2609:2;2606:1;2602:10;2597:15;;2573:113;;;2704:6;2701:1;2698:13;2695:101;;;2784:1;2775:6;2770:3;2766:16;2759:27;2695:101;2544:258;2495:307;;;:::o;2808:102::-;2849:6;2900:2;2896:7;2891:2;2884:5;2880:14;2876:28;2866:38;;2808:102;;;:::o;2916:364::-;3004:3;3032:39;3065:5;3032:39;:::i;:::-;3087:71;3151:6;3146:3;3087:71;:::i;:::-;3080:78;;3167:52;3212:6;3207:3;3200:4;3193:5;3189:16;3167:52;:::i;:::-;3244:29;3266:6;3244:29;:::i;:::-;3239:3;3235:39;3228:46;;3008:272;2916:364;;;;:::o;3286:313::-;3399:4;3437:2;3426:9;3422:18;3414:26;;3486:9;3480:4;3476:20;3472:1;3461:9;3457:17;3450:47;3514:78;3587:4;3578:6;3514:78;:::i;:::-;3506:86;;3286:313;;;;:::o;3605:77::-;3642:7;3671:5;3660:16;;3605:77;;;:::o;3688:122::-;3761:24;3779:5;3761:24;:::i;:::-;3754:5;3751:35;3741:63;;3800:1;3797;3790:12;3741:63;3688:122;:::o;3816:139::-;3862:5;3900:6;3887:20;3878:29;;3916:33;3943:5;3916:33;:::i;:::-;3816:139;;;;:::o;3961:329::-;4020:6;4069:2;4057:9;4048:7;4044:23;4040:32;4037:119;;;4075:79;;:::i;:::-;4037:119;4195:1;4220:53;4265:7;4256:6;4245:9;4241:22;4220:53;:::i;:::-;4210:63;;4166:117;3961:329;;;;:::o;4296:126::-;4333:7;4373:42;4366:5;4362:54;4351:65;;4296:126;;;:::o;4428:96::-;4465:7;4494:24;4512:5;4494:24;:::i;:::-;4483:35;;4428:96;;;:::o;4530:118::-;4617:24;4635:5;4617:24;:::i;:::-;4612:3;4605:37;4530:118;;:::o;4654:222::-;4747:4;4785:2;4774:9;4770:18;4762:26;;4798:71;4866:1;4855:9;4851:17;4842:6;4798:71;:::i;:::-;4654:222;;;;:::o;4882:122::-;4955:24;4973:5;4955:24;:::i;:::-;4948:5;4945:35;4935:63;;4994:1;4991;4984:12;4935:63;4882:122;:::o;5010:139::-;5056:5;5094:6;5081:20;5072:29;;5110:33;5137:5;5110:33;:::i;:::-;5010:139;;;;:::o;5155:474::-;5223:6;5231;5280:2;5268:9;5259:7;5255:23;5251:32;5248:119;;;5286:79;;:::i;:::-;5248:119;5406:1;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5377:117;5533:2;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5504:118;5155:474;;;;;:::o;5635:117::-;5744:1;5741;5734:12;5758:117;5867:1;5864;5857:12;5881:180;5929:77;5926:1;5919:88;6026:4;6023:1;6016:15;6050:4;6047:1;6040:15;6067:281;6150:27;6172:4;6150:27;:::i;:::-;6142:6;6138:40;6280:6;6268:10;6265:22;6244:18;6232:10;6229:34;6226:62;6223:88;;;6291:18;;:::i;:::-;6223:88;6331:10;6327:2;6320:22;6110:238;6067:281;;:::o;6354:129::-;6388:6;6415:20;;:::i;:::-;6405:30;;6444:33;6472:4;6464:6;6444:33;:::i;:::-;6354:129;;;:::o;6489:308::-;6551:4;6641:18;6633:6;6630:30;6627:56;;;6663:18;;:::i;:::-;6627:56;6701:29;6723:6;6701:29;:::i;:::-;6693:37;;6785:4;6779;6775:15;6767:23;;6489:308;;;:::o;6803:154::-;6887:6;6882:3;6877;6864:30;6949:1;6940:6;6935:3;6931:16;6924:27;6803:154;;;:::o;6963:412::-;7041:5;7066:66;7082:49;7124:6;7082:49;:::i;:::-;7066:66;:::i;:::-;7057:75;;7155:6;7148:5;7141:21;7193:4;7186:5;7182:16;7231:3;7222:6;7217:3;7213:16;7210:25;7207:112;;;7238:79;;:::i;:::-;7207:112;7328:41;7362:6;7357:3;7352;7328:41;:::i;:::-;7047:328;6963:412;;;;;:::o;7395:340::-;7451:5;7500:3;7493:4;7485:6;7481:17;7477:27;7467:122;;7508:79;;:::i;:::-;7467:122;7625:6;7612:20;7650:79;7725:3;7717:6;7710:4;7702:6;7698:17;7650:79;:::i;:::-;7641:88;;7457:278;7395:340;;;;:::o;7741:509::-;7810:6;7859:2;7847:9;7838:7;7834:23;7830:32;7827:119;;;7865:79;;:::i;:::-;7827:119;8013:1;8002:9;7998:17;7985:31;8043:18;8035:6;8032:30;8029:117;;;8065:79;;:::i;:::-;8029:117;8170:63;8225:7;8216:6;8205:9;8201:22;8170:63;:::i;:::-;8160:73;;7956:287;7741:509;;;;:::o;8256:118::-;8343:24;8361:5;8343:24;:::i;:::-;8338:3;8331:37;8256:118;;:::o;8380:222::-;8473:4;8511:2;8500:9;8496:18;8488:26;;8524:71;8592:1;8581:9;8577:17;8568:6;8524:71;:::i;:::-;8380:222;;;;:::o;8608:619::-;8685:6;8693;8701;8750:2;8738:9;8729:7;8725:23;8721:32;8718:119;;;8756:79;;:::i;:::-;8718:119;8876:1;8901:53;8946:7;8937:6;8926:9;8922:22;8901:53;:::i;:::-;8891:63;;8847:117;9003:2;9029:53;9074:7;9065:6;9054:9;9050:22;9029:53;:::i;:::-;9019:63;;8974:118;9131:2;9157:53;9202:7;9193:6;9182:9;9178:22;9157:53;:::i;:::-;9147:63;;9102:118;8608:619;;;;;:::o;9233:86::-;9268:7;9308:4;9301:5;9297:16;9286:27;;9233:86;;;:::o;9325:118::-;9396:22;9412:5;9396:22;:::i;:::-;9389:5;9386:33;9376:61;;9433:1;9430;9423:12;9376:61;9325:118;:::o;9449:135::-;9493:5;9531:6;9518:20;9509:29;;9547:31;9572:5;9547:31;:::i;:::-;9449:135;;;;:::o;9590:325::-;9647:6;9696:2;9684:9;9675:7;9671:23;9667:32;9664:119;;;9702:79;;:::i;:::-;9664:119;9822:1;9847:51;9890:7;9881:6;9870:9;9866:22;9847:51;:::i;:::-;9837:61;;9793:115;9590:325;;;;:::o;9921:472::-;9988:6;9996;10045:2;10033:9;10024:7;10020:23;10016:32;10013:119;;;10051:79;;:::i;:::-;10013:119;10171:1;10196:52;10240:7;10231:6;10220:9;10216:22;10196:52;:::i;:::-;10186:62;;10142:116;10297:2;10323:53;10368:7;10359:6;10348:9;10344:22;10323:53;:::i;:::-;10313:63;;10268:118;9921:472;;;;;:::o;10399:329::-;10458:6;10507:2;10495:9;10486:7;10482:23;10478:32;10475:119;;;10513:79;;:::i;:::-;10475:119;10633:1;10658:53;10703:7;10694:6;10683:9;10679:22;10658:53;:::i;:::-;10648:63;;10604:117;10399:329;;;;:::o;10734:112::-;10817:22;10833:5;10817:22;:::i;:::-;10812:3;10805:35;10734:112;;:::o;10852:214::-;10941:4;10979:2;10968:9;10964:18;10956:26;;10992:67;11056:1;11045:9;11041:17;11032:6;10992:67;:::i;:::-;10852:214;;;;:::o;11072:117::-;11181:1;11178;11171:12;11195:117;11304:1;11301;11294:12;11335:568;11408:8;11418:6;11468:3;11461:4;11453:6;11449:17;11445:27;11435:122;;11476:79;;:::i;:::-;11435:122;11589:6;11576:20;11566:30;;11619:18;11611:6;11608:30;11605:117;;;11641:79;;:::i;:::-;11605:117;11755:4;11747:6;11743:17;11731:29;;11809:3;11801:4;11793:6;11789:17;11779:8;11775:32;11772:41;11769:128;;;11816:79;;:::i;:::-;11769:128;11335:568;;;;;:::o;11909:559::-;11995:6;12003;12052:2;12040:9;12031:7;12027:23;12023:32;12020:119;;;12058:79;;:::i;:::-;12020:119;12206:1;12195:9;12191:17;12178:31;12236:18;12228:6;12225:30;12222:117;;;12258:79;;:::i;:::-;12222:117;12371:80;12443:7;12434:6;12423:9;12419:22;12371:80;:::i;:::-;12353:98;;;;12149:312;11909:559;;;;;:::o;12474:116::-;12544:21;12559:5;12544:21;:::i;:::-;12537:5;12534:32;12524:60;;12580:1;12577;12570:12;12524:60;12474:116;:::o;12596:133::-;12639:5;12677:6;12664:20;12655:29;;12693:30;12717:5;12693:30;:::i;:::-;12596:133;;;;:::o;12735:468::-;12800:6;12808;12857:2;12845:9;12836:7;12832:23;12828:32;12825:119;;;12863:79;;:::i;:::-;12825:119;12983:1;13008:53;13053:7;13044:6;13033:9;13029:22;13008:53;:::i;:::-;12998:63;;12954:117;13110:2;13136:50;13178:7;13169:6;13158:9;13154:22;13136:50;:::i;:::-;13126:60;;13081:115;12735:468;;;;;:::o;13209:307::-;13270:4;13360:18;13352:6;13349:30;13346:56;;;13382:18;;:::i;:::-;13346:56;13420:29;13442:6;13420:29;:::i;:::-;13412:37;;13504:4;13498;13494:15;13486:23;;13209:307;;;:::o;13522:410::-;13599:5;13624:65;13640:48;13681:6;13640:48;:::i;:::-;13624:65;:::i;:::-;13615:74;;13712:6;13705:5;13698:21;13750:4;13743:5;13739:16;13788:3;13779:6;13774:3;13770:16;13767:25;13764:112;;;13795:79;;:::i;:::-;13764:112;13885:41;13919:6;13914:3;13909;13885:41;:::i;:::-;13605:327;13522:410;;;;;:::o;13951:338::-;14006:5;14055:3;14048:4;14040:6;14036:17;14032:27;14022:122;;14063:79;;:::i;:::-;14022:122;14180:6;14167:20;14205:78;14279:3;14271:6;14264:4;14256:6;14252:17;14205:78;:::i;:::-;14196:87;;14012:277;13951:338;;;;:::o;14295:943::-;14390:6;14398;14406;14414;14463:3;14451:9;14442:7;14438:23;14434:33;14431:120;;;14470:79;;:::i;:::-;14431:120;14590:1;14615:53;14660:7;14651:6;14640:9;14636:22;14615:53;:::i;:::-;14605:63;;14561:117;14717:2;14743:53;14788:7;14779:6;14768:9;14764:22;14743:53;:::i;:::-;14733:63;;14688:118;14845:2;14871:53;14916:7;14907:6;14896:9;14892:22;14871:53;:::i;:::-;14861:63;;14816:118;15001:2;14990:9;14986:18;14973:32;15032:18;15024:6;15021:30;15018:117;;;15054:79;;:::i;:::-;15018:117;15159:62;15213:7;15204:6;15193:9;15189:22;15159:62;:::i;:::-;15149:72;;14944:287;14295:943;;;;;;;:::o;15244:700::-;15337:6;15345;15353;15402:2;15390:9;15381:7;15377:23;15373:32;15370:119;;;15408:79;;:::i;:::-;15370:119;15528:1;15553:51;15596:7;15587:6;15576:9;15572:22;15553:51;:::i;:::-;15543:61;;15499:115;15681:2;15670:9;15666:18;15653:32;15712:18;15704:6;15701:30;15698:117;;;15734:79;;:::i;:::-;15698:117;15847:80;15919:7;15910:6;15899:9;15895:22;15847:80;:::i;:::-;15829:98;;;;15624:313;15244:700;;;;;:::o;15950:115::-;16035:23;16052:5;16035:23;:::i;:::-;16030:3;16023:36;15950:115;;:::o;16071:218::-;16162:4;16200:2;16189:9;16185:18;16177:26;;16213:69;16279:1;16268:9;16264:17;16255:6;16213:69;:::i;:::-;16071:218;;;;:::o;16295:474::-;16363:6;16371;16420:2;16408:9;16399:7;16395:23;16391:32;16388:119;;;16426:79;;:::i;:::-;16388:119;16546:1;16571:53;16616:7;16607:6;16596:9;16592:22;16571:53;:::i;:::-;16561:63;;16517:117;16673:2;16699:53;16744:7;16735:6;16724:9;16720:22;16699:53;:::i;:::-;16689:63;;16644:118;16295:474;;;;;:::o;16775:182::-;16915:34;16911:1;16903:6;16899:14;16892:58;16775:182;:::o;16963:366::-;17105:3;17126:67;17190:2;17185:3;17126:67;:::i;:::-;17119:74;;17202:93;17291:3;17202:93;:::i;:::-;17320:2;17315:3;17311:12;17304:19;;16963:366;;;:::o;17335:419::-;17501:4;17539:2;17528:9;17524:18;17516:26;;17588:9;17582:4;17578:20;17574:1;17563:9;17559:17;17552:47;17616:131;17742:4;17616:131;:::i;:::-;17608:139;;17335:419;;;:::o;17760:180::-;17808:77;17805:1;17798:88;17905:4;17902:1;17895:15;17929:4;17926:1;17919:15;17946:320;17990:6;18027:1;18021:4;18017:12;18007:22;;18074:1;18068:4;18064:12;18095:18;18085:81;;18151:4;18143:6;18139:17;18129:27;;18085:81;18213:2;18205:6;18202:14;18182:18;18179:38;18176:84;;18232:18;;:::i;:::-;18176:84;17997:269;17946:320;;;:::o;18272:332::-;18393:4;18431:2;18420:9;18416:18;18408:26;;18444:71;18512:1;18501:9;18497:17;18488:6;18444:71;:::i;:::-;18525:72;18593:2;18582:9;18578:18;18569:6;18525:72;:::i;:::-;18272:332;;;;;:::o;18610:137::-;18664:5;18695:6;18689:13;18680:22;;18711:30;18735:5;18711:30;:::i;:::-;18610:137;;;;:::o;18753:345::-;18820:6;18869:2;18857:9;18848:7;18844:23;18840:32;18837:119;;;18875:79;;:::i;:::-;18837:119;18995:1;19020:61;19073:7;19064:6;19053:9;19049:22;19020:61;:::i;:::-;19010:71;;18966:125;18753:345;;;;:::o;19104:180::-;19152:77;19149:1;19142:88;19249:4;19246:1;19239:15;19273:4;19270:1;19263:15;19290:242;19329:3;19348:19;19365:1;19348:19;:::i;:::-;19343:24;;19381:19;19398:1;19381:19;:::i;:::-;19376:24;;19474:1;19466:6;19462:14;19459:1;19456:21;19453:47;;;19480:18;;:::i;:::-;19453:47;19524:1;19521;19517:9;19510:16;;19290:242;;;;:::o;19538:169::-;19678:21;19674:1;19666:6;19662:14;19655:45;19538:169;:::o;19713:366::-;19855:3;19876:67;19940:2;19935:3;19876:67;:::i;:::-;19869:74;;19952:93;20041:3;19952:93;:::i;:::-;20070:2;20065:3;20061:12;20054:19;;19713:366;;;:::o;20085:419::-;20251:4;20289:2;20278:9;20274:18;20266:26;;20338:9;20332:4;20328:20;20324:1;20313:9;20309:17;20302:47;20366:131;20492:4;20366:131;:::i;:::-;20358:139;;20085:419;;;:::o;20510:173::-;20650:25;20646:1;20638:6;20634:14;20627:49;20510:173;:::o;20689:366::-;20831:3;20852:67;20916:2;20911:3;20852:67;:::i;:::-;20845:74;;20928:93;21017:3;20928:93;:::i;:::-;21046:2;21041:3;21037:12;21030:19;;20689:366;;;:::o;21061:419::-;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:131;21468:4;21342:131;:::i;:::-;21334:139;;21061:419;;;:::o;21486:237::-;21524:3;21543:18;21559:1;21543:18;:::i;:::-;21538:23;;21575:18;21591:1;21575:18;:::i;:::-;21570:23;;21665:1;21659:4;21655:12;21652:1;21649:19;21646:45;;;21671:18;;:::i;:::-;21646:45;21715:1;21712;21708:9;21701:16;;21486:237;;;;:::o;21729:181::-;21869:33;21865:1;21857:6;21853:14;21846:57;21729:181;:::o;21916:366::-;22058:3;22079:67;22143:2;22138:3;22079:67;:::i;:::-;22072:74;;22155:93;22244:3;22155:93;:::i;:::-;22273:2;22268:3;22264:12;22257:19;;21916:366;;;:::o;22288:419::-;22454:4;22492:2;22481:9;22477:18;22469:26;;22541:9;22535:4;22531:20;22527:1;22516:9;22512:17;22505:47;22569:131;22695:4;22569:131;:::i;:::-;22561:139;;22288:419;;;:::o;22713:176::-;22853:28;22849:1;22841:6;22837:14;22830:52;22713:176;:::o;22895:366::-;23037:3;23058:67;23122:2;23117:3;23058:67;:::i;:::-;23051:74;;23134:93;23223:3;23134:93;:::i;:::-;23252:2;23247:3;23243:12;23236:19;;22895:366;;;:::o;23267:419::-;23433:4;23471:2;23460:9;23456:18;23448:26;;23520:9;23514:4;23510:20;23506:1;23495:9;23491:17;23484:47;23548:131;23674:4;23548:131;:::i;:::-;23540:139;;23267:419;;;:::o;23692:176::-;23832:28;23828:1;23820:6;23816:14;23809:52;23692:176;:::o;23874:366::-;24016:3;24037:67;24101:2;24096:3;24037:67;:::i;:::-;24030:74;;24113:93;24202:3;24113:93;:::i;:::-;24231:2;24226:3;24222:12;24215:19;;23874:366;;;:::o;24246:419::-;24412:4;24450:2;24439:9;24435:18;24427:26;;24499:9;24493:4;24489:20;24485:1;24474:9;24470:17;24463:47;24527:131;24653:4;24527:131;:::i;:::-;24519:139;;24246:419;;;:::o;24671:348::-;24711:7;24734:20;24752:1;24734:20;:::i;:::-;24729:25;;24768:20;24786:1;24768:20;:::i;:::-;24763:25;;24956:1;24888:66;24884:74;24881:1;24878:81;24873:1;24866:9;24859:17;24855:105;24852:131;;;24963:18;;:::i;:::-;24852:131;25011:1;25008;25004:9;24993:20;;24671:348;;;;:::o;25025:169::-;25165:21;25161:1;25153:6;25149:14;25142:45;25025:169;:::o;25200:366::-;25342:3;25363:67;25427:2;25422:3;25363:67;:::i;:::-;25356:74;;25439:93;25528:3;25439:93;:::i;:::-;25557:2;25552:3;25548:12;25541:19;;25200:366;;;:::o;25572:419::-;25738:4;25776:2;25765:9;25761:18;25753:26;;25825:9;25819:4;25815:20;25811:1;25800:9;25796:17;25789:47;25853:131;25979:4;25853:131;:::i;:::-;25845:139;;25572:419;;;:::o;25997:185::-;26035:4;26055:18;26071:1;26055:18;:::i;:::-;26050:23;;26087:18;26103:1;26087:18;:::i;:::-;26082:23;;26124:1;26121;26118:8;26115:34;;;26129:18;;:::i;:::-;26115:34;26174:1;26171;26167:9;26159:17;;25997:185;;;;:::o;26188:180::-;26236:77;26233:1;26226:88;26333:4;26330:1;26323:15;26357:4;26354:1;26347:15;26374:167;26411:3;26434:22;26450:5;26434:22;:::i;:::-;26425:31;;26478:4;26471:5;26468:15;26465:41;;26486:18;;:::i;:::-;26465:41;26533:1;26526:5;26522:13;26515:20;;26374:167;;;:::o;26547:173::-;26687:25;26683:1;26675:6;26671:14;26664:49;26547:173;:::o;26726:366::-;26868:3;26889:67;26953:2;26948:3;26889:67;:::i;:::-;26882:74;;26965:93;27054:3;26965:93;:::i;:::-;27083:2;27078:3;27074:12;27067:19;;26726:366;;;:::o;27098:419::-;27264:4;27302:2;27291:9;27287:18;27279:26;;27351:9;27345:4;27341:20;27337:1;27326:9;27322:17;27315:47;27379:131;27505:4;27379:131;:::i;:::-;27371:139;;27098:419;;;:::o;27523:173::-;27663:25;27659:1;27651:6;27647:14;27640:49;27523:173;:::o;27702:366::-;27844:3;27865:67;27929:2;27924:3;27865:67;:::i;:::-;27858:74;;27941:93;28030:3;27941:93;:::i;:::-;28059:2;28054:3;28050:12;28043:19;;27702:366;;;:::o;28074:419::-;28240:4;28278:2;28267:9;28263:18;28255:26;;28327:9;28321:4;28317:20;28313:1;28302:9;28298:17;28291:47;28355:131;28481:4;28355:131;:::i;:::-;28347:139;;28074:419;;;:::o;28499:234::-;28639:34;28635:1;28627:6;28623:14;28616:58;28708:17;28703:2;28695:6;28691:15;28684:42;28499:234;:::o;28739:366::-;28881:3;28902:67;28966:2;28961:3;28902:67;:::i;:::-;28895:74;;28978:93;29067:3;28978:93;:::i;:::-;29096:2;29091:3;29087:12;29080:19;;28739:366;;;:::o;29111:419::-;29277:4;29315:2;29304:9;29300:18;29292:26;;29364:9;29358:4;29354:20;29350:1;29339:9;29335:17;29328:47;29392:131;29518:4;29392:131;:::i;:::-;29384:139;;29111:419;;;:::o;29536:148::-;29638:11;29675:3;29660:18;;29536:148;;;;:::o;29690:377::-;29796:3;29824:39;29857:5;29824:39;:::i;:::-;29879:89;29961:6;29956:3;29879:89;:::i;:::-;29872:96;;29977:52;30022:6;30017:3;30010:4;30003:5;29999:16;29977:52;:::i;:::-;30054:6;30049:3;30045:16;30038:23;;29800:267;29690:377;;;;:::o;30073:141::-;30122:4;30145:3;30137:11;;30168:3;30165:1;30158:14;30202:4;30199:1;30189:18;30181:26;;30073:141;;;:::o;30244:845::-;30347:3;30384:5;30378:12;30413:36;30439:9;30413:36;:::i;:::-;30465:89;30547:6;30542:3;30465:89;:::i;:::-;30458:96;;30585:1;30574:9;30570:17;30601:1;30596:137;;;;30747:1;30742:341;;;;30563:520;;30596:137;30680:4;30676:9;30665;30661:25;30656:3;30649:38;30716:6;30711:3;30707:16;30700:23;;30596:137;;30742:341;30809:38;30841:5;30809:38;:::i;:::-;30869:1;30883:154;30897:6;30894:1;30891:13;30883:154;;;30971:7;30965:14;30961:1;30956:3;30952:11;30945:35;31021:1;31012:7;31008:15;30997:26;;30919:4;30916:1;30912:12;30907:17;;30883:154;;;31066:6;31061:3;31057:16;31050:23;;30749:334;;30563:520;;30351:738;;30244:845;;;;:::o;31095:589::-;31320:3;31342:95;31433:3;31424:6;31342:95;:::i;:::-;31335:102;;31454:95;31545:3;31536:6;31454:95;:::i;:::-;31447:102;;31566:92;31654:3;31645:6;31566:92;:::i;:::-;31559:99;;31675:3;31668:10;;31095:589;;;;;;:::o;31690:305::-;31730:3;31749:20;31767:1;31749:20;:::i;:::-;31744:25;;31783:20;31801:1;31783:20;:::i;:::-;31778:25;;31937:1;31869:66;31865:74;31862:1;31859:81;31856:107;;;31943:18;;:::i;:::-;31856:107;31987:1;31984;31980:9;31973:16;;31690:305;;;;:::o;32001:169::-;32141:21;32137:1;32129:6;32125:14;32118:45;32001:169;:::o;32176:366::-;32318:3;32339:67;32403:2;32398:3;32339:67;:::i;:::-;32332:74;;32415:93;32504:3;32415:93;:::i;:::-;32533:2;32528:3;32524:12;32517:19;;32176:366;;;:::o;32548:419::-;32714:4;32752:2;32741:9;32737:18;32729:26;;32801:9;32795:4;32791:20;32787:1;32776:9;32772:17;32765:47;32829:131;32955:4;32829:131;:::i;:::-;32821:139;;32548:419;;;:::o;32973:233::-;33012:3;33035:24;33053:5;33035:24;:::i;:::-;33026:33;;33081:66;33074:5;33071:77;33068:103;;33151:18;;:::i;:::-;33068:103;33198:1;33191:5;33187:13;33180:20;;32973:233;;;:::o;33212:225::-;33352:34;33348:1;33340:6;33336:14;33329:58;33421:8;33416:2;33408:6;33404:15;33397:33;33212:225;:::o;33443:366::-;33585:3;33606:67;33670:2;33665:3;33606:67;:::i;:::-;33599:74;;33682:93;33771:3;33682:93;:::i;:::-;33800:2;33795:3;33791:12;33784:19;;33443:366;;;:::o;33815:419::-;33981:4;34019:2;34008:9;34004:18;33996:26;;34068:9;34062:4;34058:20;34054:1;34043:9;34039:17;34032:47;34096:131;34222:4;34096:131;:::i;:::-;34088:139;;33815:419;;;:::o;34240:180::-;34288:77;34285:1;34278:88;34385:4;34382:1;34375:15;34409:4;34406:1;34399:15;34426:185;34466:1;34483:20;34501:1;34483:20;:::i;:::-;34478:25;;34517:20;34535:1;34517:20;:::i;:::-;34512:25;;34556:1;34546:35;;34561:18;;:::i;:::-;34546:35;34603:1;34600;34596:9;34591:14;;34426:185;;;;:::o;34617:191::-;34657:4;34677:20;34695:1;34677:20;:::i;:::-;34672:25;;34711:20;34729:1;34711:20;:::i;:::-;34706:25;;34750:1;34747;34744:8;34741:34;;;34755:18;;:::i;:::-;34741:34;34800:1;34797;34793:9;34785:17;;34617:191;;;;:::o;34814:176::-;34846:1;34863:20;34881:1;34863:20;:::i;:::-;34858:25;;34897:20;34915:1;34897:20;:::i;:::-;34892:25;;34936:1;34926:35;;34941:18;;:::i;:::-;34926:35;34982:1;34979;34975:9;34970:14;;34814:176;;;;:::o;34996:98::-;35047:6;35081:5;35075:12;35065:22;;34996:98;;;:::o;35100:168::-;35183:11;35217:6;35212:3;35205:19;35257:4;35252:3;35248:14;35233:29;;35100:168;;;;:::o;35274:360::-;35360:3;35388:38;35420:5;35388:38;:::i;:::-;35442:70;35505:6;35500:3;35442:70;:::i;:::-;35435:77;;35521:52;35566:6;35561:3;35554:4;35547:5;35543:16;35521:52;:::i;:::-;35598:29;35620:6;35598:29;:::i;:::-;35593:3;35589:39;35582:46;;35364:270;35274:360;;;;:::o;35640:640::-;35835:4;35873:3;35862:9;35858:19;35850:27;;35887:71;35955:1;35944:9;35940:17;35931:6;35887:71;:::i;:::-;35968:72;36036:2;36025:9;36021:18;36012:6;35968:72;:::i;:::-;36050;36118:2;36107:9;36103:18;36094:6;36050:72;:::i;:::-;36169:9;36163:4;36159:20;36154:2;36143:9;36139:18;36132:48;36197:76;36268:4;36259:6;36197:76;:::i;:::-;36189:84;;35640:640;;;;;;;:::o;36286:141::-;36342:5;36373:6;36367:13;36358:22;;36389:32;36415:5;36389:32;:::i;:::-;36286:141;;;;:::o;36433:349::-;36502:6;36551:2;36539:9;36530:7;36526:23;36522:32;36519:119;;;36557:79;;:::i;:::-;36519:119;36677:1;36702:63;36757:7;36748:6;36737:9;36733:22;36702:63;:::i;:::-;36692:73;;36648:127;36433:349;;;;:::o

Swarm Source

ipfs://13e2d492ea431b85aed21f75b3c945deeab4bc42f8f8817921c00bb989175fbd
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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