ETH Price: $3,721.71 (+4.48%)

Token

ERC-20: Saviors of the Sea (SOTS)
 

Overview

Max Total Supply

69 SOTS

Holders

39

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
4five6.eth
Balance
1 SOTS
0x1fefd2d64af4d97e5f2de6f96237e6afe29e25f4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SaviorsOfTheSea

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/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/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: SaviorsOfTheSea.sol


pragma solidity ^0.8.0;









contract SaviorsOfTheSea is ERC721, ERC721URIStorage, ERC721Enumerable, ERC721Burnable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    Counters.Counter private _tokenIdCounter;

    mapping (address=>bool) FREELIST_WALLETS;
    mapping (address=>bool) GREENLIST_WALLETS;

    uint256 private MAX_SS_AT_FREELIST = 1;
    uint256 public freelistPrice = 0 ether;
    bool public freelistSale = false;
    uint256 public maxFreelistSupply = 250;
    uint256 public freelistTokensClaimed = 0;

    uint256 private MAX_SS_AT_GREENLIST = 10;
    uint256 public greenlistPrice = 0.02 ether;
    bool public greenlistSale = false;
    uint256 public maxGreenlistSupply = 2500;
    uint256 public greenlistTokensClaimed = 0;

    uint256 private constant MAX_SS_AT_MINT = 500;
    uint256 public mintPrice = 0.04 ether;
    bool public publicSale = false;
    uint256 public maxTokenSupply = 7777;
    
    address WITHDRAW_ADDR = 0xD81baF6Cc9416338225a731330bc6dE6BF0c5fcb;

    string public baseURI;
    
    event PaymentReleased(address to, uint256 amount);

    constructor(string memory name, string memory symbol) ERC721(name, symbol) {
        
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    /*
     *  Sets the withdrawal address for the contract
     */
    function setWithdrawAddr(address _WITHDRAW_ADDR) public onlyOwner {
        WITHDRAW_ADDR = _WITHDRAW_ADDR;
    }

    /*
     *  Adds wallet addresses to Freelist or Greenlist
     */
     function addToList(uint256 list, address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++ ){
            if (list == 1){
                FREELIST_WALLETS[addrs[i]] = true;
            } else if (list == 2){
                GREENLIST_WALLETS[addrs[i]] = true;
            }
        }
     }

    function withdraw() public onlyOwner {
        require(address(this).balance >= 0, "Insufficient balance");
        uint256 payment = (address(this).balance);
        Address.sendValue(payable(WITHDRAW_ADDR), payment);
        emit PaymentReleased(WITHDRAW_ADDR, payment);
    }

    /*
    * Mint reserved NFTs for giveaways, devs, etc.
    */
    function reserveMint(uint256 reservedAmount, address mintAddress) public onlyOwner {        
        uint256 supply = _tokenIdCounter.current();
        for (uint256 i = 1; i <= reservedAmount; i++) {
            _safeMint(mintAddress, supply.add(i));
            _tokenIdCounter.increment();
        }
    }


    /*
    * Pause sale if active, make active if paused. Enter number for settings.
    */
    function flipSaleState(uint256 entry) public onlyOwner {
        if (entry == 1){
            freelistSale = !freelistSale;
        } else if (entry == 2){
            greenlistSale = !greenlistSale;
        } else if (entry == 3){
            publicSale = !publicSale;
        } else if (entry == 0){
            freelistSale = false;
            greenlistSale = false;
            publicSale = false;
        }
    }

    /*
    * Mint Saviors of the Sea through PUBLIC SALE
    */
    function publicMint(uint mintQty) public payable nonReentrant {
        require(publicSale, "Sale must be active to buy a Savior.");
        require(mintQty<=20, "Can only mint 20 Saviors at once.");
        require(balanceOf(msg.sender).add(mintQty) <= MAX_SS_AT_MINT, "While minting, you can only hold 500 Saviors at a time.");
        require(totalSupply().add(mintQty) <= maxTokenSupply, "Purchase would exceed max available Saviors.");
        require(mintPrice.mul(mintQty) <= msg.value, "ETH value sent is not correct");
        
        for (uint256 i = 1; i <= mintQty; i++){
            uint256 mintIndex = _tokenIdCounter.current().add(1);
            if (mintIndex <= maxTokenSupply) {
                _safeMint(msg.sender, mintIndex);
                _tokenIdCounter.increment();
            }
        }
        
    }

    /*
    * Mint Saviors of the Sea through GREENLIST SALE
    */
    function greenlistMint(uint mintQty) public payable nonReentrant {
        require(greenlistSale, "Greenlist Sale must be active to buy a Savior.");
        require(GREENLIST_WALLETS[msg.sender], "Wallet is not on the Greenlist.");
        require(mintQty<=MAX_SS_AT_GREENLIST, "Can only mint 10 Saviors for Greenlist.");
        require(greenlistTokensClaimed.add(mintQty) <= maxGreenlistSupply, "Purchase would exceed max available Greenlist Saviors.");
        require(totalSupply().add(mintQty) <= maxTokenSupply, "Purchase would exceed max available Saviors.");
        require(greenlistPrice.mul(mintQty) <= msg.value, "ETH value sent is not correct");
        
        for (uint256 i = 1; i <= mintQty; i++){
            uint256 mintIndex = _tokenIdCounter.current().add(1);
            if (mintIndex <= maxTokenSupply) {
                greenlistTokensClaimed = greenlistTokensClaimed.add(1);
                _safeMint(msg.sender, mintIndex);
                _tokenIdCounter.increment();
            }

            // If GEQ, set greenlist sale to FALSE automatically
            if (greenlistTokensClaimed >= maxGreenlistSupply){
                greenlistSale = false;
            }
        }
        
    }

    /*
    * Mint Saviors of the Sea through FREELIST SALE
    */
    function freelistMint() public payable nonReentrant {
        require(freelistSale, "Freelist Sale must be active to claim a Savior.");
        require(FREELIST_WALLETS[msg.sender], "Wallet is not on the Freelist.");
        require(freelistTokensClaimed.add(1) <= maxFreelistSupply, "Purchase would exceed max available Freelist Saviors.");
        require(totalSupply().add(1) <= maxTokenSupply, "Purchase would exceed max available Saviors.");
        
        uint256 mintIndex = _tokenIdCounter.current().add(1);
        if (mintIndex <= maxTokenSupply) {
            FREELIST_WALLETS[msg.sender] = false; // Set the wallet address back to false
            freelistTokensClaimed = freelistTokensClaimed.add(1); // increment freelist token counter
            _safeMint(msg.sender, mintIndex);
            _tokenIdCounter.increment();                
        }

        // If GEQ, set freelist sale to FALSE automatically
        if (freelistTokensClaimed >= maxFreelistSupply){
            freelistSale = false;
        }
    }

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

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

    function setMintPrice(uint pr) public onlyOwner {
        mintPrice = pr;
    }

    function setGreenlistPrice(uint pr) public onlyOwner {
        greenlistPrice = pr;
    }

    function setMaxTokenSupply(uint num) public onlyOwner {
        maxTokenSupply = num;
    }

    function setMaxGreenlistSupply(uint num) public onlyOwner {
        maxGreenlistSupply = num;
    }

    function setMaxFreelistSupply(uint num) public onlyOwner {
        maxFreelistSupply = num;
    }

    /**
    * Override isApprovedForAll to auto-approve OS's proxy contract
    */
    function isApprovedForAll(
        address _owner,
        address _operator
    ) public override view returns (bool isOperator) {
      // if OpenSea's ERC721 Proxy Address is detected, auto-return true
        if (_operator == address(0x58807baD0B376efc12F5AD86aAc70E78ed67deaE)) {
            return true;
        }
        
        // otherwise, use the default ERC721.isApprovedForAll()
        return ERC721.isApprovedForAll(_owner, _operator);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"uint256","name":"list","type":"uint256"},{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addToList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"entry","type":"uint256"}],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freelistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freelistTokensClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintQty","type":"uint256"}],"name":"greenlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"greenlistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"greenlistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"greenlistTokensClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreelistSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGreenlistSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintQty","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reservedAmount","type":"uint256"},{"internalType":"address","name":"mintAddress","type":"address"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pr","type":"uint256"}],"name":"setGreenlistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxFreelistSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxGreenlistSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pr","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_WITHDRAW_ADDR","type":"address"}],"name":"setWithdrawAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600160105560006011556000601260006101000a81548160ff02191690831515021790555060fa6013556000601455600a60155566470de4df8200006016556000601760006101000a81548160ff0219169083151502179055506109c46018556000601955668e1bc9bf040000601a556000601b60006101000a81548160ff021916908315150217905550611e61601c5573d81baf6cc9416338225a731330bc6de6bf0c5fcb601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f757600080fd5b506040516200641c3803806200641c83398181016040528101906200011d91906200037f565b818181600090805190602001906200013792919062000251565b5080600190805190602001906200015092919062000251565b50505062000173620001676200018360201b60201c565b6200018b60201b60201c565b6001600c81905550505062000588565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025f9062000499565b90600052602060002090601f016020900481019282620002835760008555620002cf565b82601f106200029e57805160ff1916838001178555620002cf565b82800160010185558215620002cf579182015b82811115620002ce578251825591602001919060010190620002b1565b5b509050620002de9190620002e2565b5090565b5b80821115620002fd576000816000905550600101620002e3565b5090565b60006200031862000312846200042d565b62000404565b90508281526020810184848401111562000337576200033662000568565b5b6200034484828562000463565b509392505050565b600082601f83011262000364576200036362000563565b5b81516200037684826020860162000301565b91505092915050565b6000806040838503121562000399576200039862000572565b5b600083015167ffffffffffffffff811115620003ba57620003b96200056d565b5b620003c8858286016200034c565b925050602083015167ffffffffffffffff811115620003ec57620003eb6200056d565b5b620003fa858286016200034c565b9150509250929050565b60006200041062000423565b90506200041e8282620004cf565b919050565b6000604051905090565b600067ffffffffffffffff8211156200044b576200044a62000534565b5b620004568262000577565b9050602081019050919050565b60005b838110156200048357808201518184015260208101905062000466565b8381111562000493576000848401525b50505050565b60006002820490506001821680620004b257607f821691505b60208210811415620004c957620004c862000505565b5b50919050565b620004da8262000577565b810181811067ffffffffffffffff82111715620004fc57620004fb62000534565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615e8480620005986000396000f3fe60806040526004361061027d5760003560e01c8063717e39921161014f57806395d89b41116100c1578063caf73e6e1161007a578063caf73e6e14610933578063d3593f581461095e578063dde999e214610989578063e985e9c5146109b4578063f2fde38b146109f1578063f4a0a52814610a1a5761027d565b806395d89b4114610834578063a22cb4651461085f578063b07ed98214610888578063b88d4fde146108b1578063c87b56dd146108da578063caf2d906146109175761027d565b80637d6a5103116101135780637d6a510314610738578063830fa31414610763578063870145491461078c5780638da3d736146107b75780638da5cb5b146107e057806392823c9c1461080b5761027d565b8063717e3992146106865780637511ef65146106b157806375eccb1a146106da5780637719c4771461070357806377d3b5311461070d5761027d565b80633ccfd60b116101f357806360b02f70116101ac57806360b02f70146105765780636352211e1461059f5780636817c76c146105dc5780636c0360eb1461060757806370a0823114610632578063715018a61461066f5761027d565b80633ccfd60b1461047c57806342842e0e1461049357806342966c68146104bc5780634f6ccce7146104e557806350f7c2041461052257806355f804b31461054d5761027d565b806323b872dd1161024557806323b872dd1461037b5780632db11544146103a45780632f745c59146103c0578063313112ce146103fd57806333a6e8d01461042657806333bc1c5c146104515761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b31461032757806318160ddd14610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614276565b610a43565b6040516102b69190614a8a565b60405180910390f35b3480156102cb57600080fd5b506102d4610a55565b6040516102e19190614aa5565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190614319565b610ae7565b60405161031e91906149fa565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190614236565b610b6c565b005b34801561035c57600080fd5b50610365610c84565b6040516103729190614f47565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190614120565b610c91565b005b6103be60048036038101906103b99190614319565b610cf1565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190614236565b610f53565b6040516103f49190614f47565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190614319565b610ff8565b005b34801561043257600080fd5b5061043b61117d565b6040516104489190614f47565b60405180910390f35b34801561045d57600080fd5b50610466611183565b6040516104739190614a8a565b60405180910390f35b34801561048857600080fd5b50610491611196565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190614120565b6112e5565b005b3480156104c857600080fd5b506104e360048036038101906104de9190614319565b611305565b005b3480156104f157600080fd5b5061050c60048036038101906105079190614319565b611361565b6040516105199190614f47565b60405180910390f35b34801561052e57600080fd5b506105376113d2565b6040516105449190614f47565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f91906142d0565b6113d8565b005b34801561058257600080fd5b5061059d60048036038101906105989190614346565b61146e565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190614319565b611545565b6040516105d391906149fa565b60405180910390f35b3480156105e857600080fd5b506105f16115f7565b6040516105fe9190614f47565b60405180910390f35b34801561061357600080fd5b5061061c6115fd565b6040516106299190614aa5565b60405180910390f35b34801561063e57600080fd5b50610659600480360381019061065491906140b3565b61168b565b6040516106669190614f47565b60405180910390f35b34801561067b57600080fd5b50610684611743565b005b34801561069257600080fd5b5061069b6117cb565b6040516106a89190614f47565b60405180910390f35b3480156106bd57600080fd5b506106d860048036038101906106d391906140b3565b6117d1565b005b3480156106e657600080fd5b5061070160048036038101906106fc9190614319565b611891565b005b61070b611917565b005b34801561071957600080fd5b50610722611bde565b60405161072f9190614a8a565b60405180910390f35b34801561074457600080fd5b5061074d611bf1565b60405161075a9190614f47565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190614319565b611bf7565b005b34801561079857600080fd5b506107a1611c7d565b6040516107ae9190614a8a565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190614386565b611c90565b005b3480156107ec57600080fd5b506107f5611e2d565b60405161080291906149fa565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190614319565b611e57565b005b34801561084057600080fd5b50610849611edd565b6040516108569190614aa5565b60405180910390f35b34801561086b57600080fd5b50610886600480360381019061088191906141f6565b611f6f565b005b34801561089457600080fd5b506108af60048036038101906108aa9190614319565b611f85565b005b3480156108bd57600080fd5b506108d860048036038101906108d39190614173565b61200b565b005b3480156108e657600080fd5b5061090160048036038101906108fc9190614319565b61206d565b60405161090e9190614aa5565b60405180910390f35b610931600480360381019061092c9190614319565b61207f565b005b34801561093f57600080fd5b506109486123ab565b6040516109559190614f47565b60405180910390f35b34801561096a57600080fd5b506109736123b1565b6040516109809190614f47565b60405180910390f35b34801561099557600080fd5b5061099e6123b7565b6040516109ab9190614f47565b60405180910390f35b3480156109c057600080fd5b506109db60048036038101906109d691906140e0565b6123bd565b6040516109e89190614a8a565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a1391906140b3565b612423565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190614319565b61251b565b005b6000610a4e826125a1565b9050919050565b606060008054610a649061522e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a909061522e565b8015610add5780601f10610ab257610100808354040283529160200191610add565b820191906000526020600020905b815481529060010190602001808311610ac057829003601f168201915b5050505050905090565b6000610af28261261b565b610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614d67565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7782611545565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90614e47565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c07612687565b73ffffffffffffffffffffffffffffffffffffffff161480610c365750610c3581610c30612687565b6123bd565b5b610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90614cc7565b60405180910390fd5b610c7f838361268f565b505050565b6000600980549050905090565b610ca2610c9c612687565b82612748565b610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890614e87565b60405180910390fd5b610cec838383612826565b505050565b6002600c541415610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90614ee7565b60405180910390fd5b6002600c81905550601b60009054906101000a900460ff16610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590614bc7565b60405180910390fd5b6014811115610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc990614e27565b60405180910390fd5b6101f4610df082610de23361168b565b612a8d90919063ffffffff16565b1115610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890614ba7565b60405180910390fd5b601c54610e4e82610e40610c84565b612a8d90919063ffffffff16565b1115610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8690614f07565b60405180910390fd5b34610ea582601a54612aa390919063ffffffff16565b1115610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90614ec7565b60405180910390fd5b6000600190505b818111610f47576000610f136001610f05600d612ab9565b612a8d90919063ffffffff16565b9050601c548111610f3357610f283382612ac7565b610f32600d612ae5565b5b508080610f3f90615291565b915050610eed565b506001600c8190555050565b6000610f5e8361168b565b8210610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614b07565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611000612687565b73ffffffffffffffffffffffffffffffffffffffff1661101e611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b90614dc7565b60405180910390fd5b60018114156110ac57601260009054906101000a900460ff1615601260006101000a81548160ff02191690831515021790555061117a565b60028114156110e457601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550611179565b600381141561111c57601b60009054906101000a900460ff1615601b60006101000a81548160ff021916908315150217905550611178565b6000811415611177576000601260006101000a81548160ff0219169083151502179055506000601760006101000a81548160ff0219169083151502179055506000601b60006101000a81548160ff0219169083151502179055505b5b5b5b50565b60185481565b601b60009054906101000a900460ff1681565b61119e612687565b73ffffffffffffffffffffffffffffffffffffffff166111bc611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614dc7565b60405180910390fd5b6000471015611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90614c27565b60405180910390fd5b6000479050611287601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612afb565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516112da929190614a61565b60405180910390a150565b6113008383836040518060200160405280600081525061200b565b505050565b611316611310612687565b82612748565b611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90614f27565b60405180910390fd5b61135e81612bef565b50565b600061136b610c84565b82106113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614ea7565b60405180910390fd5b600982815481106113c0576113bf6153c7565b5b90600052602060002001549050919050565b601c5481565b6113e0612687565b73ffffffffffffffffffffffffffffffffffffffff166113fe611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b90614dc7565b60405180910390fd5b80601e908051906020019061146a929190613de9565b5050565b611476612687565b73ffffffffffffffffffffffffffffffffffffffff16611494611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614dc7565b60405180910390fd5b60006114f6600d612ab9565b90506000600190505b83811161153f576115228361151d8385612a8d90919063ffffffff16565b612ac7565b61152c600d612ae5565b808061153790615291565b9150506114ff565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e590614d07565b60405180910390fd5b80915050919050565b601a5481565b601e805461160a9061522e565b80601f01602080910402602001604051908101604052809291908181526020018280546116369061522e565b80156116835780601f1061165857610100808354040283529160200191611683565b820191906000526020600020905b81548152906001019060200180831161166657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f390614ce7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174b612687565b73ffffffffffffffffffffffffffffffffffffffff16611769611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690614dc7565b60405180910390fd5b6117c96000612bfb565b565b60145481565b6117d9612687565b73ffffffffffffffffffffffffffffffffffffffff166117f7611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490614dc7565b60405180910390fd5b80601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611899612687565b73ffffffffffffffffffffffffffffffffffffffff166118b7611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490614dc7565b60405180910390fd5b8060188190555050565b6002600c54141561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490614ee7565b60405180910390fd5b6002600c81905550601260009054906101000a900460ff166119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab90614ae7565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790614d87565b60405180910390fd5b601354611a596001601454612a8d90919063ffffffff16565b1115611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614da7565b60405180910390fd5b601c54611ab86001611aaa610c84565b612a8d90919063ffffffff16565b1115611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af090614f07565b60405180910390fd5b6000611b186001611b0a600d612ab9565b612a8d90919063ffffffff16565b9050601c548111611bac576000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b916001601454612a8d90919063ffffffff16565b601481905550611ba13382612ac7565b611bab600d612ae5565b5b60135460145410611bd3576000601260006101000a81548160ff0219169083151502179055505b506001600c81905550565b601760009054906101000a900460ff1681565b60135481565b611bff612687565b73ffffffffffffffffffffffffffffffffffffffff16611c1d611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614dc7565b60405180910390fd5b8060138190555050565b601260009054906101000a900460ff1681565b611c98612687565b73ffffffffffffffffffffffffffffffffffffffff16611cb6611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0390614dc7565b60405180910390fd5b60005b8151811015611e28576001831415611d98576001600e6000848481518110611d3a57611d396153c7565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e15565b6002831415611e14576001600f6000848481518110611dba57611db96153c7565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b8080611e2090615291565b915050611d0f565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e5f612687565b73ffffffffffffffffffffffffffffffffffffffff16611e7d611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eca90614dc7565b60405180910390fd5b8060168190555050565b606060018054611eec9061522e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f189061522e565b8015611f655780601f10611f3a57610100808354040283529160200191611f65565b820191906000526020600020905b815481529060010190602001808311611f4857829003601f168201915b5050505050905090565b611f81611f7a612687565b8383612cc1565b5050565b611f8d612687565b73ffffffffffffffffffffffffffffffffffffffff16611fab611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890614dc7565b60405180910390fd5b80601c8190555050565b61201c612016612687565b83612748565b61205b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205290614e87565b60405180910390fd5b61206784848484612e2e565b50505050565b606061207882612e8a565b9050919050565b6002600c5414156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614ee7565b60405180910390fd5b6002600c81905550601760009054906101000a900460ff1661211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211390614c87565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219f90614e67565b60405180910390fd5b6015548111156121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490614ac7565b60405180910390fd5b60185461220582601954612a8d90919063ffffffff16565b1115612246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223d90614e07565b60405180910390fd5b601c5461226382612255610c84565b612a8d90919063ffffffff16565b11156122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90614f07565b60405180910390fd5b346122ba82601654612aa390919063ffffffff16565b11156122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290614ec7565b60405180910390fd5b6000600190505b81811161239f576000612328600161231a600d612ab9565b612a8d90919063ffffffff16565b9050601c548111612364576123496001601954612a8d90919063ffffffff16565b6019819055506123593382612ac7565b612363600d612ae5565b5b6018546019541061238b576000601760006101000a81548160ff0219169083151502179055505b50808061239790615291565b915050612302565b506001600c8190555050565b60165481565b60115481565b60195481565b60007358807bad0b376efc12f5ad86aac70e78ed67deae73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612410576001905061241d565b61241a8383612fdc565b90505b92915050565b61242b612687565b73ffffffffffffffffffffffffffffffffffffffff16612449611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249690614dc7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614b47565b60405180910390fd5b61251881612bfb565b50565b612523612687565b73ffffffffffffffffffffffffffffffffffffffff16612541611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258e90614dc7565b60405180910390fd5b80601a8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612614575061261382613070565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661270283611545565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127538261261b565b612792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278990614ca7565b60405180910390fd5b600061279d83611545565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127df57506127de81856123bd565b5b8061281d57508373ffffffffffffffffffffffffffffffffffffffff1661280584610ae7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661284682611545565b73ffffffffffffffffffffffffffffffffffffffff161461289c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289390614b67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290390614be7565b60405180910390fd5b612917838383613152565b61292260008261268f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129729190615144565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c99190615063565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a88838383613162565b505050565b60008183612a9b9190615063565b905092915050565b60008183612ab191906150ea565b905092915050565b600081600001549050919050565b612ae1828260405180602001604052806000815250613167565b5050565b6001816000016000828254019250508190555050565b80471015612b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3590614c67565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b64906149e5565b60006040518083038185875af1925050503d8060008114612ba1576040519150601f19603f3d011682016040523d82523d6000602084013e612ba6565b606091505b5050905080612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be190614c47565b60405180910390fd5b505050565b612bf8816131c2565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2790614c07565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e219190614a8a565b60405180910390a3505050565b612e39848484612826565b612e4584848484613215565b612e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7b90614b27565b60405180910390fd5b50505050565b6060612e958261261b565b612ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecb90614d47565b60405180910390fd5b6000600660008481526020019081526020016000208054612ef49061522e565b80601f0160208091040260200160405190810160405280929190818152602001828054612f209061522e565b8015612f6d5780601f10612f4257610100808354040283529160200191612f6d565b820191906000526020600020905b815481529060010190602001808311612f5057829003601f168201915b505050505090506000612f7e6133ac565b9050600081511415612f94578192505050612fd7565b600082511115612fc9578082604051602001612fb19291906149c1565b60405160208183030381529060405292505050612fd7565b612fd28461343e565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061313b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061314b575061314a826134e5565b5b9050919050565b61315d83838361354f565b505050565b505050565b6131718383613663565b61317e6000848484613215565b6131bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b490614b27565b60405180910390fd5b505050565b6131cb8161383d565b60006006600083815260200190815260200160002080546131eb9061522e565b905014613212576006600082815260200190815260200160002060006132119190613e6f565b5b50565b60006132368473ffffffffffffffffffffffffffffffffffffffff1661395a565b1561339f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261325f612687565b8786866040518563ffffffff1660e01b81526004016132819493929190614a15565b602060405180830381600087803b15801561329b57600080fd5b505af19250505080156132cc57506040513d601f19601f820116820180604052508101906132c991906142a3565b60015b61334f573d80600081146132fc576040519150601f19603f3d011682016040523d82523d6000602084013e613301565b606091505b50600081511415613347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333e90614b27565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133a4565b600190505b949350505050565b6060601e80546133bb9061522e565b80601f01602080910402602001604051908101604052809291908181526020018280546133e79061522e565b80156134345780601f1061340957610100808354040283529160200191613434565b820191906000526020600020905b81548152906001019060200180831161341757829003601f168201915b5050505050905090565b60606134498261261b565b613488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347f90614de7565b60405180910390fd5b60006134926133ac565b905060008151116134b257604051806020016040528060008152506134dd565b806134bc8461397d565b6040516020016134cd9291906149c1565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61355a838383613ade565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561359d5761359881613ae3565b6135dc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135db576135da8382613b2c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561361f5761361a81613c99565b61365e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461365d5761365c8282613d6a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ca90614d27565b60405180910390fd5b6136dc8161261b565b1561371c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371390614b87565b60405180910390fd5b61372860008383613152565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137789190615063565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461383960008383613162565b5050565b600061384882611545565b905061385681600084613152565b61386160008361268f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138b19190615144565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461395681600084613162565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156139c5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613ad9565b600082905060005b600082146139f75780806139e090615291565b915050600a826139f091906150b9565b91506139cd565b60008167ffffffffffffffff811115613a1357613a126153f6565b5b6040519080825280601f01601f191660200182016040528015613a455781602001600182028036833780820191505090505b5090505b60008514613ad257600182613a5e9190615144565b9150600a85613a6d91906152da565b6030613a799190615063565b60f81b818381518110613a8f57613a8e6153c7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613acb91906150b9565b9450613a49565b8093505050505b919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b398461168b565b613b439190615144565b9050600060086000848152602001908152602001600020549050818114613c28576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050613cad9190615144565b90506000600a6000848152602001908152602001600020549050600060098381548110613cdd57613cdc6153c7565b5b906000526020600020015490508060098381548110613cff57613cfe6153c7565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613d4e57613d4d615398565b5b6001900381819060005260206000200160009055905550505050565b6000613d758361168b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054613df59061522e565b90600052602060002090601f016020900481019282613e175760008555613e5e565b82601f10613e3057805160ff1916838001178555613e5e565b82800160010185558215613e5e579182015b82811115613e5d578251825591602001919060010190613e42565b5b509050613e6b9190613eaf565b5090565b508054613e7b9061522e565b6000825580601f10613e8d5750613eac565b601f016020900490600052602060002090810190613eab9190613eaf565b5b50565b5b80821115613ec8576000816000905550600101613eb0565b5090565b6000613edf613eda84614f87565b614f62565b90508083825260208201905082856020860282011115613f0257613f0161542a565b5b60005b85811015613f325781613f188882613fc0565b845260208401935060208301925050600181019050613f05565b5050509392505050565b6000613f4f613f4a84614fb3565b614f62565b905082815260208101848484011115613f6b57613f6a61542f565b5b613f768482856151ec565b509392505050565b6000613f91613f8c84614fe4565b614f62565b905082815260208101848484011115613fad57613fac61542f565b5b613fb88482856151ec565b509392505050565b600081359050613fcf81615df2565b92915050565b600082601f830112613fea57613fe9615425565b5b8135613ffa848260208601613ecc565b91505092915050565b60008135905061401281615e09565b92915050565b60008135905061402781615e20565b92915050565b60008151905061403c81615e20565b92915050565b600082601f83011261405757614056615425565b5b8135614067848260208601613f3c565b91505092915050565b600082601f83011261408557614084615425565b5b8135614095848260208601613f7e565b91505092915050565b6000813590506140ad81615e37565b92915050565b6000602082840312156140c9576140c8615439565b5b60006140d784828501613fc0565b91505092915050565b600080604083850312156140f7576140f6615439565b5b600061410585828601613fc0565b925050602061411685828601613fc0565b9150509250929050565b60008060006060848603121561413957614138615439565b5b600061414786828701613fc0565b935050602061415886828701613fc0565b92505060406141698682870161409e565b9150509250925092565b6000806000806080858703121561418d5761418c615439565b5b600061419b87828801613fc0565b94505060206141ac87828801613fc0565b93505060406141bd8782880161409e565b925050606085013567ffffffffffffffff8111156141de576141dd615434565b5b6141ea87828801614042565b91505092959194509250565b6000806040838503121561420d5761420c615439565b5b600061421b85828601613fc0565b925050602061422c85828601614003565b9150509250929050565b6000806040838503121561424d5761424c615439565b5b600061425b85828601613fc0565b925050602061426c8582860161409e565b9150509250929050565b60006020828403121561428c5761428b615439565b5b600061429a84828501614018565b91505092915050565b6000602082840312156142b9576142b8615439565b5b60006142c78482850161402d565b91505092915050565b6000602082840312156142e6576142e5615439565b5b600082013567ffffffffffffffff81111561430457614303615434565b5b61431084828501614070565b91505092915050565b60006020828403121561432f5761432e615439565b5b600061433d8482850161409e565b91505092915050565b6000806040838503121561435d5761435c615439565b5b600061436b8582860161409e565b925050602061437c85828601613fc0565b9150509250929050565b6000806040838503121561439d5761439c615439565b5b60006143ab8582860161409e565b925050602083013567ffffffffffffffff8111156143cc576143cb615434565b5b6143d885828601613fd5565b9150509250929050565b6143eb81615178565b82525050565b6143fa8161518a565b82525050565b600061440b82615015565b614415818561502b565b93506144258185602086016151fb565b61442e8161543e565b840191505092915050565b600061444482615020565b61444e8185615047565b935061445e8185602086016151fb565b6144678161543e565b840191505092915050565b600061447d82615020565b6144878185615058565b93506144978185602086016151fb565b80840191505092915050565b60006144b0602783615047565b91506144bb8261544f565b604082019050919050565b60006144d3602f83615047565b91506144de8261549e565b604082019050919050565b60006144f6602b83615047565b9150614501826154ed565b604082019050919050565b6000614519603283615047565b91506145248261553c565b604082019050919050565b600061453c602683615047565b91506145478261558b565b604082019050919050565b600061455f602583615047565b915061456a826155da565b604082019050919050565b6000614582601c83615047565b915061458d82615629565b602082019050919050565b60006145a5603783615047565b91506145b082615652565b604082019050919050565b60006145c8602483615047565b91506145d3826156a1565b604082019050919050565b60006145eb602483615047565b91506145f6826156f0565b604082019050919050565b600061460e601983615047565b91506146198261573f565b602082019050919050565b6000614631601483615047565b915061463c82615768565b602082019050919050565b6000614654603a83615047565b915061465f82615791565b604082019050919050565b6000614677601d83615047565b9150614682826157e0565b602082019050919050565b600061469a602e83615047565b91506146a582615809565b604082019050919050565b60006146bd602c83615047565b91506146c882615858565b604082019050919050565b60006146e0603883615047565b91506146eb826158a7565b604082019050919050565b6000614703602a83615047565b915061470e826158f6565b604082019050919050565b6000614726602983615047565b915061473182615945565b604082019050919050565b6000614749602083615047565b915061475482615994565b602082019050919050565b600061476c603183615047565b9150614777826159bd565b604082019050919050565b600061478f602c83615047565b915061479a82615a0c565b604082019050919050565b60006147b2601e83615047565b91506147bd82615a5b565b602082019050919050565b60006147d5603583615047565b91506147e082615a84565b604082019050919050565b60006147f8602083615047565b915061480382615ad3565b602082019050919050565b600061481b602f83615047565b915061482682615afc565b604082019050919050565b600061483e603683615047565b915061484982615b4b565b604082019050919050565b6000614861602183615047565b915061486c82615b9a565b604082019050919050565b6000614884602183615047565b915061488f82615be9565b604082019050919050565b60006148a7601f83615047565b91506148b282615c38565b602082019050919050565b60006148ca60008361503c565b91506148d582615c61565b600082019050919050565b60006148ed603183615047565b91506148f882615c64565b604082019050919050565b6000614910602c83615047565b915061491b82615cb3565b604082019050919050565b6000614933601d83615047565b915061493e82615d02565b602082019050919050565b6000614956601f83615047565b915061496182615d2b565b602082019050919050565b6000614979602c83615047565b915061498482615d54565b604082019050919050565b600061499c603083615047565b91506149a782615da3565b604082019050919050565b6149bb816151e2565b82525050565b60006149cd8285614472565b91506149d98284614472565b91508190509392505050565b60006149f0826148bd565b9150819050919050565b6000602082019050614a0f60008301846143e2565b92915050565b6000608082019050614a2a60008301876143e2565b614a3760208301866143e2565b614a4460408301856149b2565b8181036060830152614a568184614400565b905095945050505050565b6000604082019050614a7660008301856143e2565b614a8360208301846149b2565b9392505050565b6000602082019050614a9f60008301846143f1565b92915050565b60006020820190508181036000830152614abf8184614439565b905092915050565b60006020820190508181036000830152614ae0816144a3565b9050919050565b60006020820190508181036000830152614b00816144c6565b9050919050565b60006020820190508181036000830152614b20816144e9565b9050919050565b60006020820190508181036000830152614b408161450c565b9050919050565b60006020820190508181036000830152614b608161452f565b9050919050565b60006020820190508181036000830152614b8081614552565b9050919050565b60006020820190508181036000830152614ba081614575565b9050919050565b60006020820190508181036000830152614bc081614598565b9050919050565b60006020820190508181036000830152614be0816145bb565b9050919050565b60006020820190508181036000830152614c00816145de565b9050919050565b60006020820190508181036000830152614c2081614601565b9050919050565b60006020820190508181036000830152614c4081614624565b9050919050565b60006020820190508181036000830152614c6081614647565b9050919050565b60006020820190508181036000830152614c808161466a565b9050919050565b60006020820190508181036000830152614ca08161468d565b9050919050565b60006020820190508181036000830152614cc0816146b0565b9050919050565b60006020820190508181036000830152614ce0816146d3565b9050919050565b60006020820190508181036000830152614d00816146f6565b9050919050565b60006020820190508181036000830152614d2081614719565b9050919050565b60006020820190508181036000830152614d408161473c565b9050919050565b60006020820190508181036000830152614d608161475f565b9050919050565b60006020820190508181036000830152614d8081614782565b9050919050565b60006020820190508181036000830152614da0816147a5565b9050919050565b60006020820190508181036000830152614dc0816147c8565b9050919050565b60006020820190508181036000830152614de0816147eb565b9050919050565b60006020820190508181036000830152614e008161480e565b9050919050565b60006020820190508181036000830152614e2081614831565b9050919050565b60006020820190508181036000830152614e4081614854565b9050919050565b60006020820190508181036000830152614e6081614877565b9050919050565b60006020820190508181036000830152614e808161489a565b9050919050565b60006020820190508181036000830152614ea0816148e0565b9050919050565b60006020820190508181036000830152614ec081614903565b9050919050565b60006020820190508181036000830152614ee081614926565b9050919050565b60006020820190508181036000830152614f0081614949565b9050919050565b60006020820190508181036000830152614f208161496c565b9050919050565b60006020820190508181036000830152614f408161498f565b9050919050565b6000602082019050614f5c60008301846149b2565b92915050565b6000614f6c614f7d565b9050614f788282615260565b919050565b6000604051905090565b600067ffffffffffffffff821115614fa257614fa16153f6565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614fce57614fcd6153f6565b5b614fd78261543e565b9050602081019050919050565b600067ffffffffffffffff821115614fff57614ffe6153f6565b5b6150088261543e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061506e826151e2565b9150615079836151e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150ae576150ad61530b565b5b828201905092915050565b60006150c4826151e2565b91506150cf836151e2565b9250826150df576150de61533a565b5b828204905092915050565b60006150f5826151e2565b9150615100836151e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151395761513861530b565b5b828202905092915050565b600061514f826151e2565b915061515a836151e2565b92508282101561516d5761516c61530b565b5b828203905092915050565b6000615183826151c2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152195780820151818401526020810190506151fe565b83811115615228576000848401525b50505050565b6000600282049050600182168061524657607f821691505b6020821081141561525a57615259615369565b5b50919050565b6152698261543e565b810181811067ffffffffffffffff82111715615288576152876153f6565b5b80604052505050565b600061529c826151e2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152cf576152ce61530b565b5b600182019050919050565b60006152e5826151e2565b91506152f0836151e2565b925082615300576152ff61533a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e7420313020536176696f727320666f722047726560008201527f656e6c6973742e00000000000000000000000000000000000000000000000000602082015250565b7f467265656c6973742053616c65206d7573742062652061637469766520746f2060008201527f636c61696d206120536176696f722e0000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5768696c65206d696e74696e672c20796f752063616e206f6e6c7920686f6c6460008201527f2035303020536176696f727320617420612074696d652e000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f2062757920612053617660008201527f696f722e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f477265656e6c6973742053616c65206d7573742062652061637469766520746f60008201527f20627579206120536176696f722e000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f57616c6c6574206973206e6f74206f6e2074686520467265656c6973742e0000600082015250565b7f507572636861736520776f756c6420657863656564206d617820617661696c6160008201527f626c6520467265656c69737420536176696f72732e0000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820617661696c6160008201527f626c6520477265656e6c69737420536176696f72732e00000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420323020536176696f7273206174206f6e636560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206973206e6f74206f6e2074686520477265656e6c6973742e00600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4554482076616c75652073656e74206973206e6f7420636f7272656374000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f507572636861736520776f756c6420657863656564206d617820617661696c6160008201527f626c6520536176696f72732e0000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b615dfb81615178565b8114615e0657600080fd5b50565b615e128161518a565b8114615e1d57600080fd5b50565b615e2981615196565b8114615e3457600080fd5b50565b615e40816151e2565b8114615e4b57600080fd5b5056fea2646970667358221220eec1329fe821b48530d1915f54b0200f9a09ee067e603c2f1fd9c1dc00bdf3a764736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000012536176696f7273206f66207468652053656100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004534f545300000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061027d5760003560e01c8063717e39921161014f57806395d89b41116100c1578063caf73e6e1161007a578063caf73e6e14610933578063d3593f581461095e578063dde999e214610989578063e985e9c5146109b4578063f2fde38b146109f1578063f4a0a52814610a1a5761027d565b806395d89b4114610834578063a22cb4651461085f578063b07ed98214610888578063b88d4fde146108b1578063c87b56dd146108da578063caf2d906146109175761027d565b80637d6a5103116101135780637d6a510314610738578063830fa31414610763578063870145491461078c5780638da3d736146107b75780638da5cb5b146107e057806392823c9c1461080b5761027d565b8063717e3992146106865780637511ef65146106b157806375eccb1a146106da5780637719c4771461070357806377d3b5311461070d5761027d565b80633ccfd60b116101f357806360b02f70116101ac57806360b02f70146105765780636352211e1461059f5780636817c76c146105dc5780636c0360eb1461060757806370a0823114610632578063715018a61461066f5761027d565b80633ccfd60b1461047c57806342842e0e1461049357806342966c68146104bc5780634f6ccce7146104e557806350f7c2041461052257806355f804b31461054d5761027d565b806323b872dd1161024557806323b872dd1461037b5780632db11544146103a45780632f745c59146103c0578063313112ce146103fd57806333a6e8d01461042657806333bc1c5c146104515761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b31461032757806318160ddd14610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614276565b610a43565b6040516102b69190614a8a565b60405180910390f35b3480156102cb57600080fd5b506102d4610a55565b6040516102e19190614aa5565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190614319565b610ae7565b60405161031e91906149fa565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190614236565b610b6c565b005b34801561035c57600080fd5b50610365610c84565b6040516103729190614f47565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190614120565b610c91565b005b6103be60048036038101906103b99190614319565b610cf1565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190614236565b610f53565b6040516103f49190614f47565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190614319565b610ff8565b005b34801561043257600080fd5b5061043b61117d565b6040516104489190614f47565b60405180910390f35b34801561045d57600080fd5b50610466611183565b6040516104739190614a8a565b60405180910390f35b34801561048857600080fd5b50610491611196565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190614120565b6112e5565b005b3480156104c857600080fd5b506104e360048036038101906104de9190614319565b611305565b005b3480156104f157600080fd5b5061050c60048036038101906105079190614319565b611361565b6040516105199190614f47565b60405180910390f35b34801561052e57600080fd5b506105376113d2565b6040516105449190614f47565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f91906142d0565b6113d8565b005b34801561058257600080fd5b5061059d60048036038101906105989190614346565b61146e565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190614319565b611545565b6040516105d391906149fa565b60405180910390f35b3480156105e857600080fd5b506105f16115f7565b6040516105fe9190614f47565b60405180910390f35b34801561061357600080fd5b5061061c6115fd565b6040516106299190614aa5565b60405180910390f35b34801561063e57600080fd5b50610659600480360381019061065491906140b3565b61168b565b6040516106669190614f47565b60405180910390f35b34801561067b57600080fd5b50610684611743565b005b34801561069257600080fd5b5061069b6117cb565b6040516106a89190614f47565b60405180910390f35b3480156106bd57600080fd5b506106d860048036038101906106d391906140b3565b6117d1565b005b3480156106e657600080fd5b5061070160048036038101906106fc9190614319565b611891565b005b61070b611917565b005b34801561071957600080fd5b50610722611bde565b60405161072f9190614a8a565b60405180910390f35b34801561074457600080fd5b5061074d611bf1565b60405161075a9190614f47565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190614319565b611bf7565b005b34801561079857600080fd5b506107a1611c7d565b6040516107ae9190614a8a565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190614386565b611c90565b005b3480156107ec57600080fd5b506107f5611e2d565b60405161080291906149fa565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190614319565b611e57565b005b34801561084057600080fd5b50610849611edd565b6040516108569190614aa5565b60405180910390f35b34801561086b57600080fd5b50610886600480360381019061088191906141f6565b611f6f565b005b34801561089457600080fd5b506108af60048036038101906108aa9190614319565b611f85565b005b3480156108bd57600080fd5b506108d860048036038101906108d39190614173565b61200b565b005b3480156108e657600080fd5b5061090160048036038101906108fc9190614319565b61206d565b60405161090e9190614aa5565b60405180910390f35b610931600480360381019061092c9190614319565b61207f565b005b34801561093f57600080fd5b506109486123ab565b6040516109559190614f47565b60405180910390f35b34801561096a57600080fd5b506109736123b1565b6040516109809190614f47565b60405180910390f35b34801561099557600080fd5b5061099e6123b7565b6040516109ab9190614f47565b60405180910390f35b3480156109c057600080fd5b506109db60048036038101906109d691906140e0565b6123bd565b6040516109e89190614a8a565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a1391906140b3565b612423565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190614319565b61251b565b005b6000610a4e826125a1565b9050919050565b606060008054610a649061522e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a909061522e565b8015610add5780601f10610ab257610100808354040283529160200191610add565b820191906000526020600020905b815481529060010190602001808311610ac057829003601f168201915b5050505050905090565b6000610af28261261b565b610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614d67565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7782611545565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90614e47565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c07612687565b73ffffffffffffffffffffffffffffffffffffffff161480610c365750610c3581610c30612687565b6123bd565b5b610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90614cc7565b60405180910390fd5b610c7f838361268f565b505050565b6000600980549050905090565b610ca2610c9c612687565b82612748565b610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890614e87565b60405180910390fd5b610cec838383612826565b505050565b6002600c541415610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90614ee7565b60405180910390fd5b6002600c81905550601b60009054906101000a900460ff16610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590614bc7565b60405180910390fd5b6014811115610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc990614e27565b60405180910390fd5b6101f4610df082610de23361168b565b612a8d90919063ffffffff16565b1115610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890614ba7565b60405180910390fd5b601c54610e4e82610e40610c84565b612a8d90919063ffffffff16565b1115610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8690614f07565b60405180910390fd5b34610ea582601a54612aa390919063ffffffff16565b1115610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90614ec7565b60405180910390fd5b6000600190505b818111610f47576000610f136001610f05600d612ab9565b612a8d90919063ffffffff16565b9050601c548111610f3357610f283382612ac7565b610f32600d612ae5565b5b508080610f3f90615291565b915050610eed565b506001600c8190555050565b6000610f5e8361168b565b8210610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614b07565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611000612687565b73ffffffffffffffffffffffffffffffffffffffff1661101e611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b90614dc7565b60405180910390fd5b60018114156110ac57601260009054906101000a900460ff1615601260006101000a81548160ff02191690831515021790555061117a565b60028114156110e457601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550611179565b600381141561111c57601b60009054906101000a900460ff1615601b60006101000a81548160ff021916908315150217905550611178565b6000811415611177576000601260006101000a81548160ff0219169083151502179055506000601760006101000a81548160ff0219169083151502179055506000601b60006101000a81548160ff0219169083151502179055505b5b5b5b50565b60185481565b601b60009054906101000a900460ff1681565b61119e612687565b73ffffffffffffffffffffffffffffffffffffffff166111bc611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614dc7565b60405180910390fd5b6000471015611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90614c27565b60405180910390fd5b6000479050611287601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612afb565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516112da929190614a61565b60405180910390a150565b6113008383836040518060200160405280600081525061200b565b505050565b611316611310612687565b82612748565b611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90614f27565b60405180910390fd5b61135e81612bef565b50565b600061136b610c84565b82106113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614ea7565b60405180910390fd5b600982815481106113c0576113bf6153c7565b5b90600052602060002001549050919050565b601c5481565b6113e0612687565b73ffffffffffffffffffffffffffffffffffffffff166113fe611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b90614dc7565b60405180910390fd5b80601e908051906020019061146a929190613de9565b5050565b611476612687565b73ffffffffffffffffffffffffffffffffffffffff16611494611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614dc7565b60405180910390fd5b60006114f6600d612ab9565b90506000600190505b83811161153f576115228361151d8385612a8d90919063ffffffff16565b612ac7565b61152c600d612ae5565b808061153790615291565b9150506114ff565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e590614d07565b60405180910390fd5b80915050919050565b601a5481565b601e805461160a9061522e565b80601f01602080910402602001604051908101604052809291908181526020018280546116369061522e565b80156116835780601f1061165857610100808354040283529160200191611683565b820191906000526020600020905b81548152906001019060200180831161166657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f390614ce7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174b612687565b73ffffffffffffffffffffffffffffffffffffffff16611769611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690614dc7565b60405180910390fd5b6117c96000612bfb565b565b60145481565b6117d9612687565b73ffffffffffffffffffffffffffffffffffffffff166117f7611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490614dc7565b60405180910390fd5b80601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611899612687565b73ffffffffffffffffffffffffffffffffffffffff166118b7611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490614dc7565b60405180910390fd5b8060188190555050565b6002600c54141561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490614ee7565b60405180910390fd5b6002600c81905550601260009054906101000a900460ff166119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab90614ae7565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790614d87565b60405180910390fd5b601354611a596001601454612a8d90919063ffffffff16565b1115611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614da7565b60405180910390fd5b601c54611ab86001611aaa610c84565b612a8d90919063ffffffff16565b1115611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af090614f07565b60405180910390fd5b6000611b186001611b0a600d612ab9565b612a8d90919063ffffffff16565b9050601c548111611bac576000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b916001601454612a8d90919063ffffffff16565b601481905550611ba13382612ac7565b611bab600d612ae5565b5b60135460145410611bd3576000601260006101000a81548160ff0219169083151502179055505b506001600c81905550565b601760009054906101000a900460ff1681565b60135481565b611bff612687565b73ffffffffffffffffffffffffffffffffffffffff16611c1d611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614dc7565b60405180910390fd5b8060138190555050565b601260009054906101000a900460ff1681565b611c98612687565b73ffffffffffffffffffffffffffffffffffffffff16611cb6611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0390614dc7565b60405180910390fd5b60005b8151811015611e28576001831415611d98576001600e6000848481518110611d3a57611d396153c7565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e15565b6002831415611e14576001600f6000848481518110611dba57611db96153c7565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b8080611e2090615291565b915050611d0f565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e5f612687565b73ffffffffffffffffffffffffffffffffffffffff16611e7d611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eca90614dc7565b60405180910390fd5b8060168190555050565b606060018054611eec9061522e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f189061522e565b8015611f655780601f10611f3a57610100808354040283529160200191611f65565b820191906000526020600020905b815481529060010190602001808311611f4857829003601f168201915b5050505050905090565b611f81611f7a612687565b8383612cc1565b5050565b611f8d612687565b73ffffffffffffffffffffffffffffffffffffffff16611fab611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890614dc7565b60405180910390fd5b80601c8190555050565b61201c612016612687565b83612748565b61205b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205290614e87565b60405180910390fd5b61206784848484612e2e565b50505050565b606061207882612e8a565b9050919050565b6002600c5414156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614ee7565b60405180910390fd5b6002600c81905550601760009054906101000a900460ff1661211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211390614c87565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219f90614e67565b60405180910390fd5b6015548111156121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490614ac7565b60405180910390fd5b60185461220582601954612a8d90919063ffffffff16565b1115612246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223d90614e07565b60405180910390fd5b601c5461226382612255610c84565b612a8d90919063ffffffff16565b11156122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90614f07565b60405180910390fd5b346122ba82601654612aa390919063ffffffff16565b11156122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290614ec7565b60405180910390fd5b6000600190505b81811161239f576000612328600161231a600d612ab9565b612a8d90919063ffffffff16565b9050601c548111612364576123496001601954612a8d90919063ffffffff16565b6019819055506123593382612ac7565b612363600d612ae5565b5b6018546019541061238b576000601760006101000a81548160ff0219169083151502179055505b50808061239790615291565b915050612302565b506001600c8190555050565b60165481565b60115481565b60195481565b60007358807bad0b376efc12f5ad86aac70e78ed67deae73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612410576001905061241d565b61241a8383612fdc565b90505b92915050565b61242b612687565b73ffffffffffffffffffffffffffffffffffffffff16612449611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249690614dc7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614b47565b60405180910390fd5b61251881612bfb565b50565b612523612687565b73ffffffffffffffffffffffffffffffffffffffff16612541611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258e90614dc7565b60405180910390fd5b80601a8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612614575061261382613070565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661270283611545565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127538261261b565b612792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278990614ca7565b60405180910390fd5b600061279d83611545565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127df57506127de81856123bd565b5b8061281d57508373ffffffffffffffffffffffffffffffffffffffff1661280584610ae7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661284682611545565b73ffffffffffffffffffffffffffffffffffffffff161461289c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289390614b67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290390614be7565b60405180910390fd5b612917838383613152565b61292260008261268f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129729190615144565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c99190615063565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a88838383613162565b505050565b60008183612a9b9190615063565b905092915050565b60008183612ab191906150ea565b905092915050565b600081600001549050919050565b612ae1828260405180602001604052806000815250613167565b5050565b6001816000016000828254019250508190555050565b80471015612b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3590614c67565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b64906149e5565b60006040518083038185875af1925050503d8060008114612ba1576040519150601f19603f3d011682016040523d82523d6000602084013e612ba6565b606091505b5050905080612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be190614c47565b60405180910390fd5b505050565b612bf8816131c2565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2790614c07565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e219190614a8a565b60405180910390a3505050565b612e39848484612826565b612e4584848484613215565b612e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7b90614b27565b60405180910390fd5b50505050565b6060612e958261261b565b612ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecb90614d47565b60405180910390fd5b6000600660008481526020019081526020016000208054612ef49061522e565b80601f0160208091040260200160405190810160405280929190818152602001828054612f209061522e565b8015612f6d5780601f10612f4257610100808354040283529160200191612f6d565b820191906000526020600020905b815481529060010190602001808311612f5057829003601f168201915b505050505090506000612f7e6133ac565b9050600081511415612f94578192505050612fd7565b600082511115612fc9578082604051602001612fb19291906149c1565b60405160208183030381529060405292505050612fd7565b612fd28461343e565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061313b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061314b575061314a826134e5565b5b9050919050565b61315d83838361354f565b505050565b505050565b6131718383613663565b61317e6000848484613215565b6131bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b490614b27565b60405180910390fd5b505050565b6131cb8161383d565b60006006600083815260200190815260200160002080546131eb9061522e565b905014613212576006600082815260200190815260200160002060006132119190613e6f565b5b50565b60006132368473ffffffffffffffffffffffffffffffffffffffff1661395a565b1561339f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261325f612687565b8786866040518563ffffffff1660e01b81526004016132819493929190614a15565b602060405180830381600087803b15801561329b57600080fd5b505af19250505080156132cc57506040513d601f19601f820116820180604052508101906132c991906142a3565b60015b61334f573d80600081146132fc576040519150601f19603f3d011682016040523d82523d6000602084013e613301565b606091505b50600081511415613347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333e90614b27565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133a4565b600190505b949350505050565b6060601e80546133bb9061522e565b80601f01602080910402602001604051908101604052809291908181526020018280546133e79061522e565b80156134345780601f1061340957610100808354040283529160200191613434565b820191906000526020600020905b81548152906001019060200180831161341757829003601f168201915b5050505050905090565b60606134498261261b565b613488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347f90614de7565b60405180910390fd5b60006134926133ac565b905060008151116134b257604051806020016040528060008152506134dd565b806134bc8461397d565b6040516020016134cd9291906149c1565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61355a838383613ade565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561359d5761359881613ae3565b6135dc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135db576135da8382613b2c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561361f5761361a81613c99565b61365e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461365d5761365c8282613d6a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ca90614d27565b60405180910390fd5b6136dc8161261b565b1561371c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371390614b87565b60405180910390fd5b61372860008383613152565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137789190615063565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461383960008383613162565b5050565b600061384882611545565b905061385681600084613152565b61386160008361268f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138b19190615144565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461395681600084613162565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156139c5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613ad9565b600082905060005b600082146139f75780806139e090615291565b915050600a826139f091906150b9565b91506139cd565b60008167ffffffffffffffff811115613a1357613a126153f6565b5b6040519080825280601f01601f191660200182016040528015613a455781602001600182028036833780820191505090505b5090505b60008514613ad257600182613a5e9190615144565b9150600a85613a6d91906152da565b6030613a799190615063565b60f81b818381518110613a8f57613a8e6153c7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613acb91906150b9565b9450613a49565b8093505050505b919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b398461168b565b613b439190615144565b9050600060086000848152602001908152602001600020549050818114613c28576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050613cad9190615144565b90506000600a6000848152602001908152602001600020549050600060098381548110613cdd57613cdc6153c7565b5b906000526020600020015490508060098381548110613cff57613cfe6153c7565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613d4e57613d4d615398565b5b6001900381819060005260206000200160009055905550505050565b6000613d758361168b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054613df59061522e565b90600052602060002090601f016020900481019282613e175760008555613e5e565b82601f10613e3057805160ff1916838001178555613e5e565b82800160010185558215613e5e579182015b82811115613e5d578251825591602001919060010190613e42565b5b509050613e6b9190613eaf565b5090565b508054613e7b9061522e565b6000825580601f10613e8d5750613eac565b601f016020900490600052602060002090810190613eab9190613eaf565b5b50565b5b80821115613ec8576000816000905550600101613eb0565b5090565b6000613edf613eda84614f87565b614f62565b90508083825260208201905082856020860282011115613f0257613f0161542a565b5b60005b85811015613f325781613f188882613fc0565b845260208401935060208301925050600181019050613f05565b5050509392505050565b6000613f4f613f4a84614fb3565b614f62565b905082815260208101848484011115613f6b57613f6a61542f565b5b613f768482856151ec565b509392505050565b6000613f91613f8c84614fe4565b614f62565b905082815260208101848484011115613fad57613fac61542f565b5b613fb88482856151ec565b509392505050565b600081359050613fcf81615df2565b92915050565b600082601f830112613fea57613fe9615425565b5b8135613ffa848260208601613ecc565b91505092915050565b60008135905061401281615e09565b92915050565b60008135905061402781615e20565b92915050565b60008151905061403c81615e20565b92915050565b600082601f83011261405757614056615425565b5b8135614067848260208601613f3c565b91505092915050565b600082601f83011261408557614084615425565b5b8135614095848260208601613f7e565b91505092915050565b6000813590506140ad81615e37565b92915050565b6000602082840312156140c9576140c8615439565b5b60006140d784828501613fc0565b91505092915050565b600080604083850312156140f7576140f6615439565b5b600061410585828601613fc0565b925050602061411685828601613fc0565b9150509250929050565b60008060006060848603121561413957614138615439565b5b600061414786828701613fc0565b935050602061415886828701613fc0565b92505060406141698682870161409e565b9150509250925092565b6000806000806080858703121561418d5761418c615439565b5b600061419b87828801613fc0565b94505060206141ac87828801613fc0565b93505060406141bd8782880161409e565b925050606085013567ffffffffffffffff8111156141de576141dd615434565b5b6141ea87828801614042565b91505092959194509250565b6000806040838503121561420d5761420c615439565b5b600061421b85828601613fc0565b925050602061422c85828601614003565b9150509250929050565b6000806040838503121561424d5761424c615439565b5b600061425b85828601613fc0565b925050602061426c8582860161409e565b9150509250929050565b60006020828403121561428c5761428b615439565b5b600061429a84828501614018565b91505092915050565b6000602082840312156142b9576142b8615439565b5b60006142c78482850161402d565b91505092915050565b6000602082840312156142e6576142e5615439565b5b600082013567ffffffffffffffff81111561430457614303615434565b5b61431084828501614070565b91505092915050565b60006020828403121561432f5761432e615439565b5b600061433d8482850161409e565b91505092915050565b6000806040838503121561435d5761435c615439565b5b600061436b8582860161409e565b925050602061437c85828601613fc0565b9150509250929050565b6000806040838503121561439d5761439c615439565b5b60006143ab8582860161409e565b925050602083013567ffffffffffffffff8111156143cc576143cb615434565b5b6143d885828601613fd5565b9150509250929050565b6143eb81615178565b82525050565b6143fa8161518a565b82525050565b600061440b82615015565b614415818561502b565b93506144258185602086016151fb565b61442e8161543e565b840191505092915050565b600061444482615020565b61444e8185615047565b935061445e8185602086016151fb565b6144678161543e565b840191505092915050565b600061447d82615020565b6144878185615058565b93506144978185602086016151fb565b80840191505092915050565b60006144b0602783615047565b91506144bb8261544f565b604082019050919050565b60006144d3602f83615047565b91506144de8261549e565b604082019050919050565b60006144f6602b83615047565b9150614501826154ed565b604082019050919050565b6000614519603283615047565b91506145248261553c565b604082019050919050565b600061453c602683615047565b91506145478261558b565b604082019050919050565b600061455f602583615047565b915061456a826155da565b604082019050919050565b6000614582601c83615047565b915061458d82615629565b602082019050919050565b60006145a5603783615047565b91506145b082615652565b604082019050919050565b60006145c8602483615047565b91506145d3826156a1565b604082019050919050565b60006145eb602483615047565b91506145f6826156f0565b604082019050919050565b600061460e601983615047565b91506146198261573f565b602082019050919050565b6000614631601483615047565b915061463c82615768565b602082019050919050565b6000614654603a83615047565b915061465f82615791565b604082019050919050565b6000614677601d83615047565b9150614682826157e0565b602082019050919050565b600061469a602e83615047565b91506146a582615809565b604082019050919050565b60006146bd602c83615047565b91506146c882615858565b604082019050919050565b60006146e0603883615047565b91506146eb826158a7565b604082019050919050565b6000614703602a83615047565b915061470e826158f6565b604082019050919050565b6000614726602983615047565b915061473182615945565b604082019050919050565b6000614749602083615047565b915061475482615994565b602082019050919050565b600061476c603183615047565b9150614777826159bd565b604082019050919050565b600061478f602c83615047565b915061479a82615a0c565b604082019050919050565b60006147b2601e83615047565b91506147bd82615a5b565b602082019050919050565b60006147d5603583615047565b91506147e082615a84565b604082019050919050565b60006147f8602083615047565b915061480382615ad3565b602082019050919050565b600061481b602f83615047565b915061482682615afc565b604082019050919050565b600061483e603683615047565b915061484982615b4b565b604082019050919050565b6000614861602183615047565b915061486c82615b9a565b604082019050919050565b6000614884602183615047565b915061488f82615be9565b604082019050919050565b60006148a7601f83615047565b91506148b282615c38565b602082019050919050565b60006148ca60008361503c565b91506148d582615c61565b600082019050919050565b60006148ed603183615047565b91506148f882615c64565b604082019050919050565b6000614910602c83615047565b915061491b82615cb3565b604082019050919050565b6000614933601d83615047565b915061493e82615d02565b602082019050919050565b6000614956601f83615047565b915061496182615d2b565b602082019050919050565b6000614979602c83615047565b915061498482615d54565b604082019050919050565b600061499c603083615047565b91506149a782615da3565b604082019050919050565b6149bb816151e2565b82525050565b60006149cd8285614472565b91506149d98284614472565b91508190509392505050565b60006149f0826148bd565b9150819050919050565b6000602082019050614a0f60008301846143e2565b92915050565b6000608082019050614a2a60008301876143e2565b614a3760208301866143e2565b614a4460408301856149b2565b8181036060830152614a568184614400565b905095945050505050565b6000604082019050614a7660008301856143e2565b614a8360208301846149b2565b9392505050565b6000602082019050614a9f60008301846143f1565b92915050565b60006020820190508181036000830152614abf8184614439565b905092915050565b60006020820190508181036000830152614ae0816144a3565b9050919050565b60006020820190508181036000830152614b00816144c6565b9050919050565b60006020820190508181036000830152614b20816144e9565b9050919050565b60006020820190508181036000830152614b408161450c565b9050919050565b60006020820190508181036000830152614b608161452f565b9050919050565b60006020820190508181036000830152614b8081614552565b9050919050565b60006020820190508181036000830152614ba081614575565b9050919050565b60006020820190508181036000830152614bc081614598565b9050919050565b60006020820190508181036000830152614be0816145bb565b9050919050565b60006020820190508181036000830152614c00816145de565b9050919050565b60006020820190508181036000830152614c2081614601565b9050919050565b60006020820190508181036000830152614c4081614624565b9050919050565b60006020820190508181036000830152614c6081614647565b9050919050565b60006020820190508181036000830152614c808161466a565b9050919050565b60006020820190508181036000830152614ca08161468d565b9050919050565b60006020820190508181036000830152614cc0816146b0565b9050919050565b60006020820190508181036000830152614ce0816146d3565b9050919050565b60006020820190508181036000830152614d00816146f6565b9050919050565b60006020820190508181036000830152614d2081614719565b9050919050565b60006020820190508181036000830152614d408161473c565b9050919050565b60006020820190508181036000830152614d608161475f565b9050919050565b60006020820190508181036000830152614d8081614782565b9050919050565b60006020820190508181036000830152614da0816147a5565b9050919050565b60006020820190508181036000830152614dc0816147c8565b9050919050565b60006020820190508181036000830152614de0816147eb565b9050919050565b60006020820190508181036000830152614e008161480e565b9050919050565b60006020820190508181036000830152614e2081614831565b9050919050565b60006020820190508181036000830152614e4081614854565b9050919050565b60006020820190508181036000830152614e6081614877565b9050919050565b60006020820190508181036000830152614e808161489a565b9050919050565b60006020820190508181036000830152614ea0816148e0565b9050919050565b60006020820190508181036000830152614ec081614903565b9050919050565b60006020820190508181036000830152614ee081614926565b9050919050565b60006020820190508181036000830152614f0081614949565b9050919050565b60006020820190508181036000830152614f208161496c565b9050919050565b60006020820190508181036000830152614f408161498f565b9050919050565b6000602082019050614f5c60008301846149b2565b92915050565b6000614f6c614f7d565b9050614f788282615260565b919050565b6000604051905090565b600067ffffffffffffffff821115614fa257614fa16153f6565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614fce57614fcd6153f6565b5b614fd78261543e565b9050602081019050919050565b600067ffffffffffffffff821115614fff57614ffe6153f6565b5b6150088261543e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061506e826151e2565b9150615079836151e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150ae576150ad61530b565b5b828201905092915050565b60006150c4826151e2565b91506150cf836151e2565b9250826150df576150de61533a565b5b828204905092915050565b60006150f5826151e2565b9150615100836151e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151395761513861530b565b5b828202905092915050565b600061514f826151e2565b915061515a836151e2565b92508282101561516d5761516c61530b565b5b828203905092915050565b6000615183826151c2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152195780820151818401526020810190506151fe565b83811115615228576000848401525b50505050565b6000600282049050600182168061524657607f821691505b6020821081141561525a57615259615369565b5b50919050565b6152698261543e565b810181811067ffffffffffffffff82111715615288576152876153f6565b5b80604052505050565b600061529c826151e2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152cf576152ce61530b565b5b600182019050919050565b60006152e5826151e2565b91506152f0836151e2565b925082615300576152ff61533a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e7420313020536176696f727320666f722047726560008201527f656e6c6973742e00000000000000000000000000000000000000000000000000602082015250565b7f467265656c6973742053616c65206d7573742062652061637469766520746f2060008201527f636c61696d206120536176696f722e0000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5768696c65206d696e74696e672c20796f752063616e206f6e6c7920686f6c6460008201527f2035303020536176696f727320617420612074696d652e000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f2062757920612053617660008201527f696f722e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f477265656e6c6973742053616c65206d7573742062652061637469766520746f60008201527f20627579206120536176696f722e000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f57616c6c6574206973206e6f74206f6e2074686520467265656c6973742e0000600082015250565b7f507572636861736520776f756c6420657863656564206d617820617661696c6160008201527f626c6520467265656c69737420536176696f72732e0000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820617661696c6160008201527f626c6520477265656e6c69737420536176696f72732e00000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420323020536176696f7273206174206f6e636560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206973206e6f74206f6e2074686520477265656e6c6973742e00600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4554482076616c75652073656e74206973206e6f7420636f7272656374000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f507572636861736520776f756c6420657863656564206d617820617661696c6160008201527f626c6520536176696f72732e0000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b615dfb81615178565b8114615e0657600080fd5b50565b615e128161518a565b8114615e1d57600080fd5b50565b615e2981615196565b8114615e3457600080fd5b50565b615e40816151e2565b8114615e4b57600080fd5b5056fea2646970667358221220eec1329fe821b48530d1915f54b0200f9a09ee067e603c2f1fd9c1dc00bdf3a764736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000012536176696f7273206f66207468652053656100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004534f545300000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Saviors of the Sea
Arg [1] : symbol (string): SOTS

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 536176696f7273206f6620746865205365610000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 534f545300000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

59636:8556:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61494:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37437:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38997:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38520:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54051:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39747:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63606:846;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53719:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63101:430;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60338:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60531:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62323:283;;;;;;;;;;;;;:::i;:::-;;40157:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50143:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54241:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60568:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67020:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62682:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37131:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60487:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60692:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36861:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15995:103;;;;;;;;;;;;;:::i;:::-;;60153:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61785:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67419:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65845:1051;;;:::i;:::-;;60298:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60108:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67528:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60069:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61982:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15344:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67219:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37606:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39290:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67318:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40413:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61290:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64530:1238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60249:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60024:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60385:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67721:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16253:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67130:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61494:212;61633:4;61662:36;61686:11;61662:23;:36::i;:::-;61655:43;;61494:212;;;:::o;37437:100::-;37491:13;37524:5;37517:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37437:100;:::o;38997:221::-;39073:7;39101:16;39109:7;39101;:16::i;:::-;39093:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39186:15;:24;39202:7;39186:24;;;;;;;;;;;;;;;;;;;;;39179:31;;38997:221;;;:::o;38520:411::-;38601:13;38617:23;38632:7;38617:14;:23::i;:::-;38601:39;;38665:5;38659:11;;:2;:11;;;;38651:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38759:5;38743:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38768:37;38785:5;38792:12;:10;:12::i;:::-;38768:16;:37::i;:::-;38743:62;38721:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;38902:21;38911:2;38915:7;38902:8;:21::i;:::-;38590:341;38520:411;;:::o;54051:113::-;54112:7;54139:10;:17;;;;54132:24;;54051:113;:::o;39747:339::-;39942:41;39961:12;:10;:12::i;:::-;39975:7;39942:18;:41::i;:::-;39934:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40050:28;40060:4;40066:2;40070:7;40050:9;:28::i;:::-;39747:339;;;:::o;63606:846::-;10318:1;10916:7;;:19;;10908:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10318:1;11049:7;:18;;;;63687:10:::1;;;;;;;;;;;63679:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;63766:2;63757:7;:11;;63749:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60477:3;63825:34;63851:7;63825:21;63835:10;63825:9;:21::i;:::-;:25;;:34;;;;:::i;:::-;:52;;63817:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;63986:14;;63956:26;63974:7;63956:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:44;;63948:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;64094:9;64068:22;64082:7;64068:9;;:13;;:22;;;;:::i;:::-;:35;;64060:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64163:9;64175:1;64163:13;;64158:277;64183:7;64178:1;:12;64158:277;;64211:17;64231:32;64261:1;64231:25;:15;:23;:25::i;:::-;:29;;:32;;;;:::i;:::-;64211:52;;64295:14;;64282:9;:27;64278:146;;64330:32;64340:10;64352:9;64330;:32::i;:::-;64381:27;:15;:25;:27::i;:::-;64278:146;64196:239;64192:3;;;;;:::i;:::-;;;;64158:277;;;;10274:1:::0;11228:7;:22;;;;63606:846;:::o;53719:256::-;53816:7;53852:23;53869:5;53852:16;:23::i;:::-;53844:5;:31;53836:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;53941:12;:19;53954:5;53941:19;;;;;;;;;;;;;;;:26;53961:5;53941:26;;;;;;;;;;;;53934:33;;53719:256;;;;:::o;63101:430::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63180:1:::1;63171:5;:10;63167:357;;;63213:12;;;;;;;;;;;63212:13;63197:12;;:28;;;;;;;;;;;;;;;;;;63167:357;;;63256:1;63247:5;:10;63243:281;;;63290:13;;;;;;;;;;;63289:14;63273:13;;:30;;;;;;;;;;;;;;;;;;63243:281;;;63334:1;63325:5;:10;63321:203;;;63365:10;;;;;;;;;;;63364:11;63351:10;;:24;;;;;;;;;;;;;;;;;;63321:203;;;63406:1;63397:5;:10;63393:131;;;63438:5;63423:12;;:20;;;;;;;;;;;;;;;;;;63474:5;63458:13;;:21;;;;;;;;;;;;;;;;;;63507:5;63494:10;;:18;;;;;;;;;;;;;;;;;;63393:131;63321:203;63243:281;63167:357;63101:430:::0;:::o;60338:40::-;;;;:::o;60531:30::-;;;;;;;;;;;;;:::o;62323:283::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62404:1:::1;62379:21;:26;;62371:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62441:15;62460:21;62441:41;;62493:50;62519:13;;;;;;;;;;;62535:7;62493:17;:50::i;:::-;62559:39;62575:13;;;;;;;;;;;62590:7;62559:39;;;;;;;:::i;:::-;;;;;;;;62360:246;62323:283::o:0;40157:185::-;40295:39;40312:4;40318:2;40322:7;40295:39;;;;;;;;;;;;:16;:39::i;:::-;40157:185;;;:::o;50143:245::-;50261:41;50280:12;:10;:12::i;:::-;50294:7;50261:18;:41::i;:::-;50253:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;50366:14;50372:7;50366:5;:14::i;:::-;50143:245;:::o;54241:233::-;54316:7;54352:30;:28;:30::i;:::-;54344:5;:38;54336:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54449:10;54460:5;54449:17;;;;;;;;:::i;:::-;;;;;;;;;;54442:24;;54241:233;;;:::o;60568:36::-;;;;:::o;67020:102::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67104:10:::1;67094:7;:20;;;;;;;;;;;;:::i;:::-;;67020:102:::0;:::o;62682:314::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62784:14:::1;62801:25;:15;:23;:25::i;:::-;62784:42;;62842:9;62854:1;62842:13;;62837:152;62862:14;62857:1;:19;62837:152;;62898:37;62908:11;62921:13;62932:1;62921:6;:10;;:13;;;;:::i;:::-;62898:9;:37::i;:::-;62950:27;:15;:25;:27::i;:::-;62878:3;;;;;:::i;:::-;;;;62837:152;;;;62765:231;62682:314:::0;;:::o;37131:239::-;37203:7;37223:13;37239:7;:16;37247:7;37239:16;;;;;;;;;;;;;;;;;;;;;37223:32;;37291:1;37274:19;;:5;:19;;;;37266:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37357:5;37350:12;;;37131:239;;;:::o;60487:37::-;;;;:::o;60692:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36861:208::-;36933:7;36978:1;36961:19;;:5;:19;;;;36953:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;37045:9;:16;37055:5;37045:16;;;;;;;;;;;;;;;;37038:23;;36861:208;;;:::o;15995:103::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16060:30:::1;16087:1;16060:18;:30::i;:::-;15995:103::o:0;60153:40::-;;;;:::o;61785:115::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61878:14:::1;61862:13;;:30;;;;;;;;;;;;;;;;;;61785:115:::0;:::o;67419:101::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67509:3:::1;67488:18;:24;;;;67419:101:::0;:::o;65845:1051::-;10318:1;10916:7;;:19;;10908:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10318:1;11049:7;:18;;;;65916:12:::1;;;;;;;;;;;65908:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;65999:16;:28;66016:10;65999:28;;;;;;;;;;;;;;;;;;;;;;;;;65991:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;66113:17;;66081:28;66107:1;66081:21;;:25;;:28;;;;:::i;:::-;:49;;66073:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;66231:14;;66207:20;66225:1;66207:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:38;;66199:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;66315:17;66335:32;66365:1;66335:25;:15;:23;:25::i;:::-;:29;;:32;;;;:::i;:::-;66315:52;;66395:14;;66382:9;:27;66378:344;;66457:5;66426:16;:28;66443:10;66426:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;66541:28;66567:1;66541:21;;:25;;:28;;;;:::i;:::-;66517:21;:52;;;;66620:32;66630:10;66642:9;66620;:32::i;:::-;66667:27;:15;:25;:27::i;:::-;66378:344;66824:17;;66799:21;;:42;66795:94;;66872:5;66857:12;;:20;;;;;;;;;;;;;;;;;;66795:94;65897:999;10274:1:::0;11228:7;:22;;;;65845:1051::o;60298:33::-;;;;;;;;;;;;;:::o;60108:38::-;;;;:::o;67528:99::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67616:3:::1;67596:17;:23;;;;67528:99:::0;:::o;60069:32::-;;;;;;;;;;;;;:::o;61982:333::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62072:9:::1;62067:240;62091:5;:12;62087:1;:16;62067:240;;;62137:1;62129:4;:9;62125:171;;;62187:4;62158:16;:26;62175:5;62181:1;62175:8;;;;;;;;:::i;:::-;;;;;;;;62158:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;62125:171;;;62225:1;62217:4;:9;62213:83;;;62276:4;62246:17;:27;62264:5;62270:1;62264:8;;;;;;;;:::i;:::-;;;;;;;;62246:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;62213:83;62125:171;62105:3;;;;;:::i;:::-;;;;62067:240;;;;61982:333:::0;;:::o;15344:87::-;15390:7;15417:6;;;;;;;;;;;15410:13;;15344:87;:::o;67219:91::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67300:2:::1;67283:14;:19;;;;67219:91:::0;:::o;37606:104::-;37662:13;37695:7;37688:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37606:104;:::o;39290:155::-;39385:52;39404:12;:10;:12::i;:::-;39418:8;39428;39385:18;:52::i;:::-;39290:155;;:::o;67318:93::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67400:3:::1;67383:14;:20;;;;67318:93:::0;:::o;40413:328::-;40588:41;40607:12;:10;:12::i;:::-;40621:7;40588:18;:41::i;:::-;40580:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40694:39;40708:4;40714:2;40718:7;40727:5;40694:13;:39::i;:::-;40413:328;;;;:::o;61290:196::-;61417:13;61455:23;61470:7;61455:14;:23::i;:::-;61448:30;;61290:196;;;:::o;64530:1238::-;10318:1;10916:7;;:19;;10908:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10318:1;11049:7;:18;;;;64614:13:::1;;;;;;;;;;;64606:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;64697:17;:29;64715:10;64697:29;;;;;;;;;;;;;;;;;;;;;;;;;64689:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64790:19;;64781:7;:28;;64773:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;64911:18;;64872:35;64899:7;64872:22;;:26;;:35;;;;:::i;:::-;:57;;64864:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;65037:14;;65007:26;65025:7;65007:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:44;;64999:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;65150:9;65119:27;65138:7;65119:14;;:18;;:27;;;;:::i;:::-;:40;;65111:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;65219:9;65231:1;65219:13;;65214:537;65239:7;65234:1;:12;65214:537;;65267:17;65287:32;65317:1;65287:25;:15;:23;:25::i;:::-;:29;;:32;;;;:::i;:::-;65267:52;;65351:14;;65338:9;:27;65334:219;;65411:29;65438:1;65411:22;;:26;;:29;;;;:::i;:::-;65386:22;:54;;;;65459:32;65469:10;65481:9;65459;:32::i;:::-;65510:27;:15;:25;:27::i;:::-;65334:219;65665:18;;65639:22;;:44;65635:105;;65719:5;65703:13;;:21;;;;;;;;;;;;;;;;;;65635:105;65252:499;65248:3;;;;;:::i;:::-;;;;65214:537;;;;10274:1:::0;11228:7;:22;;;;64530:1238;:::o;60249:42::-;;;;:::o;60024:38::-;;;;:::o;60385:41::-;;;;:::o;67721:468::-;67837:15;67964:42;67943:64;;:9;:64;;;67939:108;;;68031:4;68024:11;;;;67939:108;68139:42;68163:6;68171:9;68139:23;:42::i;:::-;68132:49;;67721:468;;;;;:::o;16253:201::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16362:1:::1;16342:22;;:8;:22;;;;16334:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16418:28;16437:8;16418:18;:28::i;:::-;16253:201:::0;:::o;67130:81::-;15575:12;:10;:12::i;:::-;15564:23;;:7;:5;:7::i;:::-;:23;;;15556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67201:2:::1;67189:9;:14;;;;67130:81:::0;:::o;53411:224::-;53513:4;53552:35;53537:50;;;:11;:50;;;;:90;;;;53591:36;53615:11;53591:23;:36::i;:::-;53537:90;53530:97;;53411:224;;;:::o;42251:127::-;42316:4;42368:1;42340:30;;:7;:16;42348:7;42340:16;;;;;;;;;;;;;;;;;;;;;:30;;;;42333:37;;42251:127;;;:::o;14068:98::-;14121:7;14148:10;14141:17;;14068:98;:::o;46397:174::-;46499:2;46472:15;:24;46488:7;46472:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46555:7;46551:2;46517:46;;46526:23;46541:7;46526:14;:23::i;:::-;46517:46;;;;;;;;;;;;46397:174;;:::o;42545:348::-;42638:4;42663:16;42671:7;42663;:16::i;:::-;42655:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42739:13;42755:23;42770:7;42755:14;:23::i;:::-;42739:39;;42808:5;42797:16;;:7;:16;;;:52;;;;42817:32;42834:5;42841:7;42817:16;:32::i;:::-;42797:52;:87;;;;42877:7;42853:31;;:20;42865:7;42853:11;:20::i;:::-;:31;;;42797:87;42789:96;;;42545:348;;;;:::o;45654:625::-;45813:4;45786:31;;:23;45801:7;45786:14;:23::i;:::-;:31;;;45778:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45892:1;45878:16;;:2;:16;;;;45870:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45948:39;45969:4;45975:2;45979:7;45948:20;:39::i;:::-;46052:29;46069:1;46073:7;46052:8;:29::i;:::-;46113:1;46094:9;:15;46104:4;46094:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;46142:1;46125:9;:13;46135:2;46125:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;46173:2;46154:7;:16;46162:7;46154:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46212:7;46208:2;46193:27;;46202:4;46193:27;;;;;;;;;;;;46233:38;46253:4;46259:2;46263:7;46233:19;:38::i;:::-;45654:625;;;:::o;2876:98::-;2934:7;2965:1;2961;:5;;;;:::i;:::-;2954:12;;2876:98;;;;:::o;3614:::-;3672:7;3703:1;3699;:5;;;;:::i;:::-;3692:12;;3614:98;;;;:::o;7913:114::-;7978:7;8005;:14;;;7998:21;;7913:114;;;:::o;43235:110::-;43311:26;43321:2;43325:7;43311:26;;;;;;;;;;;;:9;:26::i;:::-;43235:110;;:::o;8035:127::-;8142:1;8124:7;:14;;;:19;;;;;;;;;;;8035:127;:::o;19306:317::-;19421:6;19396:21;:31;;19388:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19475:12;19493:9;:14;;19515:6;19493:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19474:52;;;19545:7;19537:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;19377:246;19306:317;;:::o;61167:115::-;61254:20;61266:7;61254:11;:20::i;:::-;61167:115;:::o;16614:191::-;16688:16;16707:6;;;;;;;;;;;16688:25;;16733:8;16724:6;;:17;;;;;;;;;;;;;;;;;;16788:8;16757:40;;16778:8;16757:40;;;;;;;;;;;;16677:128;16614:191;:::o;46713:315::-;46868:8;46859:17;;:5;:17;;;;46851:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46955:8;46917:18;:25;46936:5;46917:25;;;;;;;;;;;;;;;:35;46943:8;46917:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;47001:8;46979:41;;46994:5;46979:41;;;47011:8;46979:41;;;;;;:::i;:::-;;;;;;;;46713:315;;;:::o;41623:::-;41780:28;41790:4;41796:2;41800:7;41780:9;:28::i;:::-;41827:48;41850:4;41856:2;41860:7;41869:5;41827:22;:48::i;:::-;41819:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41623:315;;;;:::o;50906:679::-;50979:13;51013:16;51021:7;51013;:16::i;:::-;51005:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;51096:23;51122:10;:19;51133:7;51122:19;;;;;;;;;;;51096:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51152:18;51173:10;:8;:10::i;:::-;51152:31;;51281:1;51265:4;51259:18;:23;51255:72;;;51306:9;51299:16;;;;;;51255:72;51457:1;51437:9;51431:23;:27;51427:108;;;51506:4;51512:9;51489:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51475:48;;;;;;51427:108;51554:23;51569:7;51554:14;:23::i;:::-;51547:30;;;;50906:679;;;;:::o;39516:164::-;39613:4;39637:18;:25;39656:5;39637:25;;;;;;;;;;;;;;;:35;39663:8;39637:35;;;;;;;;;;;;;;;;;;;;;;;;;39630:42;;39516:164;;;;:::o;36492:305::-;36594:4;36646:25;36631:40;;;:11;:40;;;;:105;;;;36703:33;36688:48;;;:11;:48;;;;36631:105;:158;;;;36753:36;36777:11;36753:23;:36::i;:::-;36631:158;36611:178;;36492:305;;;:::o;60955:204::-;61106:45;61133:4;61139:2;61143:7;61106:26;:45::i;:::-;60955:204;;;:::o;49475:125::-;;;;:::o;43572:321::-;43702:18;43708:2;43712:7;43702:5;:18::i;:::-;43753:54;43784:1;43788:2;43792:7;43801:5;43753:22;:54::i;:::-;43731:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;43572:321;;;:::o;52187:206::-;52256:20;52268:7;52256:11;:20::i;:::-;52330:1;52299:10;:19;52310:7;52299:19;;;;;;;;;;;52293:33;;;;;:::i;:::-;;;:38;52289:97;;52355:10;:19;52366:7;52355:19;;;;;;;;;;;;52348:26;;;;:::i;:::-;52289:97;52187:206;:::o;47593:799::-;47748:4;47769:15;:2;:13;;;:15::i;:::-;47765:620;;;47821:2;47805:36;;;47842:12;:10;:12::i;:::-;47856:4;47862:7;47871:5;47805:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47801:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48064:1;48047:6;:13;:18;48043:272;;;48090:60;;;;;;;;;;:::i;:::-;;;;;;;;48043:272;48265:6;48259:13;48250:6;48246:2;48242:15;48235:38;47801:529;47938:41;;;47928:51;;;:6;:51;;;;47921:58;;;;;47765:620;48369:4;48362:11;;47593:799;;;;;;;:::o;66904:108::-;66964:13;66997:7;66990:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66904:108;:::o;37781:334::-;37854:13;37888:16;37896:7;37888;:16::i;:::-;37880:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37969:21;37993:10;:8;:10::i;:::-;37969:34;;38045:1;38027:7;38021:21;:25;:86;;;;;;;;;;;;;;;;;38073:7;38082:18;:7;:16;:18::i;:::-;38056:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38021:86;38014:93;;;37781:334;;;:::o;28151:157::-;28236:4;28275:25;28260:40;;;:11;:40;;;;28253:47;;28151:157;;;:::o;55087:589::-;55231:45;55258:4;55264:2;55268:7;55231:26;:45::i;:::-;55309:1;55293:18;;:4;:18;;;55289:187;;;55328:40;55360:7;55328:31;:40::i;:::-;55289:187;;;55398:2;55390:10;;:4;:10;;;55386:90;;55417:47;55450:4;55456:7;55417:32;:47::i;:::-;55386:90;55289:187;55504:1;55490:16;;:2;:16;;;55486:183;;;55523:45;55560:7;55523:36;:45::i;:::-;55486:183;;;55596:4;55590:10;;:2;:10;;;55586:83;;55617:40;55645:2;55649:7;55617:27;:40::i;:::-;55586:83;55486:183;55087:589;;;:::o;44229:439::-;44323:1;44309:16;;:2;:16;;;;44301:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;44382:16;44390:7;44382;:16::i;:::-;44381:17;44373:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44444:45;44473:1;44477:2;44481:7;44444:20;:45::i;:::-;44519:1;44502:9;:13;44512:2;44502:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44550:2;44531:7;:16;44539:7;44531:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44595:7;44591:2;44570:33;;44587:1;44570:33;;;;;;;;;;;;44616:44;44644:1;44648:2;44652:7;44616:19;:44::i;:::-;44229:439;;:::o;44897:420::-;44957:13;44973:23;44988:7;44973:14;:23::i;:::-;44957:39;;45009:48;45030:5;45045:1;45049:7;45009:20;:48::i;:::-;45098:29;45115:1;45119:7;45098:8;:29::i;:::-;45160:1;45140:9;:16;45150:5;45140:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;45179:7;:16;45187:7;45179:16;;;;;;;;;;;;45172:23;;;;;;;;;;;45241:7;45237:1;45213:36;;45222:5;45213:36;;;;;;;;;;;;45262:47;45282:5;45297:1;45301:7;45262:19;:47::i;:::-;44946:371;44897:420;:::o;18045:326::-;18105:4;18362:1;18340:7;:19;;;:23;18333:30;;18045:326;;;:::o;11630:723::-;11686:13;11916:1;11907:5;:10;11903:53;;;11934:10;;;;;;;;;;;;;;;;;;;;;11903:53;11966:12;11981:5;11966:20;;11997:14;12022:78;12037:1;12029:4;:9;12022:78;;12055:8;;;;;:::i;:::-;;;;12086:2;12078:10;;;;;:::i;:::-;;;12022:78;;;12110:19;12142:6;12132:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12110:39;;12160:154;12176:1;12167:5;:10;12160:154;;12204:1;12194:11;;;;;:::i;:::-;;;12271:2;12263:5;:10;;;;:::i;:::-;12250:2;:24;;;;:::i;:::-;12237:39;;12220:6;12227;12220:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;12300:2;12291:11;;;;;:::i;:::-;;;12160:154;;;12338:6;12324:21;;;;;11630:723;;;;:::o;48964:126::-;;;;:::o;56399:164::-;56503:10;:17;;;;56476:15;:24;56492:7;56476:24;;;;;;;;;;;:44;;;;56531:10;56547:7;56531:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56399:164;:::o;57190:988::-;57456:22;57506:1;57481:22;57498:4;57481:16;:22::i;:::-;:26;;;;:::i;:::-;57456:51;;57518:18;57539:17;:26;57557:7;57539:26;;;;;;;;;;;;57518:47;;57686:14;57672:10;:28;57668:328;;57717:19;57739:12;:18;57752:4;57739:18;;;;;;;;;;;;;;;:34;57758:14;57739:34;;;;;;;;;;;;57717:56;;57823:11;57790:12;:18;57803:4;57790:18;;;;;;;;;;;;;;;:30;57809:10;57790:30;;;;;;;;;;;:44;;;;57940:10;57907:17;:30;57925:11;57907:30;;;;;;;;;;;:43;;;;57702:294;57668:328;58092:17;:26;58110:7;58092:26;;;;;;;;;;;58085:33;;;58136:12;:18;58149:4;58136:18;;;;;;;;;;;;;;;:34;58155:14;58136:34;;;;;;;;;;;58129:41;;;57271:907;;57190:988;;:::o;58473:1079::-;58726:22;58771:1;58751:10;:17;;;;:21;;;;:::i;:::-;58726:46;;58783:18;58804:15;:24;58820:7;58804:24;;;;;;;;;;;;58783:45;;59155:19;59177:10;59188:14;59177:26;;;;;;;;:::i;:::-;;;;;;;;;;59155:48;;59241:11;59216:10;59227;59216:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;59352:10;59321:15;:28;59337:11;59321:28;;;;;;;;;;;:41;;;;59493:15;:24;59509:7;59493:24;;;;;;;;;;;59486:31;;;59528:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58544:1008;;;58473:1079;:::o;55977:221::-;56062:14;56079:20;56096:2;56079:16;:20::i;:::-;56062:37;;56137:7;56110:12;:16;56123:2;56110:16;;;;;;;;;;;;;;;:24;56127:6;56110:24;;;;;;;;;;;:34;;;;56184:6;56155:17;:26;56173:7;56155:26;;;;;;;;;;;:35;;;;56051:147;55977:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:327::-;6816:6;6865:2;6853:9;6844:7;6840:23;6836:32;6833:119;;;6871:79;;:::i;:::-;6833:119;6991:1;7016:52;7060:7;7051:6;7040:9;7036:22;7016:52;:::i;:::-;7006:62;;6962:116;6758:327;;;;:::o;7091:349::-;7160:6;7209:2;7197:9;7188:7;7184:23;7180:32;7177:119;;;7215:79;;:::i;:::-;7177:119;7335:1;7360:63;7415:7;7406:6;7395:9;7391:22;7360:63;:::i;:::-;7350:73;;7306:127;7091:349;;;;:::o;7446:509::-;7515:6;7564:2;7552:9;7543:7;7539:23;7535:32;7532:119;;;7570:79;;:::i;:::-;7532:119;7718:1;7707:9;7703:17;7690:31;7748:18;7740:6;7737:30;7734:117;;;7770:79;;:::i;:::-;7734:117;7875:63;7930:7;7921:6;7910:9;7906:22;7875:63;:::i;:::-;7865:73;;7661:287;7446:509;;;;:::o;7961:329::-;8020:6;8069:2;8057:9;8048:7;8044:23;8040:32;8037:119;;;8075:79;;:::i;:::-;8037:119;8195:1;8220:53;8265:7;8256:6;8245:9;8241:22;8220:53;:::i;:::-;8210:63;;8166:117;7961:329;;;;:::o;8296:474::-;8364:6;8372;8421:2;8409:9;8400:7;8396:23;8392:32;8389:119;;;8427:79;;:::i;:::-;8389:119;8547:1;8572:53;8617:7;8608:6;8597:9;8593:22;8572:53;:::i;:::-;8562:63;;8518:117;8674:2;8700:53;8745:7;8736:6;8725:9;8721:22;8700:53;:::i;:::-;8690:63;;8645:118;8296:474;;;;;:::o;8776:684::-;8869:6;8877;8926:2;8914:9;8905:7;8901:23;8897:32;8894:119;;;8932:79;;:::i;:::-;8894:119;9052:1;9077:53;9122:7;9113:6;9102:9;9098:22;9077:53;:::i;:::-;9067:63;;9023:117;9207:2;9196:9;9192:18;9179:32;9238:18;9230:6;9227:30;9224:117;;;9260:79;;:::i;:::-;9224:117;9365:78;9435:7;9426:6;9415:9;9411:22;9365:78;:::i;:::-;9355:88;;9150:303;8776:684;;;;;:::o;9466:118::-;9553:24;9571:5;9553:24;:::i;:::-;9548:3;9541:37;9466:118;;:::o;9590:109::-;9671:21;9686:5;9671:21;:::i;:::-;9666:3;9659:34;9590:109;;:::o;9705:360::-;9791:3;9819:38;9851:5;9819:38;:::i;:::-;9873:70;9936:6;9931:3;9873:70;:::i;:::-;9866:77;;9952:52;9997:6;9992:3;9985:4;9978:5;9974:16;9952:52;:::i;:::-;10029:29;10051:6;10029:29;:::i;:::-;10024:3;10020:39;10013:46;;9795:270;9705:360;;;;:::o;10071:364::-;10159:3;10187:39;10220:5;10187:39;:::i;:::-;10242:71;10306:6;10301:3;10242:71;:::i;:::-;10235:78;;10322:52;10367:6;10362:3;10355:4;10348:5;10344:16;10322:52;:::i;:::-;10399:29;10421:6;10399:29;:::i;:::-;10394:3;10390:39;10383:46;;10163:272;10071:364;;;;:::o;10441:377::-;10547:3;10575:39;10608:5;10575:39;:::i;:::-;10630:89;10712:6;10707:3;10630:89;:::i;:::-;10623:96;;10728:52;10773:6;10768:3;10761:4;10754:5;10750:16;10728:52;:::i;:::-;10805:6;10800:3;10796:16;10789:23;;10551:267;10441:377;;;;:::o;10824:366::-;10966:3;10987:67;11051:2;11046:3;10987:67;:::i;:::-;10980:74;;11063:93;11152:3;11063:93;:::i;:::-;11181:2;11176:3;11172:12;11165:19;;10824:366;;;:::o;11196:::-;11338:3;11359:67;11423:2;11418:3;11359:67;:::i;:::-;11352:74;;11435:93;11524:3;11435:93;:::i;:::-;11553:2;11548:3;11544:12;11537:19;;11196:366;;;:::o;11568:::-;11710:3;11731:67;11795:2;11790:3;11731:67;:::i;:::-;11724:74;;11807:93;11896:3;11807:93;:::i;:::-;11925:2;11920:3;11916:12;11909:19;;11568:366;;;:::o;11940:::-;12082:3;12103:67;12167:2;12162:3;12103:67;:::i;:::-;12096:74;;12179:93;12268:3;12179:93;:::i;:::-;12297:2;12292:3;12288:12;12281:19;;11940:366;;;:::o;12312:::-;12454:3;12475:67;12539:2;12534:3;12475:67;:::i;:::-;12468:74;;12551:93;12640:3;12551:93;:::i;:::-;12669:2;12664:3;12660:12;12653:19;;12312:366;;;:::o;12684:::-;12826:3;12847:67;12911:2;12906:3;12847:67;:::i;:::-;12840:74;;12923:93;13012:3;12923:93;:::i;:::-;13041:2;13036:3;13032:12;13025:19;;12684:366;;;:::o;13056:::-;13198:3;13219:67;13283:2;13278:3;13219:67;:::i;:::-;13212:74;;13295:93;13384:3;13295:93;:::i;:::-;13413:2;13408:3;13404:12;13397:19;;13056:366;;;:::o;13428:::-;13570:3;13591:67;13655:2;13650:3;13591:67;:::i;:::-;13584:74;;13667:93;13756:3;13667:93;:::i;:::-;13785:2;13780:3;13776:12;13769:19;;13428:366;;;:::o;13800:::-;13942:3;13963:67;14027:2;14022:3;13963:67;:::i;:::-;13956:74;;14039:93;14128:3;14039:93;:::i;:::-;14157:2;14152:3;14148:12;14141:19;;13800:366;;;:::o;14172:::-;14314:3;14335:67;14399:2;14394:3;14335:67;:::i;:::-;14328:74;;14411:93;14500:3;14411:93;:::i;:::-;14529:2;14524:3;14520:12;14513:19;;14172:366;;;:::o;14544:::-;14686:3;14707:67;14771:2;14766:3;14707:67;:::i;:::-;14700:74;;14783:93;14872:3;14783:93;:::i;:::-;14901:2;14896:3;14892:12;14885:19;;14544:366;;;:::o;14916:::-;15058:3;15079:67;15143:2;15138:3;15079:67;:::i;:::-;15072:74;;15155:93;15244:3;15155:93;:::i;:::-;15273:2;15268:3;15264:12;15257:19;;14916:366;;;:::o;15288:::-;15430:3;15451:67;15515:2;15510:3;15451:67;:::i;:::-;15444:74;;15527:93;15616:3;15527:93;:::i;:::-;15645:2;15640:3;15636:12;15629:19;;15288:366;;;:::o;15660:::-;15802:3;15823:67;15887:2;15882:3;15823:67;:::i;:::-;15816:74;;15899:93;15988:3;15899:93;:::i;:::-;16017:2;16012:3;16008:12;16001:19;;15660:366;;;:::o;16032:::-;16174:3;16195:67;16259:2;16254:3;16195:67;:::i;:::-;16188:74;;16271:93;16360:3;16271:93;:::i;:::-;16389:2;16384:3;16380:12;16373:19;;16032:366;;;:::o;16404:::-;16546:3;16567:67;16631:2;16626:3;16567:67;:::i;:::-;16560:74;;16643:93;16732:3;16643:93;:::i;:::-;16761:2;16756:3;16752:12;16745:19;;16404:366;;;:::o;16776:::-;16918:3;16939:67;17003:2;16998:3;16939:67;:::i;:::-;16932:74;;17015:93;17104:3;17015:93;:::i;:::-;17133:2;17128:3;17124:12;17117:19;;16776:366;;;:::o;17148:::-;17290:3;17311:67;17375:2;17370:3;17311:67;:::i;:::-;17304:74;;17387:93;17476:3;17387:93;:::i;:::-;17505:2;17500:3;17496:12;17489:19;;17148:366;;;:::o;17520:::-;17662:3;17683:67;17747:2;17742:3;17683:67;:::i;:::-;17676:74;;17759:93;17848:3;17759:93;:::i;:::-;17877:2;17872:3;17868:12;17861:19;;17520:366;;;:::o;17892:::-;18034:3;18055:67;18119:2;18114:3;18055:67;:::i;:::-;18048:74;;18131:93;18220:3;18131:93;:::i;:::-;18249:2;18244:3;18240:12;18233:19;;17892:366;;;:::o;18264:::-;18406:3;18427:67;18491:2;18486:3;18427:67;:::i;:::-;18420:74;;18503:93;18592:3;18503:93;:::i;:::-;18621:2;18616:3;18612:12;18605:19;;18264:366;;;:::o;18636:::-;18778:3;18799:67;18863:2;18858:3;18799:67;:::i;:::-;18792:74;;18875:93;18964:3;18875:93;:::i;:::-;18993:2;18988:3;18984:12;18977:19;;18636:366;;;:::o;19008:::-;19150:3;19171:67;19235:2;19230:3;19171:67;:::i;:::-;19164:74;;19247:93;19336:3;19247:93;:::i;:::-;19365:2;19360:3;19356:12;19349:19;;19008:366;;;:::o;19380:::-;19522:3;19543:67;19607:2;19602:3;19543:67;:::i;:::-;19536:74;;19619:93;19708:3;19619:93;:::i;:::-;19737:2;19732:3;19728:12;19721:19;;19380:366;;;:::o;19752:::-;19894:3;19915:67;19979:2;19974:3;19915:67;:::i;:::-;19908:74;;19991:93;20080:3;19991:93;:::i;:::-;20109:2;20104:3;20100:12;20093:19;;19752:366;;;:::o;20124:::-;20266:3;20287:67;20351:2;20346:3;20287:67;:::i;:::-;20280:74;;20363:93;20452:3;20363:93;:::i;:::-;20481:2;20476:3;20472:12;20465:19;;20124:366;;;:::o;20496:::-;20638:3;20659:67;20723:2;20718:3;20659:67;:::i;:::-;20652:74;;20735:93;20824:3;20735:93;:::i;:::-;20853:2;20848:3;20844:12;20837:19;;20496:366;;;:::o;20868:::-;21010:3;21031:67;21095:2;21090:3;21031:67;:::i;:::-;21024:74;;21107:93;21196:3;21107:93;:::i;:::-;21225:2;21220:3;21216:12;21209:19;;20868:366;;;:::o;21240:::-;21382:3;21403:67;21467:2;21462:3;21403:67;:::i;:::-;21396:74;;21479:93;21568:3;21479:93;:::i;:::-;21597:2;21592:3;21588:12;21581:19;;21240:366;;;:::o;21612:::-;21754:3;21775:67;21839:2;21834:3;21775:67;:::i;:::-;21768:74;;21851:93;21940:3;21851:93;:::i;:::-;21969:2;21964:3;21960:12;21953:19;;21612:366;;;:::o;21984:398::-;22143:3;22164:83;22245:1;22240:3;22164:83;:::i;:::-;22157:90;;22256:93;22345:3;22256:93;:::i;:::-;22374:1;22369:3;22365:11;22358:18;;21984:398;;;:::o;22388:366::-;22530:3;22551:67;22615:2;22610:3;22551:67;:::i;:::-;22544:74;;22627:93;22716:3;22627:93;:::i;:::-;22745:2;22740:3;22736:12;22729:19;;22388:366;;;:::o;22760:::-;22902:3;22923:67;22987:2;22982:3;22923:67;:::i;:::-;22916:74;;22999:93;23088:3;22999:93;:::i;:::-;23117:2;23112:3;23108:12;23101:19;;22760:366;;;:::o;23132:::-;23274:3;23295:67;23359:2;23354:3;23295:67;:::i;:::-;23288:74;;23371:93;23460:3;23371:93;:::i;:::-;23489:2;23484:3;23480:12;23473:19;;23132:366;;;:::o;23504:::-;23646:3;23667:67;23731:2;23726:3;23667:67;:::i;:::-;23660:74;;23743:93;23832:3;23743:93;:::i;:::-;23861:2;23856:3;23852:12;23845:19;;23504:366;;;:::o;23876:::-;24018:3;24039:67;24103:2;24098:3;24039:67;:::i;:::-;24032:74;;24115:93;24204:3;24115:93;:::i;:::-;24233:2;24228:3;24224:12;24217:19;;23876:366;;;:::o;24248:::-;24390:3;24411:67;24475:2;24470:3;24411:67;:::i;:::-;24404:74;;24487:93;24576:3;24487:93;:::i;:::-;24605:2;24600:3;24596:12;24589:19;;24248:366;;;:::o;24620:118::-;24707:24;24725:5;24707:24;:::i;:::-;24702:3;24695:37;24620:118;;:::o;24744:435::-;24924:3;24946:95;25037:3;25028:6;24946:95;:::i;:::-;24939:102;;25058:95;25149:3;25140:6;25058:95;:::i;:::-;25051:102;;25170:3;25163:10;;24744:435;;;;;:::o;25185:379::-;25369:3;25391:147;25534:3;25391:147;:::i;:::-;25384:154;;25555:3;25548:10;;25185:379;;;:::o;25570:222::-;25663:4;25701:2;25690:9;25686:18;25678:26;;25714:71;25782:1;25771:9;25767:17;25758:6;25714:71;:::i;:::-;25570:222;;;;:::o;25798:640::-;25993:4;26031:3;26020:9;26016:19;26008:27;;26045:71;26113:1;26102:9;26098:17;26089:6;26045:71;:::i;:::-;26126:72;26194:2;26183:9;26179:18;26170:6;26126:72;:::i;:::-;26208;26276:2;26265:9;26261:18;26252:6;26208:72;:::i;:::-;26327:9;26321:4;26317:20;26312:2;26301:9;26297:18;26290:48;26355:76;26426:4;26417:6;26355:76;:::i;:::-;26347:84;;25798:640;;;;;;;:::o;26444:332::-;26565:4;26603:2;26592:9;26588:18;26580:26;;26616:71;26684:1;26673:9;26669:17;26660:6;26616:71;:::i;:::-;26697:72;26765:2;26754:9;26750:18;26741:6;26697:72;:::i;:::-;26444:332;;;;;:::o;26782:210::-;26869:4;26907:2;26896:9;26892:18;26884:26;;26920:65;26982:1;26971:9;26967:17;26958:6;26920:65;:::i;:::-;26782:210;;;;:::o;26998:313::-;27111:4;27149:2;27138:9;27134:18;27126:26;;27198:9;27192:4;27188:20;27184:1;27173:9;27169:17;27162:47;27226:78;27299:4;27290:6;27226:78;:::i;:::-;27218:86;;26998:313;;;;:::o;27317:419::-;27483:4;27521:2;27510:9;27506:18;27498:26;;27570:9;27564:4;27560:20;27556:1;27545:9;27541:17;27534:47;27598:131;27724:4;27598:131;:::i;:::-;27590:139;;27317:419;;;:::o;27742:::-;27908:4;27946:2;27935:9;27931:18;27923:26;;27995:9;27989:4;27985:20;27981:1;27970:9;27966:17;27959:47;28023:131;28149:4;28023:131;:::i;:::-;28015:139;;27742:419;;;:::o;28167:::-;28333:4;28371:2;28360:9;28356:18;28348:26;;28420:9;28414:4;28410:20;28406:1;28395:9;28391:17;28384:47;28448:131;28574:4;28448:131;:::i;:::-;28440:139;;28167:419;;;:::o;28592:::-;28758:4;28796:2;28785:9;28781:18;28773:26;;28845:9;28839:4;28835:20;28831:1;28820:9;28816:17;28809:47;28873:131;28999:4;28873:131;:::i;:::-;28865:139;;28592:419;;;:::o;29017:::-;29183:4;29221:2;29210:9;29206:18;29198:26;;29270:9;29264:4;29260:20;29256:1;29245:9;29241:17;29234:47;29298:131;29424:4;29298:131;:::i;:::-;29290:139;;29017:419;;;:::o;29442:::-;29608:4;29646:2;29635:9;29631:18;29623:26;;29695:9;29689:4;29685:20;29681:1;29670:9;29666:17;29659:47;29723:131;29849:4;29723:131;:::i;:::-;29715:139;;29442:419;;;:::o;29867:::-;30033:4;30071:2;30060:9;30056:18;30048:26;;30120:9;30114:4;30110:20;30106:1;30095:9;30091:17;30084:47;30148:131;30274:4;30148:131;:::i;:::-;30140:139;;29867:419;;;:::o;30292:::-;30458:4;30496:2;30485:9;30481:18;30473:26;;30545:9;30539:4;30535:20;30531:1;30520:9;30516:17;30509:47;30573:131;30699:4;30573:131;:::i;:::-;30565:139;;30292:419;;;:::o;30717:::-;30883:4;30921:2;30910:9;30906:18;30898:26;;30970:9;30964:4;30960:20;30956:1;30945:9;30941:17;30934:47;30998:131;31124:4;30998:131;:::i;:::-;30990:139;;30717:419;;;:::o;31142:::-;31308:4;31346:2;31335:9;31331:18;31323:26;;31395:9;31389:4;31385:20;31381:1;31370:9;31366:17;31359:47;31423:131;31549:4;31423:131;:::i;:::-;31415:139;;31142:419;;;:::o;31567:::-;31733:4;31771:2;31760:9;31756:18;31748:26;;31820:9;31814:4;31810:20;31806:1;31795:9;31791:17;31784:47;31848:131;31974:4;31848:131;:::i;:::-;31840:139;;31567:419;;;:::o;31992:::-;32158:4;32196:2;32185:9;32181:18;32173:26;;32245:9;32239:4;32235:20;32231:1;32220:9;32216:17;32209:47;32273:131;32399:4;32273:131;:::i;:::-;32265:139;;31992:419;;;:::o;32417:::-;32583:4;32621:2;32610:9;32606:18;32598:26;;32670:9;32664:4;32660:20;32656:1;32645:9;32641:17;32634:47;32698:131;32824:4;32698:131;:::i;:::-;32690:139;;32417:419;;;:::o;32842:::-;33008:4;33046:2;33035:9;33031:18;33023:26;;33095:9;33089:4;33085:20;33081:1;33070:9;33066:17;33059:47;33123:131;33249:4;33123:131;:::i;:::-;33115:139;;32842:419;;;:::o;33267:::-;33433:4;33471:2;33460:9;33456:18;33448:26;;33520:9;33514:4;33510:20;33506:1;33495:9;33491:17;33484:47;33548:131;33674:4;33548:131;:::i;:::-;33540:139;;33267:419;;;:::o;33692:::-;33858:4;33896:2;33885:9;33881:18;33873:26;;33945:9;33939:4;33935:20;33931:1;33920:9;33916:17;33909:47;33973:131;34099:4;33973:131;:::i;:::-;33965:139;;33692:419;;;:::o;34117:::-;34283:4;34321:2;34310:9;34306:18;34298:26;;34370:9;34364:4;34360:20;34356:1;34345:9;34341:17;34334:47;34398:131;34524:4;34398:131;:::i;:::-;34390:139;;34117:419;;;:::o;34542:::-;34708:4;34746:2;34735:9;34731:18;34723:26;;34795:9;34789:4;34785:20;34781:1;34770:9;34766:17;34759:47;34823:131;34949:4;34823:131;:::i;:::-;34815:139;;34542:419;;;:::o;34967:::-;35133:4;35171:2;35160:9;35156:18;35148:26;;35220:9;35214:4;35210:20;35206:1;35195:9;35191:17;35184:47;35248:131;35374:4;35248:131;:::i;:::-;35240:139;;34967:419;;;:::o;35392:::-;35558:4;35596:2;35585:9;35581:18;35573:26;;35645:9;35639:4;35635:20;35631:1;35620:9;35616:17;35609:47;35673:131;35799:4;35673:131;:::i;:::-;35665:139;;35392:419;;;:::o;35817:::-;35983:4;36021:2;36010:9;36006:18;35998:26;;36070:9;36064:4;36060:20;36056:1;36045:9;36041:17;36034:47;36098:131;36224:4;36098:131;:::i;:::-;36090:139;;35817:419;;;:::o;36242:::-;36408:4;36446:2;36435:9;36431:18;36423:26;;36495:9;36489:4;36485:20;36481:1;36470:9;36466:17;36459:47;36523:131;36649:4;36523:131;:::i;:::-;36515:139;;36242:419;;;:::o;36667:::-;36833:4;36871:2;36860:9;36856:18;36848:26;;36920:9;36914:4;36910:20;36906:1;36895:9;36891:17;36884:47;36948:131;37074:4;36948:131;:::i;:::-;36940:139;;36667:419;;;:::o;37092:::-;37258:4;37296:2;37285:9;37281:18;37273:26;;37345:9;37339:4;37335:20;37331:1;37320:9;37316:17;37309:47;37373:131;37499:4;37373:131;:::i;:::-;37365:139;;37092:419;;;:::o;37517:::-;37683:4;37721:2;37710:9;37706:18;37698:26;;37770:9;37764:4;37760:20;37756:1;37745:9;37741:17;37734:47;37798:131;37924:4;37798:131;:::i;:::-;37790:139;;37517:419;;;:::o;37942:::-;38108:4;38146:2;38135:9;38131:18;38123:26;;38195:9;38189:4;38185:20;38181:1;38170:9;38166:17;38159:47;38223:131;38349:4;38223:131;:::i;:::-;38215:139;;37942:419;;;:::o;38367:::-;38533:4;38571:2;38560:9;38556:18;38548:26;;38620:9;38614:4;38610:20;38606:1;38595:9;38591:17;38584:47;38648:131;38774:4;38648:131;:::i;:::-;38640:139;;38367:419;;;:::o;38792:::-;38958:4;38996:2;38985:9;38981:18;38973:26;;39045:9;39039:4;39035:20;39031:1;39020:9;39016:17;39009:47;39073:131;39199:4;39073:131;:::i;:::-;39065:139;;38792:419;;;:::o;39217:::-;39383:4;39421:2;39410:9;39406:18;39398:26;;39470:9;39464:4;39460:20;39456:1;39445:9;39441:17;39434:47;39498:131;39624:4;39498:131;:::i;:::-;39490:139;;39217:419;;;:::o;39642:::-;39808:4;39846:2;39835:9;39831:18;39823:26;;39895:9;39889:4;39885:20;39881:1;39870:9;39866:17;39859:47;39923:131;40049:4;39923:131;:::i;:::-;39915:139;;39642:419;;;:::o;40067:::-;40233:4;40271:2;40260:9;40256:18;40248:26;;40320:9;40314:4;40310:20;40306:1;40295:9;40291:17;40284:47;40348:131;40474:4;40348:131;:::i;:::-;40340:139;;40067:419;;;:::o;40492:::-;40658:4;40696:2;40685:9;40681:18;40673:26;;40745:9;40739:4;40735:20;40731:1;40720:9;40716:17;40709:47;40773:131;40899:4;40773:131;:::i;:::-;40765:139;;40492:419;;;:::o;40917:::-;41083:4;41121:2;41110:9;41106:18;41098:26;;41170:9;41164:4;41160:20;41156:1;41145:9;41141:17;41134:47;41198:131;41324:4;41198:131;:::i;:::-;41190:139;;40917:419;;;:::o;41342:::-;41508:4;41546:2;41535:9;41531:18;41523:26;;41595:9;41589:4;41585:20;41581:1;41570:9;41566:17;41559:47;41623:131;41749:4;41623:131;:::i;:::-;41615:139;;41342:419;;;:::o;41767:::-;41933:4;41971:2;41960:9;41956:18;41948:26;;42020:9;42014:4;42010:20;42006:1;41995:9;41991:17;41984:47;42048:131;42174:4;42048:131;:::i;:::-;42040:139;;41767:419;;;:::o;42192:::-;42358:4;42396:2;42385:9;42381:18;42373:26;;42445:9;42439:4;42435:20;42431:1;42420:9;42416:17;42409:47;42473:131;42599:4;42473:131;:::i;:::-;42465:139;;42192:419;;;:::o;42617:222::-;42710:4;42748:2;42737:9;42733:18;42725:26;;42761:71;42829:1;42818:9;42814:17;42805:6;42761:71;:::i;:::-;42617:222;;;;:::o;42845:129::-;42879:6;42906:20;;:::i;:::-;42896:30;;42935:33;42963:4;42955:6;42935:33;:::i;:::-;42845:129;;;:::o;42980:75::-;43013:6;43046:2;43040:9;43030:19;;42980:75;:::o;43061:311::-;43138:4;43228:18;43220:6;43217:30;43214:56;;;43250:18;;:::i;:::-;43214:56;43300:4;43292:6;43288:17;43280:25;;43360:4;43354;43350:15;43342:23;;43061:311;;;:::o;43378:307::-;43439:4;43529:18;43521:6;43518:30;43515:56;;;43551:18;;:::i;:::-;43515:56;43589:29;43611:6;43589:29;:::i;:::-;43581:37;;43673:4;43667;43663:15;43655:23;;43378:307;;;:::o;43691:308::-;43753:4;43843:18;43835:6;43832:30;43829:56;;;43865:18;;:::i;:::-;43829:56;43903:29;43925:6;43903:29;:::i;:::-;43895:37;;43987:4;43981;43977:15;43969:23;;43691:308;;;:::o;44005:98::-;44056:6;44090:5;44084:12;44074:22;;44005:98;;;:::o;44109:99::-;44161:6;44195:5;44189:12;44179:22;;44109:99;;;:::o;44214:168::-;44297:11;44331:6;44326:3;44319:19;44371:4;44366:3;44362:14;44347:29;;44214:168;;;;:::o;44388:147::-;44489:11;44526:3;44511:18;;44388:147;;;;:::o;44541:169::-;44625:11;44659:6;44654:3;44647:19;44699:4;44694:3;44690:14;44675:29;;44541:169;;;;:::o;44716:148::-;44818:11;44855:3;44840:18;;44716:148;;;;:::o;44870:305::-;44910:3;44929:20;44947:1;44929:20;:::i;:::-;44924:25;;44963:20;44981:1;44963:20;:::i;:::-;44958:25;;45117:1;45049:66;45045:74;45042:1;45039:81;45036:107;;;45123:18;;:::i;:::-;45036:107;45167:1;45164;45160:9;45153:16;;44870:305;;;;:::o;45181:185::-;45221:1;45238:20;45256:1;45238:20;:::i;:::-;45233:25;;45272:20;45290:1;45272:20;:::i;:::-;45267:25;;45311:1;45301:35;;45316:18;;:::i;:::-;45301:35;45358:1;45355;45351:9;45346:14;;45181:185;;;;:::o;45372:348::-;45412:7;45435:20;45453:1;45435:20;:::i;:::-;45430:25;;45469:20;45487:1;45469:20;:::i;:::-;45464:25;;45657:1;45589:66;45585:74;45582:1;45579:81;45574:1;45567:9;45560:17;45556:105;45553:131;;;45664:18;;:::i;:::-;45553:131;45712:1;45709;45705:9;45694:20;;45372:348;;;;:::o;45726:191::-;45766:4;45786:20;45804:1;45786:20;:::i;:::-;45781:25;;45820:20;45838:1;45820:20;:::i;:::-;45815:25;;45859:1;45856;45853:8;45850:34;;;45864:18;;:::i;:::-;45850:34;45909:1;45906;45902:9;45894:17;;45726:191;;;;:::o;45923:96::-;45960:7;45989:24;46007:5;45989:24;:::i;:::-;45978:35;;45923:96;;;:::o;46025:90::-;46059:7;46102:5;46095:13;46088:21;46077:32;;46025:90;;;:::o;46121:149::-;46157:7;46197:66;46190:5;46186:78;46175:89;;46121:149;;;:::o;46276:126::-;46313:7;46353:42;46346:5;46342:54;46331:65;;46276:126;;;:::o;46408:77::-;46445:7;46474:5;46463:16;;46408:77;;;:::o;46491:154::-;46575:6;46570:3;46565;46552:30;46637:1;46628:6;46623:3;46619:16;46612:27;46491:154;;;:::o;46651:307::-;46719:1;46729:113;46743:6;46740:1;46737:13;46729:113;;;46828:1;46823:3;46819:11;46813:18;46809:1;46804:3;46800:11;46793:39;46765:2;46762:1;46758:10;46753:15;;46729:113;;;46860:6;46857:1;46854:13;46851:101;;;46940:1;46931:6;46926:3;46922:16;46915:27;46851:101;46700:258;46651:307;;;:::o;46964:320::-;47008:6;47045:1;47039:4;47035:12;47025:22;;47092:1;47086:4;47082:12;47113:18;47103:81;;47169:4;47161:6;47157:17;47147:27;;47103:81;47231:2;47223:6;47220:14;47200:18;47197:38;47194:84;;;47250:18;;:::i;:::-;47194:84;47015:269;46964:320;;;:::o;47290:281::-;47373:27;47395:4;47373:27;:::i;:::-;47365:6;47361:40;47503:6;47491:10;47488:22;47467:18;47455:10;47452:34;47449:62;47446:88;;;47514:18;;:::i;:::-;47446:88;47554:10;47550:2;47543:22;47333:238;47290:281;;:::o;47577:233::-;47616:3;47639:24;47657:5;47639:24;:::i;:::-;47630:33;;47685:66;47678:5;47675:77;47672:103;;;47755:18;;:::i;:::-;47672:103;47802:1;47795:5;47791:13;47784:20;;47577:233;;;:::o;47816:176::-;47848:1;47865:20;47883:1;47865:20;:::i;:::-;47860:25;;47899:20;47917:1;47899:20;:::i;:::-;47894:25;;47938:1;47928:35;;47943:18;;:::i;:::-;47928:35;47984:1;47981;47977:9;47972:14;;47816:176;;;;:::o;47998:180::-;48046:77;48043:1;48036:88;48143:4;48140:1;48133:15;48167:4;48164:1;48157:15;48184:180;48232:77;48229:1;48222:88;48329:4;48326:1;48319:15;48353:4;48350:1;48343:15;48370:180;48418:77;48415:1;48408:88;48515:4;48512:1;48505:15;48539:4;48536:1;48529:15;48556:180;48604:77;48601:1;48594:88;48701:4;48698:1;48691:15;48725:4;48722:1;48715:15;48742:180;48790:77;48787:1;48780:88;48887:4;48884:1;48877:15;48911:4;48908:1;48901:15;48928:180;48976:77;48973:1;48966:88;49073:4;49070:1;49063:15;49097:4;49094:1;49087:15;49114:117;49223:1;49220;49213:12;49237:117;49346:1;49343;49336:12;49360:117;49469:1;49466;49459:12;49483:117;49592:1;49589;49582:12;49606:117;49715:1;49712;49705:12;49729:102;49770:6;49821:2;49817:7;49812:2;49805:5;49801:14;49797:28;49787:38;;49729:102;;;:::o;49837:226::-;49977:34;49973:1;49965:6;49961:14;49954:58;50046:9;50041:2;50033:6;50029:15;50022:34;49837:226;:::o;50069:234::-;50209:34;50205:1;50197:6;50193:14;50186:58;50278:17;50273:2;50265:6;50261:15;50254:42;50069:234;:::o;50309:230::-;50449:34;50445:1;50437:6;50433:14;50426:58;50518:13;50513:2;50505:6;50501:15;50494:38;50309:230;:::o;50545:237::-;50685:34;50681:1;50673:6;50669:14;50662:58;50754:20;50749:2;50741:6;50737:15;50730:45;50545:237;:::o;50788:225::-;50928:34;50924:1;50916:6;50912:14;50905:58;50997:8;50992:2;50984:6;50980:15;50973:33;50788:225;:::o;51019:224::-;51159:34;51155:1;51147:6;51143:14;51136:58;51228:7;51223:2;51215:6;51211:15;51204:32;51019:224;:::o;51249:178::-;51389:30;51385:1;51377:6;51373:14;51366:54;51249:178;:::o;51433:242::-;51573:34;51569:1;51561:6;51557:14;51550:58;51642:25;51637:2;51629:6;51625:15;51618:50;51433:242;:::o;51681:223::-;51821:34;51817:1;51809:6;51805:14;51798:58;51890:6;51885:2;51877:6;51873:15;51866:31;51681:223;:::o;51910:::-;52050:34;52046:1;52038:6;52034:14;52027:58;52119:6;52114:2;52106:6;52102:15;52095:31;51910:223;:::o;52139:175::-;52279:27;52275:1;52267:6;52263:14;52256:51;52139:175;:::o;52320:170::-;52460:22;52456:1;52448:6;52444:14;52437:46;52320:170;:::o;52496:245::-;52636:34;52632:1;52624:6;52620:14;52613:58;52705:28;52700:2;52692:6;52688:15;52681:53;52496:245;:::o;52747:179::-;52887:31;52883:1;52875:6;52871:14;52864:55;52747:179;:::o;52932:233::-;53072:34;53068:1;53060:6;53056:14;53049:58;53141:16;53136:2;53128:6;53124:15;53117:41;52932:233;:::o;53171:231::-;53311:34;53307:1;53299:6;53295:14;53288:58;53380:14;53375:2;53367:6;53363:15;53356:39;53171:231;:::o;53408:243::-;53548:34;53544:1;53536:6;53532:14;53525:58;53617:26;53612:2;53604:6;53600:15;53593:51;53408:243;:::o;53657:229::-;53797:34;53793:1;53785:6;53781:14;53774:58;53866:12;53861:2;53853:6;53849:15;53842:37;53657:229;:::o;53892:228::-;54032:34;54028:1;54020:6;54016:14;54009:58;54101:11;54096:2;54088:6;54084:15;54077:36;53892:228;:::o;54126:182::-;54266:34;54262:1;54254:6;54250:14;54243:58;54126:182;:::o;54314:236::-;54454:34;54450:1;54442:6;54438:14;54431:58;54523:19;54518:2;54510:6;54506:15;54499:44;54314:236;:::o;54556:231::-;54696:34;54692:1;54684:6;54680:14;54673:58;54765:14;54760:2;54752:6;54748:15;54741:39;54556:231;:::o;54793:180::-;54933:32;54929:1;54921:6;54917:14;54910:56;54793:180;:::o;54979:240::-;55119:34;55115:1;55107:6;55103:14;55096:58;55188:23;55183:2;55175:6;55171:15;55164:48;54979:240;:::o;55225:182::-;55365:34;55361:1;55353:6;55349:14;55342:58;55225:182;:::o;55413:234::-;55553:34;55549:1;55541:6;55537:14;55530:58;55622:17;55617:2;55609:6;55605:15;55598:42;55413:234;:::o;55653:241::-;55793:34;55789:1;55781:6;55777:14;55770:58;55862:24;55857:2;55849:6;55845:15;55838:49;55653:241;:::o;55900:220::-;56040:34;56036:1;56028:6;56024:14;56017:58;56109:3;56104:2;56096:6;56092:15;56085:28;55900:220;:::o;56126:::-;56266:34;56262:1;56254:6;56250:14;56243:58;56335:3;56330:2;56322:6;56318:15;56311:28;56126:220;:::o;56352:181::-;56492:33;56488:1;56480:6;56476:14;56469:57;56352:181;:::o;56539:114::-;;:::o;56659:236::-;56799:34;56795:1;56787:6;56783:14;56776:58;56868:19;56863:2;56855:6;56851:15;56844:44;56659:236;:::o;56901:231::-;57041:34;57037:1;57029:6;57025:14;57018:58;57110:14;57105:2;57097:6;57093:15;57086:39;56901:231;:::o;57138:179::-;57278:31;57274:1;57266:6;57262:14;57255:55;57138:179;:::o;57323:181::-;57463:33;57459:1;57451:6;57447:14;57440:57;57323:181;:::o;57510:231::-;57650:34;57646:1;57638:6;57634:14;57627:58;57719:14;57714:2;57706:6;57702:15;57695:39;57510:231;:::o;57747:235::-;57887:34;57883:1;57875:6;57871:14;57864:58;57956:18;57951:2;57943:6;57939:15;57932:43;57747:235;:::o;57988:122::-;58061:24;58079:5;58061:24;:::i;:::-;58054:5;58051:35;58041:63;;58100:1;58097;58090:12;58041:63;57988:122;:::o;58116:116::-;58186:21;58201:5;58186:21;:::i;:::-;58179:5;58176:32;58166:60;;58222:1;58219;58212:12;58166:60;58116:116;:::o;58238:120::-;58310:23;58327:5;58310:23;:::i;:::-;58303:5;58300:34;58290:62;;58348:1;58345;58338:12;58290:62;58238:120;:::o;58364:122::-;58437:24;58455:5;58437:24;:::i;:::-;58430:5;58427:35;58417:63;;58476:1;58473;58466:12;58417:63;58364:122;:::o

Swarm Source

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