ETH Price: $3,400.68 (+1.64%)

Token

Non Frenly Trolls (TROLL)
 

Overview

Max Total Supply

10,000 TROLL

Holders

1,868

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 TROLL
0x63c65c86cb9d25a252635c73f90516d21e344ed4
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Non Frenly Trolls is a collection of 10,000 Troll NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NonFrenlyTrolls

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-17
*/

/**
 *Submitted for verification at Etherscan.io on 2022-06-17
*/

//                                        .:\::::/:.
//             +------------------+      .:\:\::/:/:.
//             |    NON FRENLY    |     :.:\:\::/:/:.:
//             |      TROLLS      |    :=.`  -  -  '.=:
//             |                  |    `=(\  0  0  /)='
//             |    A free mint   |       (  (__)  )
//             |    project <3    |     .--`-vvvv-'--
//             +------------------+     |            |
//                      | |            /  /(      )\  \
//                      | |           /  / (  /\  ) \  \
//                      | |          (  | /  /  \  \ |  )
//                      | |           ^^ (  (    )  ) ^^
//                      | |             __\  \  /  /__
//                      | |           `(______||______)'
//             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// 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/IERC721Enumerable.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// 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/NonFrenlyTrolls.sol

// Creator: Trolls Labs

pragma solidity ^0.8.0;

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // 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_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), "ERC721A: number minted query for the zero address");
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * 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) {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), "ERC721A: approve to caller");

        _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 override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    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;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(quantity != 0, "ERC721A: quantity must be greater than 0");

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                }

                updatedIndex++;
            }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved");

        require(prevOwnership.addr == from, "ERC721A: transfer from incorrect owner");
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract NonFrenlyTrolls is ERC721A, Ownable, ReentrancyGuard {

    string public        hiddenURI;
    string public        baseURI;
    uint public          price             = 0.000 ether;
    uint public          maxPerTx          = 5;
    uint public          maxPerWallet      = 5;
    uint public          totalFree         = 10000;
    uint public          maxSupply         = 10000;
    uint public          nextOwnerToExplicitlySet;
    bool public          mintEnabled;
    bool public          revealed;

    constructor() ERC721A("Non Frenly Trolls", "TROLL"){}

    function trolling(uint256 numberOfTokens) external payable {
        uint cost = price;
        if(totalSupply() + numberOfTokens < totalFree + 1) {
            cost = 0;
        }
        require(msg.sender == tx.origin, "who you tryna troll?");
        require(msg.value == numberOfTokens * cost, "don't be cheap!");
        require(totalSupply() + numberOfTokens < maxSupply + 1, "we're sold out!");
        require(mintEnabled, "come back tomorrow");
        require(numberMinted(msg.sender) + numberOfTokens <= maxPerWallet, "too many per wallet");
        require(numberOfTokens < maxPerTx + 1, "too many per tx");

        _safeMint(msg.sender, numberOfTokens);
    }

    function superTrolling(address to, uint256 numberOfTokens) external onlyOwner {
        require(totalSupply() + numberOfTokens < maxSupply + 1, "we're sold out!");

        _safeMint(to, numberOfTokens);
    }

    function toggleMinting() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function toggleRevealed() external onlyOwner {
        revealed = !revealed;
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function setHiddenURI(string calldata hiddenURI_) external onlyOwner {
        hiddenURI = hiddenURI_;
    }

    function setBaseURI(string calldata baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "troll does not exist");

        if (revealed) {
            return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId))) : "";
        }
        return hiddenURI;
    }

    function setPrice(uint256 price_) external onlyOwner {
        price = price_;
    }

    function setTotalFree(uint256 totalFree_) external onlyOwner {
        totalFree = totalFree_;
    }

    function setMaxPerTx(uint256 maxPerTx_) external onlyOwner {
        maxPerTx = maxPerTx_;
    }

    function setMaxPerWallet(uint256 maxPerWallet_) external onlyOwner {
        maxPerWallet = maxPerWallet_;
    }

    function setmaxSupply(uint256 maxSupply_) external onlyOwner {
        maxSupply = maxSupply_;
    }

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

    function withdraw() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
        _setOwnersExplicit(quantity);
    }

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return ownershipOf(tokenId);
    }

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        require(quantity != 0, "quantity must be nonzero");
        require(currentIndex != 0, "no tokens minted yet");
        uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet;
        require(_nextOwnerToExplicitlySet < currentIndex, "all ownerships have been set");

        // Index underflow is impossible.
        // Counter or index overflow is incredibly unrealistic.
        unchecked {
            uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1;

            // Set the end index to be the last token index
            if (endIndex + 1 > currentIndex) {
                endIndex = currentIndex - 1;
            }

            for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) {
                if (_ownerships[i].addr == address(0)) {
                    TokenOwnership memory ownership = ownershipOf(i);
                    _ownerships[i].addr = ownership.addr;
                    _ownerships[i].startTimestamp = ownership.startTimestamp;
                }
            }

            nextOwnerToExplicitlySet = endIndex + 1;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURI","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":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","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":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hiddenURI_","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerTx_","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerWallet_","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalFree_","type":"uint256"}],"name":"setTotalFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"superTrolling","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":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"trolling","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b556005600c556005600d55612710600e55612710600f553480156200002c57600080fd5b506040518060400160405280601181526020017f4e6f6e204672656e6c792054726f6c6c730000000000000000000000000000008152506040518060400160405280600581526020017f54524f4c4c0000000000000000000000000000000000000000000000000000008152508160019080519060200190620000b1929190620001c9565b508060029080519060200190620000ca929190620001c9565b505050620000ed620000e1620000fb60201b60201c565b6200010360201b60201c565b6001600881905550620002de565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001d79062000279565b90600052602060002090601f016020900481019282620001fb576000855562000247565b82601f106200021657805160ff191683800117855562000247565b8280016001018555821562000247579182015b828111156200024657825182559160200191906001019062000229565b5b5090506200025691906200025a565b5090565b5b80821115620002755760008160009055506001016200025b565b5090565b600060028204905060018216806200029257607f821691505b60208210811415620002a957620002a8620002af565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61523380620002ee6000396000f3fe6080604052600436106102675760003560e01c806370a0823111610144578063bbaac02f116100b6578063d7224ba01161007a578063d7224ba0146108e5578063dc33e68114610910578063e268e4d31461094d578063e985e9c514610976578063f2fde38b146109b3578063f968adbe146109dc57610267565b8063bbaac02f14610800578063c6f6f21614610829578063c87b56dd14610852578063d12397301461088f578063d5abeb01146108ba57610267565b806391b7f5ed1161010857806391b7f5ed146106f25780639231ab2a1461071b57806395d89b4114610758578063a035b1fe14610783578063a22cb465146107ae578063b88d4fde146107d757610267565b806370a0823114610631578063715018a61461066e5780637d55094d146106855780638cc54e7f1461069c5780638da5cb5b146106c757610267565b806342842e0e116101dd57806351830227116101a1578063518302271461053557806355f804b314610560578063563aaf11146105895780635bc020bc146105b25780636352211e146105c95780636c0360eb1461060657610267565b806342842e0e1461045f57806342a575e114610488578063453c2310146104b15780634b3274bb146104dc5780634f6ccce7146104f857610267565b8063228025e81161022f578063228025e81461036557806323b872dd1461038e5780632d20fb60146103b75780632f745c59146103e0578063333e44e61461041d5780633ccfd60b1461044857610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806318160ddd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906139cf565b610a07565b6040516102a0919061413f565b60405180910390f35b3480156102b557600080fd5b506102be610b51565b6040516102cb919061415a565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613a76565b610be3565b60405161030891906140d8565b60405180910390f35b34801561031d57600080fd5b506103386004803603810190610333919061398f565b610c68565b005b34801561034657600080fd5b5061034f610d81565b60405161035c9190614577565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190613a76565b610d8a565b005b34801561039a57600080fd5b506103b560048036038101906103b09190613879565b610e10565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613a76565b610e20565b005b3480156103ec57600080fd5b506104076004803603810190610402919061398f565b610efe565b6040516104149190614577565b60405180910390f35b34801561042957600080fd5b506104326110f0565b60405161043f9190614577565b60405180910390f35b34801561045457600080fd5b5061045d6110f6565b005b34801561046b57600080fd5b5061048660048036038101906104819190613879565b611277565b005b34801561049457600080fd5b506104af60048036038101906104aa919061398f565b611297565b005b3480156104bd57600080fd5b506104c6611383565b6040516104d39190614577565b60405180910390f35b6104f660048036038101906104f19190613a76565b611389565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613a76565b6115df565b60405161052c9190614577565b60405180910390f35b34801561054157600080fd5b5061054a611632565b604051610557919061413f565b60405180910390f35b34801561056c57600080fd5b5061058760048036038101906105829190613a29565b611645565b005b34801561059557600080fd5b506105b060048036038101906105ab9190613a76565b6116d7565b005b3480156105be57600080fd5b506105c761175d565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190613a76565b611805565b6040516105fd91906140d8565b60405180910390f35b34801561061257600080fd5b5061061b61181b565b604051610628919061415a565b60405180910390f35b34801561063d57600080fd5b506106586004803603810190610653919061380c565b6118a9565b6040516106659190614577565b60405180910390f35b34801561067a57600080fd5b50610683611992565b005b34801561069157600080fd5b5061069a611a1a565b005b3480156106a857600080fd5b506106b1611ac2565b6040516106be919061415a565b60405180910390f35b3480156106d357600080fd5b506106dc611b50565b6040516106e991906140d8565b60405180910390f35b3480156106fe57600080fd5b5061071960048036038101906107149190613a76565b611b7a565b005b34801561072757600080fd5b50610742600480360381019061073d9190613a76565b611c00565b60405161074f919061455c565b60405180910390f35b34801561076457600080fd5b5061076d611c18565b60405161077a919061415a565b60405180910390f35b34801561078f57600080fd5b50610798611caa565b6040516107a59190614577565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d0919061394f565b611cb0565b005b3480156107e357600080fd5b506107fe60048036038101906107f991906138cc565b611e31565b005b34801561080c57600080fd5b5061082760048036038101906108229190613a29565b611e8d565b005b34801561083557600080fd5b50610850600480360381019061084b9190613a76565b611f1f565b005b34801561085e57600080fd5b5061087960048036038101906108749190613a76565b611fa5565b604051610886919061415a565b60405180910390f35b34801561089b57600080fd5b506108a46120f6565b6040516108b1919061413f565b60405180910390f35b3480156108c657600080fd5b506108cf612109565b6040516108dc9190614577565b60405180910390f35b3480156108f157600080fd5b506108fa61210f565b6040516109079190614577565b60405180910390f35b34801561091c57600080fd5b506109376004803603810190610932919061380c565b612115565b6040516109449190614577565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f9190613a76565b612127565b005b34801561098257600080fd5b5061099d60048036038101906109989190613839565b6121ad565b6040516109aa919061413f565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d5919061380c565b612241565b005b3480156109e857600080fd5b506109f1612339565b6040516109fe9190614577565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4a5750610b498261233f565b5b9050919050565b606060018054610b609061482a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8c9061482a565b8015610bd95780601f10610bae57610100808354040283529160200191610bd9565b820191906000526020600020905b815481529060010190602001808311610bbc57829003601f168201915b5050505050905090565b6000610bee826123a9565b610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c249061453c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7382611805565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb906143bc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d036123b6565b73ffffffffffffffffffffffffffffffffffffffff161480610d325750610d3181610d2c6123b6565b6121ad565b5b610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d68906142bc565b60405180910390fd5b610d7c8383836123be565b505050565b60008054905090565b610d926123b6565b73ffffffffffffffffffffffffffffffffffffffff16610db0611b50565b73ffffffffffffffffffffffffffffffffffffffff1614610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd9061433c565b60405180910390fd5b80600f8190555050565b610e1b838383612470565b505050565b610e286123b6565b73ffffffffffffffffffffffffffffffffffffffff16610e46611b50565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e939061433c565b60405180910390fd5b60026008541415610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed9906144fc565b60405180910390fd5b6002600881905550610ef3816129b0565b600160088190555050565b6000610f09836118a9565b8210610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f419061417c565b60405180910390fd5b6000610f54610d81565b905060008060005b838110156110ae576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461104e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110a057868414156110975781955050505050506110ea565b83806001019450505b508080600101915050610f5c565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e1906144bc565b60405180910390fd5b92915050565b600e5481565b6110fe6123b6565b73ffffffffffffffffffffffffffffffffffffffff1661111c611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111699061433c565b60405180910390fd5b600260085414156111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af906144fc565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516111e6906140c3565b60006040518083038185875af1925050503d8060008114611223576040519150601f19603f3d011682016040523d82523d6000602084013e611228565b606091505b505090508061126c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611263906143fc565b60405180910390fd5b506001600881905550565b61129283838360405180602001604052806000815250611e31565b505050565b61129f6123b6565b73ffffffffffffffffffffffffffffffffffffffff166112bd611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a9061433c565b60405180910390fd5b6001600f54611322919061464b565b8161132b610d81565b611335919061464b565b10611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c906144dc565b60405180910390fd5b61137f8282612be2565b5050565b600d5481565b6000600b5490506001600e5461139f919061464b565b826113a8610d81565b6113b2919061464b565b10156113bd57600090505b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461142b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114229061449c565b60405180910390fd5b808261143791906146d2565b3414611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f9061429c565b60405180910390fd5b6001600f54611487919061464b565b82611490610d81565b61149a919061464b565b106114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d1906144dc565b60405180910390fd5b601160009054906101000a900460ff16611529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115209061445c565b60405180910390fd5b600d548261153633612115565b611540919061464b565b1115611581576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611578906143dc565b60405180910390fd5b6001600c54611590919061464b565b82106115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c89061439c565b60405180910390fd5b6115db3383612be2565b5050565b60006115e9610d81565b821061162a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116219061421c565b60405180910390fd5b819050919050565b601160019054906101000a900460ff1681565b61164d6123b6565b73ffffffffffffffffffffffffffffffffffffffff1661166b611b50565b73ffffffffffffffffffffffffffffffffffffffff16146116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b89061433c565b60405180910390fd5b8181600a91906116d2929190613600565b505050565b6116df6123b6565b73ffffffffffffffffffffffffffffffffffffffff166116fd611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a9061433c565b60405180910390fd5b80600e8190555050565b6117656123b6565b73ffffffffffffffffffffffffffffffffffffffff16611783611b50565b73ffffffffffffffffffffffffffffffffffffffff16146117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d09061433c565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b600061181082612c00565b600001519050919050565b600a80546118289061482a565b80601f01602080910402602001604051908101604052809291908181526020018280546118549061482a565b80156118a15780601f10611876576101008083540402835291602001916118a1565b820191906000526020600020905b81548152906001019060200180831161188457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561191a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611911906142fc565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61199a6123b6565b73ffffffffffffffffffffffffffffffffffffffff166119b8611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a059061433c565b60405180910390fd5b611a186000612d9a565b565b611a226123b6565b73ffffffffffffffffffffffffffffffffffffffff16611a40611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d9061433c565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b60098054611acf9061482a565b80601f0160208091040260200160405190810160405280929190818152602001828054611afb9061482a565b8015611b485780601f10611b1d57610100808354040283529160200191611b48565b820191906000526020600020905b815481529060010190602001808311611b2b57829003601f168201915b505050505081565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b826123b6565b73ffffffffffffffffffffffffffffffffffffffff16611ba0611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bed9061433c565b60405180910390fd5b80600b8190555050565b611c08613686565b611c1182612c00565b9050919050565b606060028054611c279061482a565b80601f0160208091040260200160405190810160405280929190818152602001828054611c539061482a565b8015611ca05780601f10611c7557610100808354040283529160200191611ca0565b820191906000526020600020905b815481529060010190602001808311611c8357829003601f168201915b5050505050905090565b600b5481565b611cb86123b6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d9061435c565b60405180910390fd5b8060066000611d336123b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611de06123b6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e25919061413f565b60405180910390a35050565b611e3c848484612470565b611e4884848484612e60565b611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e9061441c565b60405180910390fd5b50505050565b611e956123b6565b73ffffffffffffffffffffffffffffffffffffffff16611eb3611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f009061433c565b60405180910390fd5b818160099190611f1a929190613600565b505050565b611f276123b6565b73ffffffffffffffffffffffffffffffffffffffff16611f45611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061433c565b60405180910390fd5b80600c8190555050565b6060611fb0826123a9565b611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe6906141fc565b60405180910390fd5b601160019054906101000a900460ff1615612063576000600a80546120139061482a565b90501415612030576040518060200160405280600081525061205c565b600a61203b83612ff7565b60405160200161204c92919061409f565b6040516020818303038152906040525b90506120f1565b600980546120709061482a565b80601f016020809104026020016040519081016040528092919081815260200182805461209c9061482a565b80156120e95780601f106120be576101008083540402835291602001916120e9565b820191906000526020600020905b8154815290600101906020018083116120cc57829003601f168201915b505050505090505b919050565b601160009054906101000a900460ff1681565b600f5481565b60105481565b600061212082613158565b9050919050565b61212f6123b6565b73ffffffffffffffffffffffffffffffffffffffff1661214d611b50565b73ffffffffffffffffffffffffffffffffffffffff16146121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a9061433c565b60405180910390fd5b80600d8190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122496123b6565b73ffffffffffffffffffffffffffffffffffffffff16612267611b50565b73ffffffffffffffffffffffffffffffffffffffff16146122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b49061433c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561232d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123249061419c565b60405180910390fd5b61233681612d9a565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061247b82612c00565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166124a26123b6565b73ffffffffffffffffffffffffffffffffffffffff1614806124fe57506124c76123b6565b73ffffffffffffffffffffffffffffffffffffffff166124e684610be3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061251a575061251982600001516125146123b6565b6121ad565b5b90508061255c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125539061437c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146125ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c59061431c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561263e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126359061423c565b60405180910390fd5b61264b8585856001613241565b61265b60008484600001516123be565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129405761289f816123a9565b1561293f5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129a98585856001613247565b5050505050565b60008114156129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129eb906142dc565b60405180910390fd5b600080541415612a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a30906141dc565b60405180910390fd5b600060105490506000548110612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b9061427c565b60405180910390fd5b60006001838301039050600054600182011115612aa45760016000540390505b60008290505b818111612bd257600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612bc5576000612b2782612c00565b905080600001516003600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602001516003600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b8080600101915050612aaa565b5060018101601081905550505050565b612bfc82826040518060200160405280600081525061324d565b5050565b612c08613686565b612c11826123a9565b612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c47906141bc565b60405180910390fd5b60008290505b60008110612d59576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d4a578092505050612d95565b50808060019003915050612c56565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8c9061451c565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612e818473ffffffffffffffffffffffffffffffffffffffff1661325f565b15612fea578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eaa6123b6565b8786866040518563ffffffff1660e01b8152600401612ecc94939291906140f3565b602060405180830381600087803b158015612ee657600080fd5b505af1925050508015612f1757506040513d601f19601f82011682018060405250810190612f1491906139fc565b60015b612f9a573d8060008114612f47576040519150601f19603f3d011682016040523d82523d6000602084013e612f4c565b606091505b50600081511415612f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f899061441c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fef565b600190505b949350505050565b6060600082141561303f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613153565b600082905060005b6000821461307157808061305a9061488d565b915050600a8261306a91906146a1565b9150613047565b60008167ffffffffffffffff81111561308d5761308c6149c3565b5b6040519080825280601f01601f1916602001820160405280156130bf5781602001600182028036833780820191505090505b5090505b6000851461314c576001826130d8919061472c565b9150600a856130e791906148d6565b60306130f3919061464b565b60f81b81838151811061310957613108614994565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561314591906146a1565b94506130c3565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c09061425c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b61325a8383836001613282565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156132f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ef9061443c565b60405180910390fd5b600084141561333c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133339061447c565b60405180910390fd5b6133496000868387613241565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156135e357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156135ce5761358e6000888488612e60565b6135cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c49061441c565b60405180910390fd5b5b81806001019250508080600101915050613517565b5080600081905550506135f96000868387613247565b5050505050565b82805461360c9061482a565b90600052602060002090601f01602090048101928261362e5760008555613675565b82601f1061364757803560ff1916838001178555613675565b82800160010185558215613675579182015b82811115613674578235825591602001919060010190613659565b5b50905061368291906136c0565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156136d95760008160009055506001016136c1565b5090565b60006136f06136eb846145b7565b614592565b90508281526020810184848401111561370c5761370b614a01565b5b6137178482856147e8565b509392505050565b60008135905061372e816151a1565b92915050565b600081359050613743816151b8565b92915050565b600081359050613758816151cf565b92915050565b60008151905061376d816151cf565b92915050565b600082601f830112613788576137876149f7565b5b81356137988482602086016136dd565b91505092915050565b60008083601f8401126137b7576137b66149f7565b5b8235905067ffffffffffffffff8111156137d4576137d36149f2565b5b6020830191508360018202830111156137f0576137ef6149fc565b5b9250929050565b600081359050613806816151e6565b92915050565b60006020828403121561382257613821614a0b565b5b60006138308482850161371f565b91505092915050565b600080604083850312156138505761384f614a0b565b5b600061385e8582860161371f565b925050602061386f8582860161371f565b9150509250929050565b60008060006060848603121561389257613891614a0b565b5b60006138a08682870161371f565b93505060206138b18682870161371f565b92505060406138c2868287016137f7565b9150509250925092565b600080600080608085870312156138e6576138e5614a0b565b5b60006138f48782880161371f565b94505060206139058782880161371f565b9350506040613916878288016137f7565b925050606085013567ffffffffffffffff81111561393757613936614a06565b5b61394387828801613773565b91505092959194509250565b6000806040838503121561396657613965614a0b565b5b60006139748582860161371f565b925050602061398585828601613734565b9150509250929050565b600080604083850312156139a6576139a5614a0b565b5b60006139b48582860161371f565b92505060206139c5858286016137f7565b9150509250929050565b6000602082840312156139e5576139e4614a0b565b5b60006139f384828501613749565b91505092915050565b600060208284031215613a1257613a11614a0b565b5b6000613a208482850161375e565b91505092915050565b60008060208385031215613a4057613a3f614a0b565b5b600083013567ffffffffffffffff811115613a5e57613a5d614a06565b5b613a6a858286016137a1565b92509250509250929050565b600060208284031215613a8c57613a8b614a0b565b5b6000613a9a848285016137f7565b91505092915050565b613aac81614760565b82525050565b613abb81614760565b82525050565b613aca81614772565b82525050565b6000613adb826145fd565b613ae58185614613565b9350613af58185602086016147f7565b613afe81614a10565b840191505092915050565b6000613b1482614608565b613b1e818561462f565b9350613b2e8185602086016147f7565b613b3781614a10565b840191505092915050565b6000613b4d82614608565b613b578185614640565b9350613b678185602086016147f7565b80840191505092915050565b60008154613b808161482a565b613b8a8186614640565b94506001821660008114613ba55760018114613bb657613be9565b60ff19831686528186019350613be9565b613bbf856145e8565b60005b83811015613be157815481890152600182019150602081019050613bc2565b838801955050505b50505092915050565b6000613bff60228361462f565b9150613c0a82614a21565b604082019050919050565b6000613c2260268361462f565b9150613c2d82614a70565b604082019050919050565b6000613c45602a8361462f565b9150613c5082614abf565b604082019050919050565b6000613c6860148361462f565b9150613c7382614b0e565b602082019050919050565b6000613c8b60148361462f565b9150613c9682614b37565b602082019050919050565b6000613cae60238361462f565b9150613cb982614b60565b604082019050919050565b6000613cd160258361462f565b9150613cdc82614baf565b604082019050919050565b6000613cf460318361462f565b9150613cff82614bfe565b604082019050919050565b6000613d17601c8361462f565b9150613d2282614c4d565b602082019050919050565b6000613d3a600f8361462f565b9150613d4582614c76565b602082019050919050565b6000613d5d60398361462f565b9150613d6882614c9f565b604082019050919050565b6000613d8060188361462f565b9150613d8b82614cee565b602082019050919050565b6000613da3602b8361462f565b9150613dae82614d17565b604082019050919050565b6000613dc660268361462f565b9150613dd182614d66565b604082019050919050565b6000613de960208361462f565b9150613df482614db5565b602082019050919050565b6000613e0c601a8361462f565b9150613e1782614dde565b602082019050919050565b6000613e2f60328361462f565b9150613e3a82614e07565b604082019050919050565b6000613e52600f8361462f565b9150613e5d82614e56565b602082019050919050565b6000613e7560228361462f565b9150613e8082614e7f565b604082019050919050565b6000613e9860138361462f565b9150613ea382614ece565b602082019050919050565b6000613ebb600083614624565b9150613ec682614ef7565b600082019050919050565b6000613ede60108361462f565b9150613ee982614efa565b602082019050919050565b6000613f0160338361462f565b9150613f0c82614f23565b604082019050919050565b6000613f2460218361462f565b9150613f2f82614f72565b604082019050919050565b6000613f4760128361462f565b9150613f5282614fc1565b602082019050919050565b6000613f6a60288361462f565b9150613f7582614fea565b604082019050919050565b6000613f8d60148361462f565b9150613f9882615039565b602082019050919050565b6000613fb0602e8361462f565b9150613fbb82615062565b604082019050919050565b6000613fd3600f8361462f565b9150613fde826150b1565b602082019050919050565b6000613ff6601f8361462f565b9150614001826150da565b602082019050919050565b6000614019602f8361462f565b915061402482615103565b604082019050919050565b600061403c602d8361462f565b915061404782615152565b604082019050919050565b6040820160008201516140686000850182613aa3565b50602082015161407b6020850182614090565b50505050565b61408a816147ca565b82525050565b614099816147d4565b82525050565b60006140ab8285613b73565b91506140b78284613b42565b91508190509392505050565b60006140ce82613eae565b9150819050919050565b60006020820190506140ed6000830184613ab2565b92915050565b60006080820190506141086000830187613ab2565b6141156020830186613ab2565b6141226040830185614081565b81810360608301526141348184613ad0565b905095945050505050565b60006020820190506141546000830184613ac1565b92915050565b600060208201905081810360008301526141748184613b09565b905092915050565b6000602082019050818103600083015261419581613bf2565b9050919050565b600060208201905081810360008301526141b581613c15565b9050919050565b600060208201905081810360008301526141d581613c38565b9050919050565b600060208201905081810360008301526141f581613c5b565b9050919050565b6000602082019050818103600083015261421581613c7e565b9050919050565b6000602082019050818103600083015261423581613ca1565b9050919050565b6000602082019050818103600083015261425581613cc4565b9050919050565b6000602082019050818103600083015261427581613ce7565b9050919050565b6000602082019050818103600083015261429581613d0a565b9050919050565b600060208201905081810360008301526142b581613d2d565b9050919050565b600060208201905081810360008301526142d581613d50565b9050919050565b600060208201905081810360008301526142f581613d73565b9050919050565b6000602082019050818103600083015261431581613d96565b9050919050565b6000602082019050818103600083015261433581613db9565b9050919050565b6000602082019050818103600083015261435581613ddc565b9050919050565b6000602082019050818103600083015261437581613dff565b9050919050565b6000602082019050818103600083015261439581613e22565b9050919050565b600060208201905081810360008301526143b581613e45565b9050919050565b600060208201905081810360008301526143d581613e68565b9050919050565b600060208201905081810360008301526143f581613e8b565b9050919050565b6000602082019050818103600083015261441581613ed1565b9050919050565b6000602082019050818103600083015261443581613ef4565b9050919050565b6000602082019050818103600083015261445581613f17565b9050919050565b6000602082019050818103600083015261447581613f3a565b9050919050565b6000602082019050818103600083015261449581613f5d565b9050919050565b600060208201905081810360008301526144b581613f80565b9050919050565b600060208201905081810360008301526144d581613fa3565b9050919050565b600060208201905081810360008301526144f581613fc6565b9050919050565b6000602082019050818103600083015261451581613fe9565b9050919050565b600060208201905081810360008301526145358161400c565b9050919050565b600060208201905081810360008301526145558161402f565b9050919050565b60006040820190506145716000830184614052565b92915050565b600060208201905061458c6000830184614081565b92915050565b600061459c6145ad565b90506145a8828261485c565b919050565b6000604051905090565b600067ffffffffffffffff8211156145d2576145d16149c3565b5b6145db82614a10565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614656826147ca565b9150614661836147ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561469657614695614907565b5b828201905092915050565b60006146ac826147ca565b91506146b7836147ca565b9250826146c7576146c6614936565b5b828204905092915050565b60006146dd826147ca565b91506146e8836147ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561472157614720614907565b5b828202905092915050565b6000614737826147ca565b9150614742836147ca565b92508282101561475557614754614907565b5b828203905092915050565b600061476b826147aa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156148155780820151818401526020810190506147fa565b83811115614824576000848401525b50505050565b6000600282049050600182168061484257607f821691505b6020821081141561485657614855614965565b5b50919050565b61486582614a10565b810181811067ffffffffffffffff82111715614884576148836149c3565b5b80604052505050565b6000614898826147ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148cb576148ca614907565b5b600182019050919050565b60006148e1826147ca565b91506148ec836147ca565b9250826148fc576148fb614936565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6e6f20746f6b656e73206d696e74656420796574000000000000000000000000600082015250565b7f74726f6c6c20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f616c6c206f776e657273686970732068617665206265656e2073657400000000600082015250565b7f646f6e2774206265206368656170210000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f746f6f206d616e79207065722074780000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f746f6f206d616e79207065722077616c6c657400000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f636f6d65206261636b20746f6d6f72726f770000000000000000000000000000600082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f77686f20796f75207472796e612074726f6c6c3f000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f776527726520736f6c64206f7574210000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6151aa81614760565b81146151b557600080fd5b50565b6151c181614772565b81146151cc57600080fd5b50565b6151d88161477e565b81146151e357600080fd5b50565b6151ef816147ca565b81146151fa57600080fd5b5056fea2646970667358221220f974faa959d754b09f82838ea73184485ddf5574f34bf84b0139623057c7a06364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102675760003560e01c806370a0823111610144578063bbaac02f116100b6578063d7224ba01161007a578063d7224ba0146108e5578063dc33e68114610910578063e268e4d31461094d578063e985e9c514610976578063f2fde38b146109b3578063f968adbe146109dc57610267565b8063bbaac02f14610800578063c6f6f21614610829578063c87b56dd14610852578063d12397301461088f578063d5abeb01146108ba57610267565b806391b7f5ed1161010857806391b7f5ed146106f25780639231ab2a1461071b57806395d89b4114610758578063a035b1fe14610783578063a22cb465146107ae578063b88d4fde146107d757610267565b806370a0823114610631578063715018a61461066e5780637d55094d146106855780638cc54e7f1461069c5780638da5cb5b146106c757610267565b806342842e0e116101dd57806351830227116101a1578063518302271461053557806355f804b314610560578063563aaf11146105895780635bc020bc146105b25780636352211e146105c95780636c0360eb1461060657610267565b806342842e0e1461045f57806342a575e114610488578063453c2310146104b15780634b3274bb146104dc5780634f6ccce7146104f857610267565b8063228025e81161022f578063228025e81461036557806323b872dd1461038e5780632d20fb60146103b75780632f745c59146103e0578063333e44e61461041d5780633ccfd60b1461044857610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806318160ddd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906139cf565b610a07565b6040516102a0919061413f565b60405180910390f35b3480156102b557600080fd5b506102be610b51565b6040516102cb919061415a565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613a76565b610be3565b60405161030891906140d8565b60405180910390f35b34801561031d57600080fd5b506103386004803603810190610333919061398f565b610c68565b005b34801561034657600080fd5b5061034f610d81565b60405161035c9190614577565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190613a76565b610d8a565b005b34801561039a57600080fd5b506103b560048036038101906103b09190613879565b610e10565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613a76565b610e20565b005b3480156103ec57600080fd5b506104076004803603810190610402919061398f565b610efe565b6040516104149190614577565b60405180910390f35b34801561042957600080fd5b506104326110f0565b60405161043f9190614577565b60405180910390f35b34801561045457600080fd5b5061045d6110f6565b005b34801561046b57600080fd5b5061048660048036038101906104819190613879565b611277565b005b34801561049457600080fd5b506104af60048036038101906104aa919061398f565b611297565b005b3480156104bd57600080fd5b506104c6611383565b6040516104d39190614577565b60405180910390f35b6104f660048036038101906104f19190613a76565b611389565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613a76565b6115df565b60405161052c9190614577565b60405180910390f35b34801561054157600080fd5b5061054a611632565b604051610557919061413f565b60405180910390f35b34801561056c57600080fd5b5061058760048036038101906105829190613a29565b611645565b005b34801561059557600080fd5b506105b060048036038101906105ab9190613a76565b6116d7565b005b3480156105be57600080fd5b506105c761175d565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190613a76565b611805565b6040516105fd91906140d8565b60405180910390f35b34801561061257600080fd5b5061061b61181b565b604051610628919061415a565b60405180910390f35b34801561063d57600080fd5b506106586004803603810190610653919061380c565b6118a9565b6040516106659190614577565b60405180910390f35b34801561067a57600080fd5b50610683611992565b005b34801561069157600080fd5b5061069a611a1a565b005b3480156106a857600080fd5b506106b1611ac2565b6040516106be919061415a565b60405180910390f35b3480156106d357600080fd5b506106dc611b50565b6040516106e991906140d8565b60405180910390f35b3480156106fe57600080fd5b5061071960048036038101906107149190613a76565b611b7a565b005b34801561072757600080fd5b50610742600480360381019061073d9190613a76565b611c00565b60405161074f919061455c565b60405180910390f35b34801561076457600080fd5b5061076d611c18565b60405161077a919061415a565b60405180910390f35b34801561078f57600080fd5b50610798611caa565b6040516107a59190614577565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d0919061394f565b611cb0565b005b3480156107e357600080fd5b506107fe60048036038101906107f991906138cc565b611e31565b005b34801561080c57600080fd5b5061082760048036038101906108229190613a29565b611e8d565b005b34801561083557600080fd5b50610850600480360381019061084b9190613a76565b611f1f565b005b34801561085e57600080fd5b5061087960048036038101906108749190613a76565b611fa5565b604051610886919061415a565b60405180910390f35b34801561089b57600080fd5b506108a46120f6565b6040516108b1919061413f565b60405180910390f35b3480156108c657600080fd5b506108cf612109565b6040516108dc9190614577565b60405180910390f35b3480156108f157600080fd5b506108fa61210f565b6040516109079190614577565b60405180910390f35b34801561091c57600080fd5b506109376004803603810190610932919061380c565b612115565b6040516109449190614577565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f9190613a76565b612127565b005b34801561098257600080fd5b5061099d60048036038101906109989190613839565b6121ad565b6040516109aa919061413f565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d5919061380c565b612241565b005b3480156109e857600080fd5b506109f1612339565b6040516109fe9190614577565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4a5750610b498261233f565b5b9050919050565b606060018054610b609061482a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8c9061482a565b8015610bd95780601f10610bae57610100808354040283529160200191610bd9565b820191906000526020600020905b815481529060010190602001808311610bbc57829003601f168201915b5050505050905090565b6000610bee826123a9565b610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c249061453c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7382611805565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb906143bc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d036123b6565b73ffffffffffffffffffffffffffffffffffffffff161480610d325750610d3181610d2c6123b6565b6121ad565b5b610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d68906142bc565b60405180910390fd5b610d7c8383836123be565b505050565b60008054905090565b610d926123b6565b73ffffffffffffffffffffffffffffffffffffffff16610db0611b50565b73ffffffffffffffffffffffffffffffffffffffff1614610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd9061433c565b60405180910390fd5b80600f8190555050565b610e1b838383612470565b505050565b610e286123b6565b73ffffffffffffffffffffffffffffffffffffffff16610e46611b50565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e939061433c565b60405180910390fd5b60026008541415610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed9906144fc565b60405180910390fd5b6002600881905550610ef3816129b0565b600160088190555050565b6000610f09836118a9565b8210610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f419061417c565b60405180910390fd5b6000610f54610d81565b905060008060005b838110156110ae576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461104e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110a057868414156110975781955050505050506110ea565b83806001019450505b508080600101915050610f5c565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e1906144bc565b60405180910390fd5b92915050565b600e5481565b6110fe6123b6565b73ffffffffffffffffffffffffffffffffffffffff1661111c611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111699061433c565b60405180910390fd5b600260085414156111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af906144fc565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516111e6906140c3565b60006040518083038185875af1925050503d8060008114611223576040519150601f19603f3d011682016040523d82523d6000602084013e611228565b606091505b505090508061126c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611263906143fc565b60405180910390fd5b506001600881905550565b61129283838360405180602001604052806000815250611e31565b505050565b61129f6123b6565b73ffffffffffffffffffffffffffffffffffffffff166112bd611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a9061433c565b60405180910390fd5b6001600f54611322919061464b565b8161132b610d81565b611335919061464b565b10611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c906144dc565b60405180910390fd5b61137f8282612be2565b5050565b600d5481565b6000600b5490506001600e5461139f919061464b565b826113a8610d81565b6113b2919061464b565b10156113bd57600090505b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461142b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114229061449c565b60405180910390fd5b808261143791906146d2565b3414611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f9061429c565b60405180910390fd5b6001600f54611487919061464b565b82611490610d81565b61149a919061464b565b106114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d1906144dc565b60405180910390fd5b601160009054906101000a900460ff16611529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115209061445c565b60405180910390fd5b600d548261153633612115565b611540919061464b565b1115611581576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611578906143dc565b60405180910390fd5b6001600c54611590919061464b565b82106115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c89061439c565b60405180910390fd5b6115db3383612be2565b5050565b60006115e9610d81565b821061162a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116219061421c565b60405180910390fd5b819050919050565b601160019054906101000a900460ff1681565b61164d6123b6565b73ffffffffffffffffffffffffffffffffffffffff1661166b611b50565b73ffffffffffffffffffffffffffffffffffffffff16146116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b89061433c565b60405180910390fd5b8181600a91906116d2929190613600565b505050565b6116df6123b6565b73ffffffffffffffffffffffffffffffffffffffff166116fd611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a9061433c565b60405180910390fd5b80600e8190555050565b6117656123b6565b73ffffffffffffffffffffffffffffffffffffffff16611783611b50565b73ffffffffffffffffffffffffffffffffffffffff16146117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d09061433c565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b600061181082612c00565b600001519050919050565b600a80546118289061482a565b80601f01602080910402602001604051908101604052809291908181526020018280546118549061482a565b80156118a15780601f10611876576101008083540402835291602001916118a1565b820191906000526020600020905b81548152906001019060200180831161188457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561191a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611911906142fc565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61199a6123b6565b73ffffffffffffffffffffffffffffffffffffffff166119b8611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a059061433c565b60405180910390fd5b611a186000612d9a565b565b611a226123b6565b73ffffffffffffffffffffffffffffffffffffffff16611a40611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d9061433c565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b60098054611acf9061482a565b80601f0160208091040260200160405190810160405280929190818152602001828054611afb9061482a565b8015611b485780601f10611b1d57610100808354040283529160200191611b48565b820191906000526020600020905b815481529060010190602001808311611b2b57829003601f168201915b505050505081565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b826123b6565b73ffffffffffffffffffffffffffffffffffffffff16611ba0611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bed9061433c565b60405180910390fd5b80600b8190555050565b611c08613686565b611c1182612c00565b9050919050565b606060028054611c279061482a565b80601f0160208091040260200160405190810160405280929190818152602001828054611c539061482a565b8015611ca05780601f10611c7557610100808354040283529160200191611ca0565b820191906000526020600020905b815481529060010190602001808311611c8357829003601f168201915b5050505050905090565b600b5481565b611cb86123b6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d9061435c565b60405180910390fd5b8060066000611d336123b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611de06123b6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e25919061413f565b60405180910390a35050565b611e3c848484612470565b611e4884848484612e60565b611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e9061441c565b60405180910390fd5b50505050565b611e956123b6565b73ffffffffffffffffffffffffffffffffffffffff16611eb3611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f009061433c565b60405180910390fd5b818160099190611f1a929190613600565b505050565b611f276123b6565b73ffffffffffffffffffffffffffffffffffffffff16611f45611b50565b73ffffffffffffffffffffffffffffffffffffffff1614611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061433c565b60405180910390fd5b80600c8190555050565b6060611fb0826123a9565b611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe6906141fc565b60405180910390fd5b601160019054906101000a900460ff1615612063576000600a80546120139061482a565b90501415612030576040518060200160405280600081525061205c565b600a61203b83612ff7565b60405160200161204c92919061409f565b6040516020818303038152906040525b90506120f1565b600980546120709061482a565b80601f016020809104026020016040519081016040528092919081815260200182805461209c9061482a565b80156120e95780601f106120be576101008083540402835291602001916120e9565b820191906000526020600020905b8154815290600101906020018083116120cc57829003601f168201915b505050505090505b919050565b601160009054906101000a900460ff1681565b600f5481565b60105481565b600061212082613158565b9050919050565b61212f6123b6565b73ffffffffffffffffffffffffffffffffffffffff1661214d611b50565b73ffffffffffffffffffffffffffffffffffffffff16146121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a9061433c565b60405180910390fd5b80600d8190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122496123b6565b73ffffffffffffffffffffffffffffffffffffffff16612267611b50565b73ffffffffffffffffffffffffffffffffffffffff16146122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b49061433c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561232d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123249061419c565b60405180910390fd5b61233681612d9a565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061247b82612c00565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166124a26123b6565b73ffffffffffffffffffffffffffffffffffffffff1614806124fe57506124c76123b6565b73ffffffffffffffffffffffffffffffffffffffff166124e684610be3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061251a575061251982600001516125146123b6565b6121ad565b5b90508061255c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125539061437c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146125ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c59061431c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561263e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126359061423c565b60405180910390fd5b61264b8585856001613241565b61265b60008484600001516123be565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129405761289f816123a9565b1561293f5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129a98585856001613247565b5050505050565b60008114156129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129eb906142dc565b60405180910390fd5b600080541415612a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a30906141dc565b60405180910390fd5b600060105490506000548110612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b9061427c565b60405180910390fd5b60006001838301039050600054600182011115612aa45760016000540390505b60008290505b818111612bd257600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612bc5576000612b2782612c00565b905080600001516003600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602001516003600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b8080600101915050612aaa565b5060018101601081905550505050565b612bfc82826040518060200160405280600081525061324d565b5050565b612c08613686565b612c11826123a9565b612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c47906141bc565b60405180910390fd5b60008290505b60008110612d59576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d4a578092505050612d95565b50808060019003915050612c56565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8c9061451c565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612e818473ffffffffffffffffffffffffffffffffffffffff1661325f565b15612fea578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eaa6123b6565b8786866040518563ffffffff1660e01b8152600401612ecc94939291906140f3565b602060405180830381600087803b158015612ee657600080fd5b505af1925050508015612f1757506040513d601f19601f82011682018060405250810190612f1491906139fc565b60015b612f9a573d8060008114612f47576040519150601f19603f3d011682016040523d82523d6000602084013e612f4c565b606091505b50600081511415612f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f899061441c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fef565b600190505b949350505050565b6060600082141561303f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613153565b600082905060005b6000821461307157808061305a9061488d565b915050600a8261306a91906146a1565b9150613047565b60008167ffffffffffffffff81111561308d5761308c6149c3565b5b6040519080825280601f01601f1916602001820160405280156130bf5781602001600182028036833780820191505090505b5090505b6000851461314c576001826130d8919061472c565b9150600a856130e791906148d6565b60306130f3919061464b565b60f81b81838151811061310957613108614994565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561314591906146a1565b94506130c3565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c09061425c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b61325a8383836001613282565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156132f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ef9061443c565b60405180910390fd5b600084141561333c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133339061447c565b60405180910390fd5b6133496000868387613241565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156135e357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156135ce5761358e6000888488612e60565b6135cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c49061441c565b60405180910390fd5b5b81806001019250508080600101915050613517565b5080600081905550506135f96000868387613247565b5050505050565b82805461360c9061482a565b90600052602060002090601f01602090048101928261362e5760008555613675565b82601f1061364757803560ff1916838001178555613675565b82800160010185558215613675579182015b82811115613674578235825591602001919060010190613659565b5b50905061368291906136c0565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156136d95760008160009055506001016136c1565b5090565b60006136f06136eb846145b7565b614592565b90508281526020810184848401111561370c5761370b614a01565b5b6137178482856147e8565b509392505050565b60008135905061372e816151a1565b92915050565b600081359050613743816151b8565b92915050565b600081359050613758816151cf565b92915050565b60008151905061376d816151cf565b92915050565b600082601f830112613788576137876149f7565b5b81356137988482602086016136dd565b91505092915050565b60008083601f8401126137b7576137b66149f7565b5b8235905067ffffffffffffffff8111156137d4576137d36149f2565b5b6020830191508360018202830111156137f0576137ef6149fc565b5b9250929050565b600081359050613806816151e6565b92915050565b60006020828403121561382257613821614a0b565b5b60006138308482850161371f565b91505092915050565b600080604083850312156138505761384f614a0b565b5b600061385e8582860161371f565b925050602061386f8582860161371f565b9150509250929050565b60008060006060848603121561389257613891614a0b565b5b60006138a08682870161371f565b93505060206138b18682870161371f565b92505060406138c2868287016137f7565b9150509250925092565b600080600080608085870312156138e6576138e5614a0b565b5b60006138f48782880161371f565b94505060206139058782880161371f565b9350506040613916878288016137f7565b925050606085013567ffffffffffffffff81111561393757613936614a06565b5b61394387828801613773565b91505092959194509250565b6000806040838503121561396657613965614a0b565b5b60006139748582860161371f565b925050602061398585828601613734565b9150509250929050565b600080604083850312156139a6576139a5614a0b565b5b60006139b48582860161371f565b92505060206139c5858286016137f7565b9150509250929050565b6000602082840312156139e5576139e4614a0b565b5b60006139f384828501613749565b91505092915050565b600060208284031215613a1257613a11614a0b565b5b6000613a208482850161375e565b91505092915050565b60008060208385031215613a4057613a3f614a0b565b5b600083013567ffffffffffffffff811115613a5e57613a5d614a06565b5b613a6a858286016137a1565b92509250509250929050565b600060208284031215613a8c57613a8b614a0b565b5b6000613a9a848285016137f7565b91505092915050565b613aac81614760565b82525050565b613abb81614760565b82525050565b613aca81614772565b82525050565b6000613adb826145fd565b613ae58185614613565b9350613af58185602086016147f7565b613afe81614a10565b840191505092915050565b6000613b1482614608565b613b1e818561462f565b9350613b2e8185602086016147f7565b613b3781614a10565b840191505092915050565b6000613b4d82614608565b613b578185614640565b9350613b678185602086016147f7565b80840191505092915050565b60008154613b808161482a565b613b8a8186614640565b94506001821660008114613ba55760018114613bb657613be9565b60ff19831686528186019350613be9565b613bbf856145e8565b60005b83811015613be157815481890152600182019150602081019050613bc2565b838801955050505b50505092915050565b6000613bff60228361462f565b9150613c0a82614a21565b604082019050919050565b6000613c2260268361462f565b9150613c2d82614a70565b604082019050919050565b6000613c45602a8361462f565b9150613c5082614abf565b604082019050919050565b6000613c6860148361462f565b9150613c7382614b0e565b602082019050919050565b6000613c8b60148361462f565b9150613c9682614b37565b602082019050919050565b6000613cae60238361462f565b9150613cb982614b60565b604082019050919050565b6000613cd160258361462f565b9150613cdc82614baf565b604082019050919050565b6000613cf460318361462f565b9150613cff82614bfe565b604082019050919050565b6000613d17601c8361462f565b9150613d2282614c4d565b602082019050919050565b6000613d3a600f8361462f565b9150613d4582614c76565b602082019050919050565b6000613d5d60398361462f565b9150613d6882614c9f565b604082019050919050565b6000613d8060188361462f565b9150613d8b82614cee565b602082019050919050565b6000613da3602b8361462f565b9150613dae82614d17565b604082019050919050565b6000613dc660268361462f565b9150613dd182614d66565b604082019050919050565b6000613de960208361462f565b9150613df482614db5565b602082019050919050565b6000613e0c601a8361462f565b9150613e1782614dde565b602082019050919050565b6000613e2f60328361462f565b9150613e3a82614e07565b604082019050919050565b6000613e52600f8361462f565b9150613e5d82614e56565b602082019050919050565b6000613e7560228361462f565b9150613e8082614e7f565b604082019050919050565b6000613e9860138361462f565b9150613ea382614ece565b602082019050919050565b6000613ebb600083614624565b9150613ec682614ef7565b600082019050919050565b6000613ede60108361462f565b9150613ee982614efa565b602082019050919050565b6000613f0160338361462f565b9150613f0c82614f23565b604082019050919050565b6000613f2460218361462f565b9150613f2f82614f72565b604082019050919050565b6000613f4760128361462f565b9150613f5282614fc1565b602082019050919050565b6000613f6a60288361462f565b9150613f7582614fea565b604082019050919050565b6000613f8d60148361462f565b9150613f9882615039565b602082019050919050565b6000613fb0602e8361462f565b9150613fbb82615062565b604082019050919050565b6000613fd3600f8361462f565b9150613fde826150b1565b602082019050919050565b6000613ff6601f8361462f565b9150614001826150da565b602082019050919050565b6000614019602f8361462f565b915061402482615103565b604082019050919050565b600061403c602d8361462f565b915061404782615152565b604082019050919050565b6040820160008201516140686000850182613aa3565b50602082015161407b6020850182614090565b50505050565b61408a816147ca565b82525050565b614099816147d4565b82525050565b60006140ab8285613b73565b91506140b78284613b42565b91508190509392505050565b60006140ce82613eae565b9150819050919050565b60006020820190506140ed6000830184613ab2565b92915050565b60006080820190506141086000830187613ab2565b6141156020830186613ab2565b6141226040830185614081565b81810360608301526141348184613ad0565b905095945050505050565b60006020820190506141546000830184613ac1565b92915050565b600060208201905081810360008301526141748184613b09565b905092915050565b6000602082019050818103600083015261419581613bf2565b9050919050565b600060208201905081810360008301526141b581613c15565b9050919050565b600060208201905081810360008301526141d581613c38565b9050919050565b600060208201905081810360008301526141f581613c5b565b9050919050565b6000602082019050818103600083015261421581613c7e565b9050919050565b6000602082019050818103600083015261423581613ca1565b9050919050565b6000602082019050818103600083015261425581613cc4565b9050919050565b6000602082019050818103600083015261427581613ce7565b9050919050565b6000602082019050818103600083015261429581613d0a565b9050919050565b600060208201905081810360008301526142b581613d2d565b9050919050565b600060208201905081810360008301526142d581613d50565b9050919050565b600060208201905081810360008301526142f581613d73565b9050919050565b6000602082019050818103600083015261431581613d96565b9050919050565b6000602082019050818103600083015261433581613db9565b9050919050565b6000602082019050818103600083015261435581613ddc565b9050919050565b6000602082019050818103600083015261437581613dff565b9050919050565b6000602082019050818103600083015261439581613e22565b9050919050565b600060208201905081810360008301526143b581613e45565b9050919050565b600060208201905081810360008301526143d581613e68565b9050919050565b600060208201905081810360008301526143f581613e8b565b9050919050565b6000602082019050818103600083015261441581613ed1565b9050919050565b6000602082019050818103600083015261443581613ef4565b9050919050565b6000602082019050818103600083015261445581613f17565b9050919050565b6000602082019050818103600083015261447581613f3a565b9050919050565b6000602082019050818103600083015261449581613f5d565b9050919050565b600060208201905081810360008301526144b581613f80565b9050919050565b600060208201905081810360008301526144d581613fa3565b9050919050565b600060208201905081810360008301526144f581613fc6565b9050919050565b6000602082019050818103600083015261451581613fe9565b9050919050565b600060208201905081810360008301526145358161400c565b9050919050565b600060208201905081810360008301526145558161402f565b9050919050565b60006040820190506145716000830184614052565b92915050565b600060208201905061458c6000830184614081565b92915050565b600061459c6145ad565b90506145a8828261485c565b919050565b6000604051905090565b600067ffffffffffffffff8211156145d2576145d16149c3565b5b6145db82614a10565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614656826147ca565b9150614661836147ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561469657614695614907565b5b828201905092915050565b60006146ac826147ca565b91506146b7836147ca565b9250826146c7576146c6614936565b5b828204905092915050565b60006146dd826147ca565b91506146e8836147ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561472157614720614907565b5b828202905092915050565b6000614737826147ca565b9150614742836147ca565b92508282101561475557614754614907565b5b828203905092915050565b600061476b826147aa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156148155780820151818401526020810190506147fa565b83811115614824576000848401525b50505050565b6000600282049050600182168061484257607f821691505b6020821081141561485657614855614965565b5b50919050565b61486582614a10565b810181811067ffffffffffffffff82111715614884576148836149c3565b5b80604052505050565b6000614898826147ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148cb576148ca614907565b5b600182019050919050565b60006148e1826147ca565b91506148ec836147ca565b9250826148fc576148fb614936565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6e6f20746f6b656e73206d696e74656420796574000000000000000000000000600082015250565b7f74726f6c6c20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f616c6c206f776e657273686970732068617665206265656e2073657400000000600082015250565b7f646f6e2774206265206368656170210000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f746f6f206d616e79207065722074780000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f746f6f206d616e79207065722077616c6c657400000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f636f6d65206261636b20746f6d6f72726f770000000000000000000000000000600082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f77686f20796f75207472796e612074726f6c6c3f000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f776527726520736f6c64206f7574210000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6151aa81614760565b81146151b557600080fd5b50565b6151c181614772565b81146151cc57600080fd5b50565b6151d88161477e565b81146151e357600080fd5b50565b6151ef816147ca565b81146151fa57600080fd5b5056fea2646970667358221220f974faa959d754b09f82838ea73184485ddf5574f34bf84b0139623057c7a06364736f6c63430008070033

Deployed Bytecode Sourcemap

51019:4795:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37879:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39765:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41327:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40848:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36136:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53838:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42203:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54258:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36800:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51319:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54064:186;;;;;;;;;;;;;:::i;:::-;;42444:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52310:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51270:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51615:687;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36313:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51516:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52959:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52628:84;;;;;;;;;;;;;:::i;:::-;;39574:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51127:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38315:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11315:103;;;;;;;;;;;;;:::i;:::-;;52531:89;;;;;;;;;;;;;:::i;:::-;;51090:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10664:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53406:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54390:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39934:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51162:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41613:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42700:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52841:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53610:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53069:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51477:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51372:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51425:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52720:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53716:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41972:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11573:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51221:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37879:372;37981:4;38033:25;38018:40;;;:11;:40;;;;:105;;;;38090:33;38075:48;;;:11;:48;;;;38018:105;:172;;;;38155:35;38140:50;;;:11;:50;;;;38018:172;:225;;;;38207:36;38231:11;38207:23;:36::i;:::-;38018:225;37998:245;;37879:372;;;:::o;39765:100::-;39819:13;39852:5;39845:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39765:100;:::o;41327:214::-;41395:7;41423:16;41431:7;41423;:16::i;:::-;41415:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41509:15;:24;41525:7;41509:24;;;;;;;;;;;;;;;;;;;;;41502:31;;41327:214;;;:::o;40848:413::-;40921:13;40937:24;40953:7;40937:15;:24::i;:::-;40921:40;;40986:5;40980:11;;:2;:11;;;;40972:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41081:5;41065:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41090:37;41107:5;41114:12;:10;:12::i;:::-;41090:16;:37::i;:::-;41065:62;41043:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;41225:28;41234:2;41238:7;41247:5;41225:8;:28::i;:::-;40910:351;40848:413;;:::o;36136:100::-;36189:7;36216:12;;36209:19;;36136:100;:::o;53838:102::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53922:10:::1;53910:9;:22;;;;53838:102:::0;:::o;42203:170::-;42337:28;42347:4;42353:2;42357:7;42337:9;:28::i;:::-;42203:170;;;:::o;54258:124::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5646:1:::1;6244:7;;:19;;6236:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5646:1;6377:7;:18;;;;54346:28:::2;54365:8;54346:18;:28::i;:::-;5602:1:::1;6556:7;:22;;;;54258:124:::0;:::o;36800:1007::-;36889:7;36925:16;36935:5;36925:9;:16::i;:::-;36917:5;:24;36909:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36991:22;37016:13;:11;:13::i;:::-;36991:38;;37040:19;37070:25;37259:9;37254:466;37274:14;37270:1;:18;37254:466;;;37314:31;37348:11;:14;37360:1;37348:14;;;;;;;;;;;37314:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37411:1;37385:28;;:9;:14;;;:28;;;37381:111;;37458:9;:14;;;37438:34;;37381:111;37535:5;37514:26;;:17;:26;;;37510:195;;;37584:5;37569:11;:20;37565:85;;;37625:1;37618:8;;;;;;;;;37565:85;37672:13;;;;;;;37510:195;37295:425;37290:3;;;;;;;37254:466;;;;37743:56;;;;;;;;;;:::i;:::-;;;;;;;;36800:1007;;;;;:::o;51319:46::-;;;;:::o;54064:186::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5646:1:::1;6244:7;;:19;;6236:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5646:1;6377:7;:18;;;;54128:12:::2;54146:10;:15;;54169:21;54146:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54127:68;;;54214:7;54206:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;54116:134;5602:1:::1;6556:7;:22;;;;54064:186::o:0;42444:185::-;42582:39;42599:4;42605:2;42609:7;42582:39;;;;;;;;;;;;:16;:39::i;:::-;42444:185;;;:::o;52310:213::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52452:1:::1;52440:9;;:13;;;;:::i;:::-;52423:14;52407:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:46;52399:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;52486:29;52496:2;52500:14;52486:9;:29::i;:::-;52310:213:::0;;:::o;51270:42::-;;;;:::o;51615:687::-;51685:9;51697:5;;51685:17;;51761:1;51749:9;;:13;;;;:::i;:::-;51732:14;51716:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:46;51713:86;;;51786:1;51779:8;;51713:86;51831:9;51817:23;;:10;:23;;;51809:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;51914:4;51897:14;:21;;;;:::i;:::-;51884:9;:34;51876:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52002:1;51990:9;;:13;;;;:::i;:::-;51973:14;51957:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:46;51949:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;52042:11;;;;;;;;;;;52034:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;52140:12;;52122:14;52095:24;52108:10;52095:12;:24::i;:::-;:41;;;;:::i;:::-;:57;;52087:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;52223:1;52212:8;;:12;;;;:::i;:::-;52195:14;:29;52187:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52257:37;52267:10;52279:14;52257:9;:37::i;:::-;51674:628;51615:687;:::o;36313:187::-;36380:7;36416:13;:11;:13::i;:::-;36408:5;:21;36400:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36487:5;36480:12;;36313:187;;;:::o;51516:29::-;;;;;;;;;;;;;:::o;52959:102::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53045:8:::1;;53035:7;:18;;;;;;;:::i;:::-;;52959:102:::0;;:::o;53500:::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53584:10:::1;53572:9;:22;;;;53500:102:::0;:::o;52628:84::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52696:8:::1;;;;;;;;;;;52695:9;52684:8;;:20;;;;;;;;;;;;;;;;;;52628:84::o:0;39574:124::-;39638:7;39665:20;39677:7;39665:11;:20::i;:::-;:25;;;39658:32;;39574:124;;;:::o;51127:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38315:221::-;38379:7;38424:1;38407:19;;:5;:19;;;;38399:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;38500:12;:19;38513:5;38500:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38492:36;;38485:43;;38315:221;;;:::o;11315:103::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11380:30:::1;11407:1;11380:18;:30::i;:::-;11315:103::o:0;52531:89::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52601:11:::1;;;;;;;;;;;52600:12;52586:11;;:26;;;;;;;;;;;;;;;;;;52531:89::o:0;51090:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10664:87::-;10710:7;10737:6;;;;;;;;;;;10730:13;;10664:87;:::o;53406:86::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53478:6:::1;53470:5;:14;;;;53406:86:::0;:::o;54390:135::-;54456:21;;:::i;:::-;54497:20;54509:7;54497:11;:20::i;:::-;54490:27;;54390:135;;;:::o;39934:104::-;39990:13;40023:7;40016:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39934:104;:::o;51162:52::-;;;;:::o;41613:288::-;41720:12;:10;:12::i;:::-;41708:24;;:8;:24;;;;41700:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;41821:8;41776:18;:32;41795:12;:10;:12::i;:::-;41776:32;;;;;;;;;;;;;;;:42;41809:8;41776:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41874:8;41845:48;;41860:12;:10;:12::i;:::-;41845:48;;;41884:8;41845:48;;;;;;:::i;:::-;;;;;;;;41613:288;;:::o;42700:355::-;42859:28;42869:4;42875:2;42879:7;42859:9;:28::i;:::-;42920:48;42943:4;42949:2;42953:7;42962:5;42920:22;:48::i;:::-;42898:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;42700:355;;;;:::o;52841:110::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52933:10:::1;;52921:9;:22;;;;;;;:::i;:::-;;52841:110:::0;;:::o;53610:98::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53691:9:::1;53680:8;:20;;;;53610:98:::0;:::o;53069:329::-;53134:13;53168:16;53176:7;53168;:16::i;:::-;53160:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;53226:8;;;;;;;;;;;53222:142;;;53283:1;53264:7;53258:21;;;;;:::i;:::-;;;:26;;:94;;;;;;;;;;;;;;;;;53311:7;53320:25;53337:7;53320:16;:25::i;:::-;53294:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53258:94;53251:101;;;;53222:142;53381:9;53374:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53069:329;;;;:::o;51477:32::-;;;;;;;;;;;;;:::o;51372:46::-;;;;:::o;51425:45::-;;;;:::o;52720:113::-;52778:7;52805:20;52819:5;52805:13;:20::i;:::-;52798:27;;52720:113;;;:::o;53716:114::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53809:13:::1;53794:12;:28;;;;53716:114:::0;:::o;41972:164::-;42069:4;42093:18;:25;42112:5;42093:25;;;;;;;;;;;;;;;:35;42119:8;42093:35;;;;;;;;;;;;;;;;;;;;;;;;;42086:42;;41972:164;;;;:::o;11573:201::-;10895:12;:10;:12::i;:::-;10884:23;;:7;:5;:7::i;:::-;:23;;;10876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11682:1:::1;11662:22;;:8;:22;;;;11654:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11738:28;11757:8;11738:18;:28::i;:::-;11573:201:::0;:::o;51221:42::-;;;;:::o;27425:157::-;27510:4;27549:25;27534:40;;;:11;:40;;;;27527:47;;27425:157;;;:::o;43310:111::-;43367:4;43401:12;;43391:7;:22;43384:29;;43310:111;;;:::o;9392:98::-;9445:7;9472:10;9465:17;;9392:98;:::o;48230:196::-;48372:2;48345:15;:24;48361:7;48345:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;48410:7;48406:2;48390:28;;48399:5;48390:28;;;;;;;;;;;;48230:196;;;:::o;46110:2002::-;46225:35;46263:20;46275:7;46263:11;:20::i;:::-;46225:58;;46296:22;46338:13;:18;;;46322:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;46397:12;:10;:12::i;:::-;46373:36;;:20;46385:7;46373:11;:20::i;:::-;:36;;;46322:87;:154;;;;46426:50;46443:13;:18;;;46463:12;:10;:12::i;:::-;46426:16;:50::i;:::-;46322:154;46296:181;;46498:17;46490:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;46613:4;46591:26;;:13;:18;;;:26;;;46583:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;46693:1;46679:16;;:2;:16;;;;46671:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46750:43;46772:4;46778:2;46782:7;46791:1;46750:21;:43::i;:::-;46858:49;46875:1;46879:7;46888:13;:18;;;46858:8;:49::i;:::-;47233:1;47203:12;:18;47216:4;47203:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47277:1;47249:12;:16;47262:2;47249:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47323:2;47295:11;:20;47307:7;47295:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;47385:15;47340:11;:20;47352:7;47340:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;47653:19;47685:1;47675:7;:11;47653:33;;47746:1;47705:43;;:11;:24;47717:11;47705:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;47701:295;;;47773:20;47781:11;47773:7;:20::i;:::-;47769:212;;;47850:13;:18;;;47818:11;:24;47830:11;47818:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;47933:13;:28;;;47891:11;:24;47903:11;47891:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;47769:212;47701:295;47178:829;48043:7;48039:2;48024:27;;48033:4;48024:27;;;;;;;;;;;;48062:42;48083:4;48089:2;48093:7;48102:1;48062:20;:42::i;:::-;46214:1898;;46110:2002;;;:::o;54637:1174::-;54723:1;54711:8;:13;;54703:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54788:1;54772:12;;:17;;54764:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54825:33;54861:24;;54825:60;;54932:12;;54904:25;:40;54896:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55123:16;55181:1;55170:8;55142:25;:36;:40;55123:59;;55279:12;;55275:1;55264:8;:12;:27;55260:95;;;55338:1;55323:12;;:16;55312:27;;55260:95;55376:9;55388:25;55376:37;;55371:366;55420:8;55415:1;:13;55371:366;;55489:1;55458:33;;:11;:14;55470:1;55458:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;55454:268;;;55516:31;55550:14;55562:1;55550:11;:14::i;:::-;55516:48;;55609:9;:14;;;55587:11;:14;55599:1;55587:14;;;;;;;;;;;:19;;;:36;;;;;;;;;;;;;;;;;;55678:9;:24;;;55646:11;:14;55658:1;55646:14;;;;;;;;;;;:29;;;:56;;;;;;;;;;;;;;;;;;55493:229;55454:268;55430:3;;;;;;;55371:366;;;;55791:1;55780:8;:12;55753:24;:39;;;;55098:706;54692:1119;54637:1174;:::o;43429:104::-;43498:27;43508:2;43512:8;43498:27;;;;;;;;;;;;:9;:27::i;:::-;43429:104;;:::o;38975:537::-;39036:21;;:::i;:::-;39078:16;39086:7;39078;:16::i;:::-;39070:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39184:12;39199:7;39184:22;;39179:245;39216:1;39208:4;:9;39179:245;;39246:31;39280:11;:17;39292:4;39280:17;;;;;;;;;;;39246:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39346:1;39320:28;;:9;:14;;;:28;;;39316:93;;39380:9;39373:16;;;;;;39316:93;39227:197;39219:6;;;;;;;;39179:245;;;;39447:57;;;;;;;;;;:::i;:::-;;;;;;;;38975:537;;;;:::o;11934:191::-;12008:16;12027:6;;;;;;;;;;;12008:25;;12053:8;12044:6;;:17;;;;;;;;;;;;;;;;;;12108:8;12077:40;;12098:8;12077:40;;;;;;;;;;;;11997:128;11934:191;:::o;48991:804::-;49146:4;49167:15;:2;:13;;;:15::i;:::-;49163:625;;;49219:2;49203:36;;;49240:12;:10;:12::i;:::-;49254:4;49260:7;49269:5;49203:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49199:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49466:1;49449:6;:13;:18;49445:273;;;49492:61;;;;;;;;;;:::i;:::-;;;;;;;;49445:273;49668:6;49662:13;49653:6;49649:2;49645:15;49638:38;49199:534;49336:45;;;49326:55;;;:6;:55;;;;49319:62;;;;;49163:625;49772:4;49765:11;;48991:804;;;;;;;:::o;6956:723::-;7012:13;7242:1;7233:5;:10;7229:53;;;7260:10;;;;;;;;;;;;;;;;;;;;;7229:53;7292:12;7307:5;7292:20;;7323:14;7348:78;7363:1;7355:4;:9;7348:78;;7381:8;;;;;:::i;:::-;;;;7412:2;7404:10;;;;;:::i;:::-;;;7348:78;;;7436:19;7468:6;7458:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7436:39;;7486:154;7502:1;7493:5;:10;7486:154;;7530:1;7520:11;;;;;:::i;:::-;;;7597:2;7589:5;:10;;;;:::i;:::-;7576:2;:24;;;;:::i;:::-;7563:39;;7546:6;7553;7546:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7626:2;7617:11;;;;;:::i;:::-;;;7486:154;;;7664:6;7650:21;;;;;6956:723;;;;:::o;38544:229::-;38605:7;38650:1;38633:19;;:5;:19;;;;38625:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38732:12;:19;38745:5;38732:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;38724:41;;38717:48;;38544:229;;;:::o;50283:159::-;;;;;:::o;50854:158::-;;;;;:::o;43896:163::-;44019:32;44025:2;44029:8;44039:5;44046:4;44019:5;:32::i;:::-;43896:163;;;:::o;13363:326::-;13423:4;13680:1;13658:7;:19;;;:23;13651:30;;13363:326;;;:::o;44318:1538::-;44457:20;44480:12;;44457:35;;44525:1;44511:16;;:2;:16;;;;44503:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44596:1;44584:8;:13;;44576:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44655:61;44685:1;44689:2;44693:12;44707:8;44655:21;:61::i;:::-;45030:8;44994:12;:16;45007:2;44994:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45095:8;45054:12;:16;45067:2;45054:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45154:2;45121:11;:25;45133:12;45121:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45221:15;45171:11;:25;45183:12;45171:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;45254:20;45277:12;45254:35;;45311:9;45306:415;45326:8;45322:1;:12;45306:415;;;45390:12;45386:2;45365:38;;45382:1;45365:38;;;;;;;;;;;;45426:4;45422:249;;;45489:59;45520:1;45524:2;45528:12;45542:5;45489:22;:59::i;:::-;45455:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;45422:249;45691:14;;;;;;;45336:3;;;;;;;45306:415;;;;45752:12;45737;:27;;;;44969:807;45788:60;45817:1;45821:2;45825:12;45839:8;45788:20;:60::i;:::-;44446:1410;44318:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:108::-;7050:24;7068:5;7050:24;:::i;:::-;7045:3;7038:37;6973:108;;:::o;7087:118::-;7174:24;7192:5;7174:24;:::i;:::-;7169:3;7162:37;7087:118;;:::o;7211:109::-;7292:21;7307:5;7292:21;:::i;:::-;7287:3;7280:34;7211:109;;:::o;7326:360::-;7412:3;7440:38;7472:5;7440:38;:::i;:::-;7494:70;7557:6;7552:3;7494:70;:::i;:::-;7487:77;;7573:52;7618:6;7613:3;7606:4;7599:5;7595:16;7573:52;:::i;:::-;7650:29;7672:6;7650:29;:::i;:::-;7645:3;7641:39;7634:46;;7416:270;7326:360;;;;:::o;7692:364::-;7780:3;7808:39;7841:5;7808:39;:::i;:::-;7863:71;7927:6;7922:3;7863:71;:::i;:::-;7856:78;;7943:52;7988:6;7983:3;7976:4;7969:5;7965:16;7943:52;:::i;:::-;8020:29;8042:6;8020:29;:::i;:::-;8015:3;8011:39;8004:46;;7784:272;7692:364;;;;:::o;8062:377::-;8168:3;8196:39;8229:5;8196:39;:::i;:::-;8251:89;8333:6;8328:3;8251:89;:::i;:::-;8244:96;;8349:52;8394:6;8389:3;8382:4;8375:5;8371:16;8349:52;:::i;:::-;8426:6;8421:3;8417:16;8410:23;;8172:267;8062:377;;;;:::o;8469:845::-;8572:3;8609:5;8603:12;8638:36;8664:9;8638:36;:::i;:::-;8690:89;8772:6;8767:3;8690:89;:::i;:::-;8683:96;;8810:1;8799:9;8795:17;8826:1;8821:137;;;;8972:1;8967:341;;;;8788:520;;8821:137;8905:4;8901:9;8890;8886:25;8881:3;8874:38;8941:6;8936:3;8932:16;8925:23;;8821:137;;8967:341;9034:38;9066:5;9034:38;:::i;:::-;9094:1;9108:154;9122:6;9119:1;9116:13;9108:154;;;9196:7;9190:14;9186:1;9181:3;9177:11;9170:35;9246:1;9237:7;9233:15;9222:26;;9144:4;9141:1;9137:12;9132:17;;9108:154;;;9291:6;9286:3;9282:16;9275:23;;8974:334;;8788:520;;8576:738;;8469:845;;;;:::o;9320:366::-;9462:3;9483:67;9547:2;9542:3;9483:67;:::i;:::-;9476:74;;9559:93;9648:3;9559:93;:::i;:::-;9677:2;9672:3;9668:12;9661:19;;9320:366;;;:::o;9692:::-;9834:3;9855:67;9919:2;9914:3;9855:67;:::i;:::-;9848:74;;9931:93;10020:3;9931:93;:::i;:::-;10049:2;10044:3;10040:12;10033:19;;9692:366;;;:::o;10064:::-;10206:3;10227:67;10291:2;10286:3;10227:67;:::i;:::-;10220:74;;10303:93;10392:3;10303:93;:::i;:::-;10421:2;10416:3;10412:12;10405:19;;10064:366;;;:::o;10436:::-;10578:3;10599:67;10663:2;10658:3;10599:67;:::i;:::-;10592:74;;10675:93;10764:3;10675:93;:::i;:::-;10793:2;10788:3;10784:12;10777:19;;10436:366;;;:::o;10808:::-;10950:3;10971:67;11035:2;11030:3;10971:67;:::i;:::-;10964:74;;11047:93;11136:3;11047:93;:::i;:::-;11165:2;11160:3;11156:12;11149:19;;10808:366;;;:::o;11180:::-;11322:3;11343:67;11407:2;11402:3;11343:67;:::i;:::-;11336:74;;11419:93;11508:3;11419:93;:::i;:::-;11537:2;11532:3;11528:12;11521:19;;11180:366;;;:::o;11552:::-;11694:3;11715:67;11779:2;11774:3;11715:67;:::i;:::-;11708:74;;11791:93;11880:3;11791:93;:::i;:::-;11909:2;11904:3;11900:12;11893:19;;11552:366;;;:::o;11924:::-;12066:3;12087:67;12151:2;12146:3;12087:67;:::i;:::-;12080:74;;12163:93;12252:3;12163:93;:::i;:::-;12281:2;12276:3;12272:12;12265:19;;11924:366;;;:::o;12296:::-;12438:3;12459:67;12523:2;12518:3;12459:67;:::i;:::-;12452:74;;12535:93;12624:3;12535:93;:::i;:::-;12653:2;12648:3;12644:12;12637:19;;12296:366;;;:::o;12668:::-;12810:3;12831:67;12895:2;12890:3;12831:67;:::i;:::-;12824:74;;12907:93;12996:3;12907:93;:::i;:::-;13025:2;13020:3;13016:12;13009:19;;12668:366;;;:::o;13040:::-;13182:3;13203:67;13267:2;13262:3;13203:67;:::i;:::-;13196:74;;13279:93;13368:3;13279:93;:::i;:::-;13397:2;13392:3;13388:12;13381:19;;13040:366;;;:::o;13412:::-;13554:3;13575:67;13639:2;13634:3;13575:67;:::i;:::-;13568:74;;13651:93;13740:3;13651:93;:::i;:::-;13769:2;13764:3;13760:12;13753:19;;13412:366;;;:::o;13784:::-;13926:3;13947:67;14011:2;14006:3;13947:67;:::i;:::-;13940:74;;14023:93;14112:3;14023:93;:::i;:::-;14141:2;14136:3;14132:12;14125:19;;13784:366;;;:::o;14156:::-;14298:3;14319:67;14383:2;14378:3;14319:67;:::i;:::-;14312:74;;14395:93;14484:3;14395:93;:::i;:::-;14513:2;14508:3;14504:12;14497:19;;14156:366;;;:::o;14528:::-;14670:3;14691:67;14755:2;14750:3;14691:67;:::i;:::-;14684:74;;14767:93;14856:3;14767:93;:::i;:::-;14885:2;14880:3;14876:12;14869:19;;14528:366;;;:::o;14900:::-;15042:3;15063:67;15127:2;15122:3;15063:67;:::i;:::-;15056:74;;15139:93;15228:3;15139:93;:::i;:::-;15257:2;15252:3;15248:12;15241:19;;14900:366;;;:::o;15272:::-;15414:3;15435:67;15499:2;15494:3;15435:67;:::i;:::-;15428:74;;15511:93;15600:3;15511:93;:::i;:::-;15629:2;15624:3;15620:12;15613:19;;15272:366;;;:::o;15644:::-;15786:3;15807:67;15871:2;15866:3;15807:67;:::i;:::-;15800:74;;15883:93;15972:3;15883:93;:::i;:::-;16001:2;15996:3;15992:12;15985:19;;15644:366;;;:::o;16016:::-;16158:3;16179:67;16243:2;16238:3;16179:67;:::i;:::-;16172:74;;16255:93;16344:3;16255:93;:::i;:::-;16373:2;16368:3;16364:12;16357:19;;16016:366;;;:::o;16388:::-;16530:3;16551:67;16615:2;16610:3;16551:67;:::i;:::-;16544:74;;16627:93;16716:3;16627:93;:::i;:::-;16745:2;16740:3;16736:12;16729:19;;16388:366;;;:::o;16760:398::-;16919:3;16940:83;17021:1;17016:3;16940:83;:::i;:::-;16933:90;;17032:93;17121:3;17032:93;:::i;:::-;17150:1;17145:3;17141:11;17134:18;;16760:398;;;:::o;17164:366::-;17306:3;17327:67;17391:2;17386:3;17327:67;:::i;:::-;17320:74;;17403:93;17492:3;17403:93;:::i;:::-;17521:2;17516:3;17512:12;17505:19;;17164:366;;;:::o;17536:::-;17678:3;17699:67;17763:2;17758:3;17699:67;:::i;:::-;17692:74;;17775:93;17864:3;17775:93;:::i;:::-;17893:2;17888:3;17884:12;17877:19;;17536:366;;;:::o;17908:::-;18050:3;18071:67;18135:2;18130:3;18071:67;:::i;:::-;18064:74;;18147:93;18236:3;18147:93;:::i;:::-;18265:2;18260:3;18256:12;18249:19;;17908:366;;;:::o;18280:::-;18422:3;18443:67;18507:2;18502:3;18443:67;:::i;:::-;18436:74;;18519:93;18608:3;18519:93;:::i;:::-;18637:2;18632:3;18628:12;18621:19;;18280:366;;;:::o;18652:::-;18794:3;18815:67;18879:2;18874:3;18815:67;:::i;:::-;18808:74;;18891:93;18980:3;18891:93;:::i;:::-;19009:2;19004:3;19000:12;18993:19;;18652:366;;;:::o;19024:::-;19166:3;19187:67;19251:2;19246:3;19187:67;:::i;:::-;19180:74;;19263:93;19352:3;19263:93;:::i;:::-;19381:2;19376:3;19372:12;19365:19;;19024:366;;;:::o;19396:::-;19538:3;19559:67;19623:2;19618:3;19559:67;:::i;:::-;19552:74;;19635:93;19724:3;19635:93;:::i;:::-;19753:2;19748:3;19744:12;19737:19;;19396:366;;;:::o;19768:::-;19910:3;19931:67;19995:2;19990:3;19931:67;:::i;:::-;19924:74;;20007:93;20096:3;20007:93;:::i;:::-;20125:2;20120:3;20116:12;20109:19;;19768:366;;;:::o;20140:::-;20282:3;20303:67;20367:2;20362:3;20303:67;:::i;:::-;20296:74;;20379:93;20468:3;20379:93;:::i;:::-;20497:2;20492:3;20488:12;20481:19;;20140:366;;;:::o;20512:::-;20654:3;20675:67;20739:2;20734:3;20675:67;:::i;:::-;20668:74;;20751:93;20840:3;20751:93;:::i;:::-;20869:2;20864:3;20860:12;20853:19;;20512:366;;;:::o;20884:::-;21026:3;21047:67;21111:2;21106:3;21047:67;:::i;:::-;21040:74;;21123:93;21212:3;21123:93;:::i;:::-;21241:2;21236:3;21232:12;21225:19;;20884:366;;;:::o;21326:529::-;21487:4;21482:3;21478:14;21574:4;21567:5;21563:16;21557:23;21593:63;21650:4;21645:3;21641:14;21627:12;21593:63;:::i;:::-;21502:164;21758:4;21751:5;21747:16;21741:23;21777:61;21832:4;21827:3;21823:14;21809:12;21777:61;:::i;:::-;21676:172;21456:399;21326:529;;:::o;21861:118::-;21948:24;21966:5;21948:24;:::i;:::-;21943:3;21936:37;21861:118;;:::o;21985:105::-;22060:23;22077:5;22060:23;:::i;:::-;22055:3;22048:36;21985:105;;:::o;22096:429::-;22273:3;22295:92;22383:3;22374:6;22295:92;:::i;:::-;22288:99;;22404:95;22495:3;22486:6;22404:95;:::i;:::-;22397:102;;22516:3;22509:10;;22096:429;;;;;:::o;22531:379::-;22715:3;22737:147;22880:3;22737:147;:::i;:::-;22730:154;;22901:3;22894:10;;22531:379;;;:::o;22916:222::-;23009:4;23047:2;23036:9;23032:18;23024:26;;23060:71;23128:1;23117:9;23113:17;23104:6;23060:71;:::i;:::-;22916:222;;;;:::o;23144:640::-;23339:4;23377:3;23366:9;23362:19;23354:27;;23391:71;23459:1;23448:9;23444:17;23435:6;23391:71;:::i;:::-;23472:72;23540:2;23529:9;23525:18;23516:6;23472:72;:::i;:::-;23554;23622:2;23611:9;23607:18;23598:6;23554:72;:::i;:::-;23673:9;23667:4;23663:20;23658:2;23647:9;23643:18;23636:48;23701:76;23772:4;23763:6;23701:76;:::i;:::-;23693:84;;23144:640;;;;;;;:::o;23790:210::-;23877:4;23915:2;23904:9;23900:18;23892:26;;23928:65;23990:1;23979:9;23975:17;23966:6;23928:65;:::i;:::-;23790:210;;;;:::o;24006:313::-;24119:4;24157:2;24146:9;24142:18;24134:26;;24206:9;24200:4;24196:20;24192:1;24181:9;24177:17;24170:47;24234:78;24307:4;24298:6;24234:78;:::i;:::-;24226:86;;24006:313;;;;:::o;24325:419::-;24491:4;24529:2;24518:9;24514:18;24506:26;;24578:9;24572:4;24568:20;24564:1;24553:9;24549:17;24542:47;24606:131;24732:4;24606:131;:::i;:::-;24598:139;;24325:419;;;:::o;24750:::-;24916:4;24954:2;24943:9;24939:18;24931:26;;25003:9;24997:4;24993:20;24989:1;24978:9;24974:17;24967:47;25031:131;25157:4;25031:131;:::i;:::-;25023:139;;24750:419;;;:::o;25175:::-;25341:4;25379:2;25368:9;25364:18;25356:26;;25428:9;25422:4;25418:20;25414:1;25403:9;25399:17;25392:47;25456:131;25582:4;25456:131;:::i;:::-;25448:139;;25175:419;;;:::o;25600:::-;25766:4;25804:2;25793:9;25789:18;25781:26;;25853:9;25847:4;25843:20;25839:1;25828:9;25824:17;25817:47;25881:131;26007:4;25881:131;:::i;:::-;25873:139;;25600:419;;;:::o;26025:::-;26191:4;26229:2;26218:9;26214:18;26206:26;;26278:9;26272:4;26268:20;26264:1;26253:9;26249:17;26242:47;26306:131;26432:4;26306:131;:::i;:::-;26298:139;;26025:419;;;:::o;26450:::-;26616:4;26654:2;26643:9;26639:18;26631:26;;26703:9;26697:4;26693:20;26689:1;26678:9;26674:17;26667:47;26731:131;26857:4;26731:131;:::i;:::-;26723:139;;26450:419;;;:::o;26875:::-;27041:4;27079:2;27068:9;27064:18;27056:26;;27128:9;27122:4;27118:20;27114:1;27103:9;27099:17;27092:47;27156:131;27282:4;27156:131;:::i;:::-;27148:139;;26875:419;;;:::o;27300:::-;27466:4;27504:2;27493:9;27489:18;27481:26;;27553:9;27547:4;27543:20;27539:1;27528:9;27524:17;27517:47;27581:131;27707:4;27581:131;:::i;:::-;27573:139;;27300:419;;;:::o;27725:::-;27891:4;27929:2;27918:9;27914:18;27906:26;;27978:9;27972:4;27968:20;27964:1;27953:9;27949:17;27942:47;28006:131;28132:4;28006:131;:::i;:::-;27998:139;;27725:419;;;:::o;28150:::-;28316:4;28354:2;28343:9;28339:18;28331:26;;28403:9;28397:4;28393:20;28389:1;28378:9;28374:17;28367:47;28431:131;28557:4;28431:131;:::i;:::-;28423:139;;28150:419;;;:::o;28575:::-;28741:4;28779:2;28768:9;28764:18;28756:26;;28828:9;28822:4;28818:20;28814:1;28803:9;28799:17;28792:47;28856:131;28982:4;28856:131;:::i;:::-;28848:139;;28575:419;;;:::o;29000:::-;29166:4;29204:2;29193:9;29189:18;29181:26;;29253:9;29247:4;29243:20;29239:1;29228:9;29224:17;29217:47;29281:131;29407:4;29281:131;:::i;:::-;29273:139;;29000:419;;;:::o;29425:::-;29591:4;29629:2;29618:9;29614:18;29606:26;;29678:9;29672:4;29668:20;29664:1;29653:9;29649:17;29642:47;29706:131;29832:4;29706:131;:::i;:::-;29698:139;;29425:419;;;:::o;29850:::-;30016:4;30054:2;30043:9;30039:18;30031:26;;30103:9;30097:4;30093:20;30089:1;30078:9;30074:17;30067:47;30131:131;30257:4;30131:131;:::i;:::-;30123:139;;29850:419;;;:::o;30275:::-;30441:4;30479:2;30468:9;30464:18;30456:26;;30528:9;30522:4;30518:20;30514:1;30503:9;30499:17;30492:47;30556:131;30682:4;30556:131;:::i;:::-;30548:139;;30275:419;;;:::o;30700:::-;30866:4;30904:2;30893:9;30889:18;30881:26;;30953:9;30947:4;30943:20;30939:1;30928:9;30924:17;30917:47;30981:131;31107:4;30981:131;:::i;:::-;30973:139;;30700:419;;;:::o;31125:::-;31291:4;31329:2;31318:9;31314:18;31306:26;;31378:9;31372:4;31368:20;31364:1;31353:9;31349:17;31342:47;31406:131;31532:4;31406:131;:::i;:::-;31398:139;;31125:419;;;:::o;31550:::-;31716:4;31754:2;31743:9;31739:18;31731:26;;31803:9;31797:4;31793:20;31789:1;31778:9;31774:17;31767:47;31831:131;31957:4;31831:131;:::i;:::-;31823:139;;31550:419;;;:::o;31975:::-;32141:4;32179:2;32168:9;32164:18;32156:26;;32228:9;32222:4;32218:20;32214:1;32203:9;32199:17;32192:47;32256:131;32382:4;32256:131;:::i;:::-;32248:139;;31975:419;;;:::o;32400:::-;32566:4;32604:2;32593:9;32589:18;32581:26;;32653:9;32647:4;32643:20;32639:1;32628:9;32624:17;32617:47;32681:131;32807:4;32681:131;:::i;:::-;32673:139;;32400:419;;;:::o;32825:::-;32991:4;33029:2;33018:9;33014:18;33006:26;;33078:9;33072:4;33068:20;33064:1;33053:9;33049:17;33042:47;33106:131;33232:4;33106:131;:::i;:::-;33098:139;;32825:419;;;:::o;33250:::-;33416:4;33454:2;33443:9;33439:18;33431:26;;33503:9;33497:4;33493:20;33489:1;33478:9;33474:17;33467:47;33531:131;33657:4;33531:131;:::i;:::-;33523:139;;33250:419;;;:::o;33675:::-;33841:4;33879:2;33868:9;33864:18;33856:26;;33928:9;33922:4;33918:20;33914:1;33903:9;33899:17;33892:47;33956:131;34082:4;33956:131;:::i;:::-;33948:139;;33675:419;;;:::o;34100:::-;34266:4;34304:2;34293:9;34289:18;34281:26;;34353:9;34347:4;34343:20;34339:1;34328:9;34324:17;34317:47;34381:131;34507:4;34381:131;:::i;:::-;34373:139;;34100:419;;;:::o;34525:::-;34691:4;34729:2;34718:9;34714:18;34706:26;;34778:9;34772:4;34768:20;34764:1;34753:9;34749:17;34742:47;34806:131;34932:4;34806:131;:::i;:::-;34798:139;;34525:419;;;:::o;34950:::-;35116:4;35154:2;35143:9;35139:18;35131:26;;35203:9;35197:4;35193:20;35189:1;35178:9;35174:17;35167:47;35231:131;35357:4;35231:131;:::i;:::-;35223:139;;34950:419;;;:::o;35375:::-;35541:4;35579:2;35568:9;35564:18;35556:26;;35628:9;35622:4;35618:20;35614:1;35603:9;35599:17;35592:47;35656:131;35782:4;35656:131;:::i;:::-;35648:139;;35375:419;;;:::o;35800:::-;35966:4;36004:2;35993:9;35989:18;35981:26;;36053:9;36047:4;36043:20;36039:1;36028:9;36024:17;36017:47;36081:131;36207:4;36081:131;:::i;:::-;36073:139;;35800:419;;;:::o;36225:::-;36391:4;36429:2;36418:9;36414:18;36406:26;;36478:9;36472:4;36468:20;36464:1;36453:9;36449:17;36442:47;36506:131;36632:4;36506:131;:::i;:::-;36498:139;;36225:419;;;:::o;36650:::-;36816:4;36854:2;36843:9;36839:18;36831:26;;36903:9;36897:4;36893:20;36889:1;36878:9;36874:17;36867:47;36931:131;37057:4;36931:131;:::i;:::-;36923:139;;36650:419;;;:::o;37075:::-;37241:4;37279:2;37268:9;37264:18;37256:26;;37328:9;37322:4;37318:20;37314:1;37303:9;37299:17;37292:47;37356:131;37482:4;37356:131;:::i;:::-;37348:139;;37075:419;;;:::o;37500:350::-;37657:4;37695:2;37684:9;37680:18;37672:26;;37708:135;37840:1;37829:9;37825:17;37816:6;37708:135;:::i;:::-;37500:350;;;;:::o;37856:222::-;37949:4;37987:2;37976:9;37972:18;37964:26;;38000:71;38068:1;38057:9;38053:17;38044:6;38000:71;:::i;:::-;37856:222;;;;:::o;38084:129::-;38118:6;38145:20;;:::i;:::-;38135:30;;38174:33;38202:4;38194:6;38174:33;:::i;:::-;38084:129;;;:::o;38219:75::-;38252:6;38285:2;38279:9;38269:19;;38219:75;:::o;38300:307::-;38361:4;38451:18;38443:6;38440:30;38437:56;;;38473:18;;:::i;:::-;38437:56;38511:29;38533:6;38511:29;:::i;:::-;38503:37;;38595:4;38589;38585:15;38577:23;;38300:307;;;:::o;38613:141::-;38662:4;38685:3;38677:11;;38708:3;38705:1;38698:14;38742:4;38739:1;38729:18;38721:26;;38613:141;;;:::o;38760:98::-;38811:6;38845:5;38839:12;38829:22;;38760:98;;;:::o;38864:99::-;38916:6;38950:5;38944:12;38934:22;;38864:99;;;:::o;38969:168::-;39052:11;39086:6;39081:3;39074:19;39126:4;39121:3;39117:14;39102:29;;38969:168;;;;:::o;39143:147::-;39244:11;39281:3;39266:18;;39143:147;;;;:::o;39296:169::-;39380:11;39414:6;39409:3;39402:19;39454:4;39449:3;39445:14;39430:29;;39296:169;;;;:::o;39471:148::-;39573:11;39610:3;39595:18;;39471:148;;;;:::o;39625:305::-;39665:3;39684:20;39702:1;39684:20;:::i;:::-;39679:25;;39718:20;39736:1;39718:20;:::i;:::-;39713:25;;39872:1;39804:66;39800:74;39797:1;39794:81;39791:107;;;39878:18;;:::i;:::-;39791:107;39922:1;39919;39915:9;39908:16;;39625:305;;;;:::o;39936:185::-;39976:1;39993:20;40011:1;39993:20;:::i;:::-;39988:25;;40027:20;40045:1;40027:20;:::i;:::-;40022:25;;40066:1;40056:35;;40071:18;;:::i;:::-;40056:35;40113:1;40110;40106:9;40101:14;;39936:185;;;;:::o;40127:348::-;40167:7;40190:20;40208:1;40190:20;:::i;:::-;40185:25;;40224:20;40242:1;40224:20;:::i;:::-;40219:25;;40412:1;40344:66;40340:74;40337:1;40334:81;40329:1;40322:9;40315:17;40311:105;40308:131;;;40419:18;;:::i;:::-;40308:131;40467:1;40464;40460:9;40449:20;;40127:348;;;;:::o;40481:191::-;40521:4;40541:20;40559:1;40541:20;:::i;:::-;40536:25;;40575:20;40593:1;40575:20;:::i;:::-;40570:25;;40614:1;40611;40608:8;40605:34;;;40619:18;;:::i;:::-;40605:34;40664:1;40661;40657:9;40649:17;;40481:191;;;;:::o;40678:96::-;40715:7;40744:24;40762:5;40744:24;:::i;:::-;40733:35;;40678:96;;;:::o;40780:90::-;40814:7;40857:5;40850:13;40843:21;40832:32;;40780:90;;;:::o;40876:149::-;40912:7;40952:66;40945:5;40941:78;40930:89;;40876:149;;;:::o;41031:126::-;41068:7;41108:42;41101:5;41097:54;41086:65;;41031:126;;;:::o;41163:77::-;41200:7;41229:5;41218:16;;41163:77;;;:::o;41246:101::-;41282:7;41322:18;41315:5;41311:30;41300:41;;41246:101;;;:::o;41353:154::-;41437:6;41432:3;41427;41414:30;41499:1;41490:6;41485:3;41481:16;41474:27;41353:154;;;:::o;41513:307::-;41581:1;41591:113;41605:6;41602:1;41599:13;41591:113;;;41690:1;41685:3;41681:11;41675:18;41671:1;41666:3;41662:11;41655:39;41627:2;41624:1;41620:10;41615:15;;41591:113;;;41722:6;41719:1;41716:13;41713:101;;;41802:1;41793:6;41788:3;41784:16;41777:27;41713:101;41562:258;41513:307;;;:::o;41826:320::-;41870:6;41907:1;41901:4;41897:12;41887:22;;41954:1;41948:4;41944:12;41975:18;41965:81;;42031:4;42023:6;42019:17;42009:27;;41965:81;42093:2;42085:6;42082:14;42062:18;42059:38;42056:84;;;42112:18;;:::i;:::-;42056:84;41877:269;41826:320;;;:::o;42152:281::-;42235:27;42257:4;42235:27;:::i;:::-;42227:6;42223:40;42365:6;42353:10;42350:22;42329:18;42317:10;42314:34;42311:62;42308:88;;;42376:18;;:::i;:::-;42308:88;42416:10;42412:2;42405:22;42195:238;42152:281;;:::o;42439:233::-;42478:3;42501:24;42519:5;42501:24;:::i;:::-;42492:33;;42547:66;42540:5;42537:77;42534:103;;;42617:18;;:::i;:::-;42534:103;42664:1;42657:5;42653:13;42646:20;;42439:233;;;:::o;42678:176::-;42710:1;42727:20;42745:1;42727:20;:::i;:::-;42722:25;;42761:20;42779:1;42761:20;:::i;:::-;42756:25;;42800:1;42790:35;;42805:18;;:::i;:::-;42790:35;42846:1;42843;42839:9;42834:14;;42678:176;;;;:::o;42860:180::-;42908:77;42905:1;42898:88;43005:4;43002:1;42995:15;43029:4;43026:1;43019:15;43046:180;43094:77;43091:1;43084:88;43191:4;43188:1;43181:15;43215:4;43212:1;43205:15;43232:180;43280:77;43277:1;43270:88;43377:4;43374:1;43367:15;43401:4;43398:1;43391:15;43418:180;43466:77;43463:1;43456:88;43563:4;43560:1;43553:15;43587:4;43584:1;43577:15;43604:180;43652:77;43649:1;43642:88;43749:4;43746:1;43739:15;43773:4;43770:1;43763:15;43790:117;43899:1;43896;43889:12;43913:117;44022:1;44019;44012:12;44036:117;44145:1;44142;44135:12;44159:117;44268:1;44265;44258:12;44282:117;44391:1;44388;44381:12;44405:117;44514:1;44511;44504:12;44528:102;44569:6;44620:2;44616:7;44611:2;44604:5;44600:14;44596:28;44586:38;;44528:102;;;:::o;44636:221::-;44776:34;44772:1;44764:6;44760:14;44753:58;44845:4;44840:2;44832:6;44828:15;44821:29;44636:221;:::o;44863:225::-;45003:34;44999:1;44991:6;44987:14;44980:58;45072:8;45067:2;45059:6;45055:15;45048:33;44863:225;:::o;45094:229::-;45234:34;45230:1;45222:6;45218:14;45211:58;45303:12;45298:2;45290:6;45286:15;45279:37;45094:229;:::o;45329:170::-;45469:22;45465:1;45457:6;45453:14;45446:46;45329:170;:::o;45505:::-;45645:22;45641:1;45633:6;45629:14;45622:46;45505:170;:::o;45681:222::-;45821:34;45817:1;45809:6;45805:14;45798:58;45890:5;45885:2;45877:6;45873:15;45866:30;45681:222;:::o;45909:224::-;46049:34;46045:1;46037:6;46033:14;46026:58;46118:7;46113:2;46105:6;46101:15;46094:32;45909:224;:::o;46139:236::-;46279:34;46275:1;46267:6;46263:14;46256:58;46348:19;46343:2;46335:6;46331:15;46324:44;46139:236;:::o;46381:178::-;46521:30;46517:1;46509:6;46505:14;46498:54;46381:178;:::o;46565:165::-;46705:17;46701:1;46693:6;46689:14;46682:41;46565:165;:::o;46736:244::-;46876:34;46872:1;46864:6;46860:14;46853:58;46945:27;46940:2;46932:6;46928:15;46921:52;46736:244;:::o;46986:174::-;47126:26;47122:1;47114:6;47110:14;47103:50;46986:174;:::o;47166:230::-;47306:34;47302:1;47294:6;47290:14;47283:58;47375:13;47370:2;47362:6;47358:15;47351:38;47166:230;:::o;47402:225::-;47542:34;47538:1;47530:6;47526:14;47519:58;47611:8;47606:2;47598:6;47594:15;47587:33;47402:225;:::o;47633:182::-;47773:34;47769:1;47761:6;47757:14;47750:58;47633:182;:::o;47821:176::-;47961:28;47957:1;47949:6;47945:14;47938:52;47821:176;:::o;48003:237::-;48143:34;48139:1;48131:6;48127:14;48120:58;48212:20;48207:2;48199:6;48195:15;48188:45;48003:237;:::o;48246:165::-;48386:17;48382:1;48374:6;48370:14;48363:41;48246:165;:::o;48417:221::-;48557:34;48553:1;48545:6;48541:14;48534:58;48626:4;48621:2;48613:6;48609:15;48602:29;48417:221;:::o;48644:169::-;48784:21;48780:1;48772:6;48768:14;48761:45;48644:169;:::o;48819:114::-;;:::o;48939:166::-;49079:18;49075:1;49067:6;49063:14;49056:42;48939:166;:::o;49111:238::-;49251:34;49247:1;49239:6;49235:14;49228:58;49320:21;49315:2;49307:6;49303:15;49296:46;49111:238;:::o;49355:220::-;49495:34;49491:1;49483:6;49479:14;49472:58;49564:3;49559:2;49551:6;49547:15;49540:28;49355:220;:::o;49581:168::-;49721:20;49717:1;49709:6;49705:14;49698:44;49581:168;:::o;49755:227::-;49895:34;49891:1;49883:6;49879:14;49872:58;49964:10;49959:2;49951:6;49947:15;49940:35;49755:227;:::o;49988:170::-;50128:22;50124:1;50116:6;50112:14;50105:46;49988:170;:::o;50164:233::-;50304:34;50300:1;50292:6;50288:14;50281:58;50373:16;50368:2;50360:6;50356:15;50349:41;50164:233;:::o;50403:165::-;50543:17;50539:1;50531:6;50527:14;50520:41;50403:165;:::o;50574:181::-;50714:33;50710:1;50702:6;50698:14;50691:57;50574:181;:::o;50761:234::-;50901:34;50897:1;50889:6;50885:14;50878:58;50970:17;50965:2;50957:6;50953:15;50946:42;50761:234;:::o;51001:232::-;51141:34;51137:1;51129:6;51125:14;51118:58;51210:15;51205:2;51197:6;51193:15;51186:40;51001:232;:::o;51239:122::-;51312:24;51330:5;51312:24;:::i;:::-;51305:5;51302:35;51292:63;;51351:1;51348;51341:12;51292:63;51239:122;:::o;51367:116::-;51437:21;51452:5;51437:21;:::i;:::-;51430:5;51427:32;51417:60;;51473:1;51470;51463:12;51417:60;51367:116;:::o;51489:120::-;51561:23;51578:5;51561:23;:::i;:::-;51554:5;51551:34;51541:62;;51599:1;51596;51589:12;51541:62;51489:120;:::o;51615:122::-;51688:24;51706:5;51688:24;:::i;:::-;51681:5;51678:35;51668:63;;51727:1;51724;51717:12;51668:63;51615:122;:::o

Swarm Source

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