ETH Price: $2,679.37 (-0.60%)

Token

Humans Versus Applesnakes (Appleland)
 

Overview

Max Total Supply

0 Appleland

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
cybernetwork.eth
Balance
14 Appleland
0x33bd8d5a4f40285df90694ccb29d6f5859c3977e
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:
HumansVersusApplesnakes

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-07
*/

// 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/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-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.8.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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.2) (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;

    
    mapping(address => bool) public jailer;
    mapping(uint256 => uint256) public jailTime;
    mapping(uint256 => uint256) public tokenBirthday;
    mapping(uint256 => uint256) public snakeBreedTime;
    mapping(uint256 => bool) public Snake;

    event MetadataUpdate(uint256 _tokenId);

    struct BackData {
    address Dep;
    uint256 breedingCount;
    uint256 SnakeCount;
    uint256 HumanCount;
    bool JailEnabled;
    bool Revealed;
    }
    BackData public BackendDatabase;

    string uri;
    uint256 Count = 0;
 
    /**
     * @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_;
        BackendDatabase = BackData(
            0xF5226f23063F3a40Ef21cdA06EB0226d72cfB57E, // deployer
            3001, // breeding count
            0, // snake count
            0, // human count
            true, //jail enabled
            false //revealed
        );
        uri = "https://bafybeic2nvsafg3wxhkhnroelibwycu2w5km3carairwix3azrauxyexjm.ipfs.nftstorage.link/";
    }

    function breed(uint256 human1, uint256 human2, uint256 human3, uint256 snake1) public {
        address user = msg.sender;
        IERC721 NFT = IERC721(this);
        require(
        NFT.ownerOf(human1) == user && 
        NFT.ownerOf(human2) == user && 
        NFT.ownerOf(human3) == user && 
        NFT.ownerOf(snake1) == user, 
        "You don't own these tokens"
        );
        require(snakeBreedTime[snake1] == 0 || snakeBreedTime[snake1] < block.timestamp, "This snake is not yet ready to breed.");
        snakeBreedTime[snake1] = block.timestamp + 86400;
        _burn(human1);
        _burn(human2);
        _burn(human3);
        _mint(user, BackendDatabase.breedingCount);
        BackendDatabase.breedingCount++;
    }
    function setJailer(bool mode, address user) public {
        require(msg.sender == BackendDatabase.Dep, "Admin permission only"); 
        jailer[user] = mode;
    }
    function TurnOffJail(bool mode) public {
       require(msg.sender == BackendDatabase.Dep, "Admin permission only"); 
       BackendDatabase.JailEnabled = mode;
    }
    function adminJail(uint256[] memory tokenIds, uint256 tier) public {
        require(msg.sender == BackendDatabase.Dep || jailer[msg.sender] == true, "Admin permission only"); 
        uint256 time = 0; // 24 hour jailtime for tier one punishments
        if (tier == 1) {
            time = block.timestamp + 86400; // one day jailtime for tier one punishments 
        } else if (tier == 2) {
            time = block.timestamp + 604800; // one week jailtime for tier two punishments 
        }
        for (uint i=0; i < tokenIds.length; i++) {
        require(Snake[tokenIds[i]] == false, "Snakes can't go to jail!");
        jailTime[tokenIds[i]] =  time;
        emit MetadataUpdate(tokenIds[i]);
        }


    }
    function Bail(uint256 tokenId) public payable {
        uint256 cost = 5*10**15;
        require(Snake[tokenId] == false, "This token cant go to jail");
        require(msg.value >= cost, "Did not send the correct jail fee");
        jailTime[tokenId] = 0;
        emit MetadataUpdate(tokenId);

    }
    function Jail(uint256 tokenId, uint256 tier) public payable {
        uint256 cost = 5*10**15;
        uint256 time = 0; // 24 hour jailtime for tier one punishments
        if (tier == 1) {
            time = block.timestamp + 86400; // one day jailtime for tier one punishments 
        } else if (tier == 2) {
            time = block.timestamp + 604800; // one week jailtime for tier two punishments 
            cost = 1*10**16;
        }
        require(Snake[tokenId] == false, "This token cant go to jail");
        require(msg.value >= cost, "Did not send the correct jail fee");
        jailTime[tokenId] = time;
        emit MetadataUpdate(tokenId);
    }
    /**
     * @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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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;
    }


    function Reveal() public {
        require(msg.sender == BackendDatabase.Dep, "Admin permission only");
        BackendDatabase.Revealed = true;
    }
    /**
     * @dev See {IERC721Metadata-tokenURI}.


     */

    function changeURI(string calldata newURI) public {
        require(msg.sender == BackendDatabase.Dep, "Admin permission only");
        uri = newURI;
    }
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);
        string memory baseURI = _baseURI();

        if (jailTime[tokenId] < block.timestamp || jailTime[tokenId] == 0) {

        if (tokenBirthday[tokenId] < block.timestamp && BackendDatabase.Revealed == true) {
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : "";
        } else {
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "Egg.json")) : "";
        } 

        } else {
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "Jail.json")) : "";
        }


        
    }

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

    /**
     * @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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;
        tokenBirthday[tokenId] = block.timestamp + 3600;

        if (tokenId <= 3000) { // 300 snakes 2700 humans
        if (Count == 9) {
            Count = 0;
            Snake[tokenId] = true; // every 10th is a snake
            BackendDatabase.SnakeCount++;
        } else {
            Count++; // this is not a snake
            BackendDatabase.HumanCount++;
        }
        } else {
            Snake[tokenId] = true; // the remaining are snakes
            BackendDatabase.SnakeCount++;
        }
        emit Transfer(address(0), to, tokenId);

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

    /**
     * @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, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        if (BackendDatabase.JailEnabled == true && Snake[tokenId] == false) {
        require(jailTime[tokenId] < block.timestamp || jailTime[tokenId] == 0, "This NFT is in JAIL!"); 
        jailTime[tokenId] = block.timestamp + 3600; // one hour jail for transfer! 
        }

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
        emit MetadataUpdate(tokenId);
        
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}


}

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


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be 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), "ERC721: caller is not token owner or approved");
        _burn(tokenId);
    }
}

// File: NFT.sol


pragma solidity ^0.8.9;




contract HumansVersusApplesnakes is ERC721 {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;


    struct NFTData {
    address Deployer;
    uint256 TokensLeft;
    uint256 mintPrice;
    uint256 freeCount;
    uint256 mintTime;

    }

    NFTData public Database;
    mapping (address => uint256) public whitelist;
    mapping (address => bool) public quest;
    constructor() ERC721("Humans Versus Applesnakes", "Appleland") {
        Database = NFTData(
        0xF5226f23063F3a40Ef21cdA06EB0226d72cfB57E, // Deployer Address
        3000, // Tokens Left
        3*10**15, // mintPrice
        100, // freeCount
        1680876000 // mint start time
        );
        _tokenIdCounter.increment();
    }
    function setMintTime(uint256 newTime) public {
        address user = msg.sender;
        require(user == Database.Deployer, "Admin permission only");
        Database.mintTime = newTime;
    }

    function AddWhitelist(address[] calldata Addresses, uint256 amount) public {
        address user = msg.sender;
        require(user == Database.Deployer, "Admin permission only");
        for (uint i = 0; i < Addresses.length; i++) {
        whitelist[Addresses[i]] += amount;
        }
    }
    function freeWhitelist() public {
        address user = msg.sender;
        require(quest[user] == false && Database.freeCount >= 1, "You aren't allowed to do this");
        quest[user] = true;
        whitelist[user] += 3;
        Database.freeCount--;
    }
    function safeMint(uint256 amount, bool free) payable public {
        address user = msg.sender;
        require(Database.TokensLeft >= amount, "There are no tokens left!");
        require(block.timestamp > Database.mintTime, "Mint is not yet active!");
        uint256 cost = amount * Database.mintPrice;
        if (free == true) {
            require(whitelist[user] >= amount, "You do not have a whitelist for this amount of nfts");
            cost = 0;
            whitelist[user] -= amount;
        }
        require(msg.value >= cost, "You did not send the correct ammount of eth for this mint!");
        for (uint i = 0; i < amount; i++) {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        Database.TokensLeft--;
        _safeMint(user, tokenId);  
        }


    }

    function withdrawETH() public {
        address payable user = payable(msg.sender);
        require(user == Database.Deployer, "Admin permission only");
        user.transfer(address(this).balance);
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"Addresses","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BackendDatabase","outputs":[{"internalType":"address","name":"Dep","type":"address"},{"internalType":"uint256","name":"breedingCount","type":"uint256"},{"internalType":"uint256","name":"SnakeCount","type":"uint256"},{"internalType":"uint256","name":"HumanCount","type":"uint256"},{"internalType":"bool","name":"JailEnabled","type":"bool"},{"internalType":"bool","name":"Revealed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Bail","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Database","outputs":[{"internalType":"address","name":"Deployer","type":"address"},{"internalType":"uint256","name":"TokensLeft","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"freeCount","type":"uint256"},{"internalType":"uint256","name":"mintTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"Jail","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Snake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"mode","type":"bool"}],"name":"TurnOffJail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"adminJail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"human1","type":"uint256"},{"internalType":"uint256","name":"human2","type":"uint256"},{"internalType":"uint256","name":"human3","type":"uint256"},{"internalType":"uint256","name":"snake1","type":"uint256"}],"name":"breed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"jailTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"jailer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"","type":"address"}],"name":"quest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"free","type":"bool"}],"name":"safeMint","outputs":[],"stateMutability":"payable","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":"bool","name":"mode","type":"bool"},{"internalType":"address","name":"user","type":"address"}],"name":"setJailer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"setMintTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snakeBreedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"","type":"uint256"}],"name":"tokenBirthday","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":[{"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":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006011553480156200001657600080fd5b506040518060400160405280601981526020017f48756d616e7320566572737573204170706c65736e616b6573000000000000008152506040518060400160405280600981526020017f4170706c656c616e64000000000000000000000000000000000000000000000081525081600090816200009491906200055f565b508060019081620000a691906200055f565b506040518060c0016040528073f5226f23063f3a40ef21cda06eb0226d72cfb57e73ffffffffffffffffffffffffffffffffffffffff168152602001610bb98152602001600081526020016000815260200160011515815260200160001515815250600b60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160040160016101000a81548160ff021916908315150217905550905050604051806080016040528060598152602001620058b56059913960109081620001dc91906200055f565b5050506040518060a0016040528073f5226f23063f3a40ef21cda06eb0226d72cfb57e73ffffffffffffffffffffffffffffffffffffffff168152602001610bb88152602001660aa87bee53800081526020016064815260200163643021e0815250601360008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040155905050620002c96012620002cf60201b620023611760201c565b62000646565b6001816000016000828254019250508190555050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036757607f821691505b6020821081036200037d576200037c6200031f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003e77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a8565b620003f38683620003a8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004406200043a62000434846200040b565b62000415565b6200040b565b9050919050565b6000819050919050565b6200045c836200041f565b620004746200046b8262000447565b848454620003b5565b825550505050565b600090565b6200048b6200047c565b6200049881848462000451565b505050565b5b81811015620004c057620004b460008262000481565b6001810190506200049e565b5050565b601f8211156200050f57620004d98162000383565b620004e48462000398565b81016020851015620004f4578190505b6200050c620005038562000398565b8301826200049d565b50505b505050565b600082821c905092915050565b6000620005346000198460080262000514565b1980831691505092915050565b60006200054f838362000521565b9150826002028217905092915050565b6200056a82620002e5565b67ffffffffffffffff811115620005865762000585620002f0565b5b6200059282546200034e565b6200059f828285620004c4565b600060209050601f831160018114620005d75760008415620005c2578287015190505b620005ce858262000541565b8655506200063e565b601f198416620005e78662000383565b60005b828110156200061157848901518255600182019150602085019450602081019050620005ea565b868310156200063157848901516200062d601f89168262000521565b8355505b6001600288020188555050505b505050505050565b61525f80620006566000396000f3fe6080604052600436106102045760003560e01c80637b90918411610118578063bb4e6ebc116100a0578063e086e5ec1161006f578063e086e5ec14610779578063e367f8b114610790578063e5e01c11146107cd578063e985e9c5146107f6578063e9c160fc1461083357610204565b8063bb4e6ebc14610699578063bbc97771146106d6578063c87b56dd14610713578063dda52d531461075057610204565b806395d89b41116100e757806395d89b41146105c35780639b19251a146105ee578063a22cb4651461062b578063a7049b9a14610654578063b88d4fde1461067057610204565b80637b909184146105115780638621fa9c1461052d5780638ad2f89b146105495780638fee7c0d1461058657610204565b806332d13e531161019b578063533265e61161016a578063533265e61461042857806357188aa2146104575780636352211e1461048057806366b9f0d2146104bd57806370a08231146104d457610204565b806332d13e531461038f57806339aeaa9d146103bf57806342842e0e146103d657806352e2fd21146103ff57610204565b8063095ea7b3116101d7578063095ea7b3146102d7578063124a2024146103005780631a36b7461461032957806323b872dd1461036657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc1461027157806308a4a26a146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906135b4565b61085c565b60405161023d91906135fc565b60405180910390f35b34801561025257600080fd5b5061025b61093e565b60405161026891906136a7565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906136ff565b6109d0565b6040516102a5919061376d565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613788565b610a16565b005b3480156102e357600080fd5b506102fe60048036038101906102f9919061381b565b610dfd565b005b34801561030c57600080fd5b5061032760048036038101906103229190613887565b610f14565b005b34801561033557600080fd5b50610350600480360381019061034b91906136ff565b611002565b60405161035d91906138d6565b60405180910390f35b34801561037257600080fd5b5061038d600480360381019061038891906138f1565b61101a565b005b34801561039b57600080fd5b506103a461107a565b6040516103b696959493929190613944565b60405180910390f35b3480156103cb57600080fd5b506103d46110de565b005b3480156103e257600080fd5b506103fd60048036038101906103f891906138f1565b611255565b005b34801561040b57600080fd5b50610426600480360381019061042191906139a5565b611275565b005b34801561043457600080fd5b5061043d611328565b60405161044e9594939291906139d2565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613a8a565b61136c565b005b34801561048c57600080fd5b506104a760048036038101906104a291906136ff565b6114a9565b6040516104b4919061376d565b60405180910390f35b3480156104c957600080fd5b506104d261152f565b005b3480156104e057600080fd5b506104fb60048036038101906104f69190613aea565b6115e2565b60405161050891906138d6565b60405180910390f35b61052b600480360381019061052691906136ff565b611699565b005b61054760048036038101906105429190613b17565b6117a3565b005b34801561055557600080fd5b50610570600480360381019061056b91906136ff565b6119db565b60405161057d91906135fc565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a891906136ff565b6119fb565b6040516105ba91906138d6565b60405180910390f35b3480156105cf57600080fd5b506105d8611a13565b6040516105e591906136a7565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190613aea565b611aa5565b60405161062291906138d6565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190613b57565b611abd565b005b61066e60048036038101906106699190613b97565b611ad3565b005b34801561067c57600080fd5b5061069760048036038101906106929190613d07565b611c23565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190613aea565b611c85565b6040516106cd91906135fc565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f891906136ff565b611ca5565b60405161070a91906138d6565b60405180910390f35b34801561071f57600080fd5b5061073a600480360381019061073591906136ff565b611cbd565b60405161074791906136a7565b60405180910390f35b34801561075c57600080fd5b50610777600480360381019061077291906136ff565b611e2a565b005b34801561078557600080fd5b5061078e611ed0565b005b34801561079c57600080fd5b506107b760048036038101906107b29190613aea565b611fb2565b6040516107c491906135fc565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613de0565b611fd2565b005b34801561080257600080fd5b5061081d60048036038101906108189190613e2d565b61207b565b60405161082a91906135fc565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190613f30565b61210f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610937575061093682612377565b5b9050919050565b60606000805461094d90613fbb565b80601f016020809104026020016040519081016040528092919081815260200182805461097990613fbb565b80156109c65780601f1061099b576101008083540402835291602001916109c6565b820191906000526020600020905b8154815290600101906020018083116109a957829003601f168201915b5050505050905090565b60006109db826123e1565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905060003090508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b8152600401610a7091906138d6565b602060405180830381865afa158015610a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab19190614001565b73ffffffffffffffffffffffffffffffffffffffff16148015610b7857508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b8152600401610b1f91906138d6565b602060405180830381865afa158015610b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b609190614001565b73ffffffffffffffffffffffffffffffffffffffff16145b8015610c2857508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401610bcf91906138d6565b602060405180830381865afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190614001565b73ffffffffffffffffffffffffffffffffffffffff16145b8015610cd857508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610c7f91906138d6565b602060405180830381865afa158015610c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc09190614001565b73ffffffffffffffffffffffffffffffffffffffff16145b610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e9061407a565b60405180910390fd5b600060096000858152602001908152602001600020541480610d4b5750426009600085815260200190815260200160002054105b610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d819061410c565b60405180910390fd5b6201518042610d99919061415b565b6009600085815260200190815260200160002081905550610db98661242c565b610dc28561242c565b610dcb8461242c565b610dda82600b6001015461257a565b600b6001016000815480929190610df09061418f565b9190505550505050505050565b6000610e08826114a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f90614249565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e976128a4565b73ffffffffffffffffffffffffffffffffffffffff161480610ec65750610ec581610ec06128a4565b61207b565b5b610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc906142db565b60405180910390fd5b610f0f83836128ac565b505050565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614347565b60405180910390fd5b81600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60086020528060005260406000206000915090505481565b61102b6110256128a4565b82612965565b61106a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611061906143d9565b60405180910390fd5b6110758383836129fa565b505050565b600b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900460ff16908060040160019054906101000a900460ff16905086565b600033905060001515601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151480156111495750600160136003015410155b611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90614445565b60405180910390fd5b6001601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611230919061415b565b925050819055506013600301600081548092919061124d90614465565b919050555050565b61127083838360405180602001604052806000815250611c23565b505050565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90614347565b60405180910390fd5b80600b60040160006101000a81548160ff02191690831515021790555050565b60138060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b6000339050601360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614347565b60405180910390fd5b60005b848490508110156114a257826018600087878581811061142a5761142961448e565b5b905060200201602081019061143f9190613aea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611488919061415b565b92505081905550808061149a9061418f565b915050611407565b5050505050565b6000806114b583612e12565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d90614509565b60405180910390fd5b80915050919050565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990614347565b60405180910390fd5b6001600b60040160016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061459b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006611c37937e08000905060001515600a600084815260200190815260200160002060009054906101000a900460ff1615151461170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170390614607565b60405180910390fd5b8034101561174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690614699565b60405180910390fd5b600060076000848152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78260405161179791906138d6565b60405180910390a15050565b60003390508260136001015410156117f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e790614705565b60405180910390fd5b6013600401544211611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614771565b60405180910390fd5b60006013600201548461184a9190614791565b905060011515831515036119355783601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156118da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d190614845565b60405180910390fd5b6000905083601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461192d9190614865565b925050819055505b80341015611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f9061490b565b60405180910390fd5b60005b848110156119d457600061198f6012612e4f565b905061199b6012612361565b601360010160008154809291906119b190614465565b91905055506119c08482612e5d565b5080806119cc9061418f565b91505061197b565b5050505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b60096020528060005260406000206000915090505481565b606060018054611a2290613fbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4e90613fbb565b8015611a9b5780601f10611a7057610100808354040283529160200191611a9b565b820191906000526020600020905b815481529060010190602001808311611a7e57829003601f168201915b5050505050905090565b60186020528060005260406000206000915090505481565b611acf611ac86128a4565b8383612e7b565b5050565b60006611c37937e080009050600060018303611aff576201518042611af8919061415b565b9050611b24565b60028303611b235762093a8042611b16919061415b565b9050662386f26fc1000091505b5b60001515600a600086815260200190815260200160002060009054906101000a900460ff16151514611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614607565b60405180910390fd5b81341015611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590614699565b60405180910390fd5b8060076000868152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce784604051611c1591906138d6565b60405180910390a150505050565b611c34611c2e6128a4565b83612965565b611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a906143d9565b60405180910390fd5b611c7f84848484612fe7565b50505050565b60196020528060005260406000206000915054906101000a900460ff1681565b60076020528060005260406000206000915090505481565b6060611cc8826123e1565b6000611cd2613043565b90504260076000858152602001908152602001600020541080611d08575060006007600085815260200190815260200160002054145b15611de257426008600085815260200190815260200160002054108015611d45575060011515600b60040160019054906101000a900460ff161515145b15611d9b576000815111611d685760405180602001604052806000815250611d93565b80611d72846130d5565b604051602001611d839291906149b3565b6040516020818303038152906040525b915050611e25565b6000815111611db95760405180602001604052806000815250611dda565b80604051602001611dca9190614a2e565b6040516020818303038152906040525b915050611e25565b6000815111611e005760405180602001604052806000815250611e21565b80604051602001611e119190614a9c565b6040516020818303038152906040525b9150505b919050565b6000339050601360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb990614347565b60405180910390fd5b816013600401819055505050565b6000339050601360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90614347565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611fae573d6000803e3d6000fd5b5050565b60066020528060005260406000206000915054906101000a900460ff1681565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205c90614347565b60405180910390fd5b818160109182612076929190614c75565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121be575060011515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f490614347565b60405180910390fd5b60006001820361221d576201518042612216919061415b565b9050612238565b600282036122375762093a8042612234919061415b565b90505b5b60005b835181101561235b5760001515600a600086848151811061225f5761225e61448e565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161515146122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bc90614d91565b60405180910390fd5b81600760008684815181106122dd576122dc61448e565b5b60200260200101518152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce784828151811061232b5761232a61448e565b5b602002602001015160405161234091906138d6565b60405180910390a180806123539061418f565b91505061223b565b50505050565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123ea816131a3565b612429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242090614509565b60405180910390fd5b50565b6000612437826114a9565b90506124478160008460016131e4565b612450826114a9565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125768160008460016131ea565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e090614dfd565b60405180910390fd5b6125f2816131a3565b15612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614e69565b60405180910390fd5b6126406000838360016131e4565b612649816131a3565b15612689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268090614e69565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e1042612737919061415b565b6008600083815260200190815260200160002081905550610bb881116127ee576009601154036127b55760006011819055506001600a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600b60020160008154809291906127ab9061418f565b91905055506127e9565b601160008154809291906127c89061418f565b9190505550600b60030160008154809291906127e39061418f565b91905055505b612836565b6001600a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600b60020160008154809291906128309061418f565b91905055505b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a06000838360016131ea565b5050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661291f836114a9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612971836114a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129b357506129b2818561207b565b5b806129f157508373ffffffffffffffffffffffffffffffffffffffff166129d9846109d0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a1a826114a9565b73ffffffffffffffffffffffffffffffffffffffff1614612a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6790614efb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad690614f8d565b60405180910390fd5b612aec83838360016131e4565b8273ffffffffffffffffffffffffffffffffffffffff16612b0c826114a9565b73ffffffffffffffffffffffffffffffffffffffff1614612b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5990614efb565b60405180910390fd5b60011515600b60040160009054906101000a900460ff161515148015612bac575060001515600a600083815260200190815260200160002060009054906101000a900460ff161515145b15612c4a574260076000838152602001908152602001600020541080612be5575060006007600083815260200190815260200160002054145b612c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1b90614ff9565b60405180910390fd5b610e1042612c32919061415b565b60076000838152602001908152602001600020819055505b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dd683838360016131ea565b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce781604051612e0591906138d6565b60405180910390a1505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b612e778282604051806020016040528060008152506131f0565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee090615065565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612fda91906135fc565b60405180910390a3505050565b612ff28484846129fa565b612ffe8484848461324b565b61303d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613034906150f7565b60405180910390fd5b50505050565b60606010805461305290613fbb565b80601f016020809104026020016040519081016040528092919081815260200182805461307e90613fbb565b80156130cb5780601f106130a0576101008083540402835291602001916130cb565b820191906000526020600020905b8154815290600101906020018083116130ae57829003601f168201915b5050505050905090565b6060600060016130e4846133d2565b01905060008167ffffffffffffffff81111561310357613102613bdc565b5b6040519080825280601f01601f1916602001820160405280156131355781602001600182028036833780820191505090505b509050600082602001820190505b600115613198578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161318c5761318b615117565b5b04945060008503613143575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166131c583612e12565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6131fa838361257a565b613207600084848461324b565b613246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323d906150f7565b60405180910390fd5b505050565b600061326c8473ffffffffffffffffffffffffffffffffffffffff16613525565b156133c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132956128a4565b8786866040518563ffffffff1660e01b81526004016132b7949392919061519b565b6020604051808303816000875af19250505080156132f357506040513d601f19601f820116820180604052508101906132f091906151fc565b60015b613375573d8060008114613323576040519150601f19603f3d011682016040523d82523d6000602084013e613328565b606091505b50600081510361336d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613364906150f7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133ca565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613430577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161342657613425615117565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061346d576d04ee2d6d415b85acef8100000000838161346357613462615117565b5b0492506020810190505b662386f26fc10000831061349c57662386f26fc10000838161349257613491615117565b5b0492506010810190505b6305f5e10083106134c5576305f5e10083816134bb576134ba615117565b5b0492506008810190505b61271083106134ea5761271083816134e0576134df615117565b5b0492506004810190505b6064831061350d576064838161350357613502615117565b5b0492506002810190505b600a831061351c576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135918161355c565b811461359c57600080fd5b50565b6000813590506135ae81613588565b92915050565b6000602082840312156135ca576135c9613552565b5b60006135d88482850161359f565b91505092915050565b60008115159050919050565b6135f6816135e1565b82525050565b600060208201905061361160008301846135ed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613651578082015181840152602081019050613636565b60008484015250505050565b6000601f19601f8301169050919050565b600061367982613617565b6136838185613622565b9350613693818560208601613633565b61369c8161365d565b840191505092915050565b600060208201905081810360008301526136c1818461366e565b905092915050565b6000819050919050565b6136dc816136c9565b81146136e757600080fd5b50565b6000813590506136f9816136d3565b92915050565b60006020828403121561371557613714613552565b5b6000613723848285016136ea565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137578261372c565b9050919050565b6137678161374c565b82525050565b6000602082019050613782600083018461375e565b92915050565b600080600080608085870312156137a2576137a1613552565b5b60006137b0878288016136ea565b94505060206137c1878288016136ea565b93505060406137d2878288016136ea565b92505060606137e3878288016136ea565b91505092959194509250565b6137f88161374c565b811461380357600080fd5b50565b600081359050613815816137ef565b92915050565b6000806040838503121561383257613831613552565b5b600061384085828601613806565b9250506020613851858286016136ea565b9150509250929050565b613864816135e1565b811461386f57600080fd5b50565b6000813590506138818161385b565b92915050565b6000806040838503121561389e5761389d613552565b5b60006138ac85828601613872565b92505060206138bd85828601613806565b9150509250929050565b6138d0816136c9565b82525050565b60006020820190506138eb60008301846138c7565b92915050565b60008060006060848603121561390a57613909613552565b5b600061391886828701613806565b935050602061392986828701613806565b925050604061393a868287016136ea565b9150509250925092565b600060c082019050613959600083018961375e565b61396660208301886138c7565b61397360408301876138c7565b61398060608301866138c7565b61398d60808301856135ed565b61399a60a08301846135ed565b979650505050505050565b6000602082840312156139bb576139ba613552565b5b60006139c984828501613872565b91505092915050565b600060a0820190506139e7600083018861375e565b6139f460208301876138c7565b613a0160408301866138c7565b613a0e60608301856138c7565b613a1b60808301846138c7565b9695505050505050565b600080fd5b600080fd5b600080fd5b60008083601f840112613a4a57613a49613a25565b5b8235905067ffffffffffffffff811115613a6757613a66613a2a565b5b602083019150836020820283011115613a8357613a82613a2f565b5b9250929050565b600080600060408486031215613aa357613aa2613552565b5b600084013567ffffffffffffffff811115613ac157613ac0613557565b5b613acd86828701613a34565b93509350506020613ae0868287016136ea565b9150509250925092565b600060208284031215613b0057613aff613552565b5b6000613b0e84828501613806565b91505092915050565b60008060408385031215613b2e57613b2d613552565b5b6000613b3c858286016136ea565b9250506020613b4d85828601613872565b9150509250929050565b60008060408385031215613b6e57613b6d613552565b5b6000613b7c85828601613806565b9250506020613b8d85828601613872565b9150509250929050565b60008060408385031215613bae57613bad613552565b5b6000613bbc858286016136ea565b9250506020613bcd858286016136ea565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c148261365d565b810181811067ffffffffffffffff82111715613c3357613c32613bdc565b5b80604052505050565b6000613c46613548565b9050613c528282613c0b565b919050565b600067ffffffffffffffff821115613c7257613c71613bdc565b5b613c7b8261365d565b9050602081019050919050565b82818337600083830152505050565b6000613caa613ca584613c57565b613c3c565b905082815260208101848484011115613cc657613cc5613bd7565b5b613cd1848285613c88565b509392505050565b600082601f830112613cee57613ced613a25565b5b8135613cfe848260208601613c97565b91505092915050565b60008060008060808587031215613d2157613d20613552565b5b6000613d2f87828801613806565b9450506020613d4087828801613806565b9350506040613d51878288016136ea565b925050606085013567ffffffffffffffff811115613d7257613d71613557565b5b613d7e87828801613cd9565b91505092959194509250565b60008083601f840112613da057613d9f613a25565b5b8235905067ffffffffffffffff811115613dbd57613dbc613a2a565b5b602083019150836001820283011115613dd957613dd8613a2f565b5b9250929050565b60008060208385031215613df757613df6613552565b5b600083013567ffffffffffffffff811115613e1557613e14613557565b5b613e2185828601613d8a565b92509250509250929050565b60008060408385031215613e4457613e43613552565b5b6000613e5285828601613806565b9250506020613e6385828601613806565b9150509250929050565b600067ffffffffffffffff821115613e8857613e87613bdc565b5b602082029050602081019050919050565b6000613eac613ea784613e6d565b613c3c565b90508083825260208201905060208402830185811115613ecf57613ece613a2f565b5b835b81811015613ef85780613ee488826136ea565b845260208401935050602081019050613ed1565b5050509392505050565b600082601f830112613f1757613f16613a25565b5b8135613f27848260208601613e99565b91505092915050565b60008060408385031215613f4757613f46613552565b5b600083013567ffffffffffffffff811115613f6557613f64613557565b5b613f7185828601613f02565b9250506020613f82858286016136ea565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fd357607f821691505b602082108103613fe657613fe5613f8c565b5b50919050565b600081519050613ffb816137ef565b92915050565b60006020828403121561401757614016613552565b5b600061402584828501613fec565b91505092915050565b7f596f7520646f6e2774206f776e20746865736520746f6b656e73000000000000600082015250565b6000614064601a83613622565b915061406f8261402e565b602082019050919050565b6000602082019050818103600083015261409381614057565b9050919050565b7f5468697320736e616b65206973206e6f742079657420726561647920746f206260008201527f726565642e000000000000000000000000000000000000000000000000000000602082015250565b60006140f6602583613622565b91506141018261409a565b604082019050919050565b60006020820190508181036000830152614125816140e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614166826136c9565b9150614171836136c9565b92508282019050808211156141895761418861412c565b5b92915050565b600061419a826136c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141cc576141cb61412c565b5b600182019050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614233602183613622565b915061423e826141d7565b604082019050919050565b6000602082019050818103600083015261426281614226565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006142c5603d83613622565b91506142d082614269565b604082019050919050565b600060208201905081810360008301526142f4816142b8565b9050919050565b7f41646d696e207065726d697373696f6e206f6e6c790000000000000000000000600082015250565b6000614331601583613622565b915061433c826142fb565b602082019050919050565b6000602082019050818103600083015261436081614324565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006143c3602d83613622565b91506143ce82614367565b604082019050919050565b600060208201905081810360008301526143f2816143b6565b9050919050565b7f596f75206172656e277420616c6c6f77656420746f20646f2074686973000000600082015250565b600061442f601d83613622565b915061443a826143f9565b602082019050919050565b6000602082019050818103600083015261445e81614422565b9050919050565b6000614470826136c9565b9150600082036144835761448261412c565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006144f3601883613622565b91506144fe826144bd565b602082019050919050565b60006020820190508181036000830152614522816144e6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614585602983613622565b915061459082614529565b604082019050919050565b600060208201905081810360008301526145b481614578565b9050919050565b7f5468697320746f6b656e2063616e7420676f20746f206a61696c000000000000600082015250565b60006145f1601a83613622565b91506145fc826145bb565b602082019050919050565b60006020820190508181036000830152614620816145e4565b9050919050565b7f446964206e6f742073656e642074686520636f7272656374206a61696c20666560008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000614683602183613622565b915061468e82614627565b604082019050919050565b600060208201905081810360008301526146b281614676565b9050919050565b7f546865726520617265206e6f20746f6b656e73206c6566742100000000000000600082015250565b60006146ef601983613622565b91506146fa826146b9565b602082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b7f4d696e74206973206e6f74207965742061637469766521000000000000000000600082015250565b600061475b601783613622565b915061476682614725565b602082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b600061479c826136c9565b91506147a7836136c9565b92508282026147b5816136c9565b915082820484148315176147cc576147cb61412c565b5b5092915050565b7f596f7520646f206e6f74206861766520612077686974656c69737420666f722060008201527f7468697320616d6f756e74206f66206e66747300000000000000000000000000602082015250565b600061482f603383613622565b915061483a826147d3565b604082019050919050565b6000602082019050818103600083015261485e81614822565b9050919050565b6000614870826136c9565b915061487b836136c9565b92508282039050818111156148935761489261412c565b5b92915050565b7f596f7520646964206e6f742073656e642074686520636f727265637420616d6d60008201527f6f756e74206f662065746820666f722074686973206d696e7421000000000000602082015250565b60006148f5603a83613622565b915061490082614899565b604082019050919050565b60006020820190508181036000830152614924816148e8565b9050919050565b600081905092915050565b600061494182613617565b61494b818561492b565b935061495b818560208601613633565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061499d60058361492b565b91506149a882614967565b600582019050919050565b60006149bf8285614936565b91506149cb8284614936565b91506149d682614990565b91508190509392505050565b7f4567672e6a736f6e000000000000000000000000000000000000000000000000600082015250565b6000614a1860088361492b565b9150614a23826149e2565b600882019050919050565b6000614a3a8284614936565b9150614a4582614a0b565b915081905092915050565b7f4a61696c2e6a736f6e0000000000000000000000000000000000000000000000600082015250565b6000614a8660098361492b565b9150614a9182614a50565b600982019050919050565b6000614aa88284614936565b9150614ab382614a79565b915081905092915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b2b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614aee565b614b358683614aee565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614b72614b6d614b68846136c9565b614b4d565b6136c9565b9050919050565b6000819050919050565b614b8c83614b57565b614ba0614b9882614b79565b848454614afb565b825550505050565b600090565b614bb5614ba8565b614bc0818484614b83565b505050565b5b81811015614be457614bd9600082614bad565b600181019050614bc6565b5050565b601f821115614c2957614bfa81614ac9565b614c0384614ade565b81016020851015614c12578190505b614c26614c1e85614ade565b830182614bc5565b50505b505050565b600082821c905092915050565b6000614c4c60001984600802614c2e565b1980831691505092915050565b6000614c658383614c3b565b9150826002028217905092915050565b614c7f8383614abe565b67ffffffffffffffff811115614c9857614c97613bdc565b5b614ca28254613fbb565b614cad828285614be8565b6000601f831160018114614cdc5760008415614cca578287013590505b614cd48582614c59565b865550614d3c565b601f198416614cea86614ac9565b60005b82811015614d1257848901358255600182019150602085019450602081019050614ced565b86831015614d2f5784890135614d2b601f891682614c3b565b8355505b6001600288020188555050505b50505050505050565b7f536e616b65732063616e277420676f20746f206a61696c210000000000000000600082015250565b6000614d7b601883613622565b9150614d8682614d45565b602082019050919050565b60006020820190508181036000830152614daa81614d6e565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614de7602083613622565b9150614df282614db1565b602082019050919050565b60006020820190508181036000830152614e1681614dda565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614e53601c83613622565b9150614e5e82614e1d565b602082019050919050565b60006020820190508181036000830152614e8281614e46565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ee5602583613622565b9150614ef082614e89565b604082019050919050565b60006020820190508181036000830152614f1481614ed8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f77602483613622565b9150614f8282614f1b565b604082019050919050565b60006020820190508181036000830152614fa681614f6a565b9050919050565b7f54686973204e465420697320696e204a41494c21000000000000000000000000600082015250565b6000614fe3601483613622565b9150614fee82614fad565b602082019050919050565b6000602082019050818103600083015261501281614fd6565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061504f601983613622565b915061505a82615019565b602082019050919050565b6000602082019050818103600083015261507e81615042565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006150e1603283613622565b91506150ec82615085565b604082019050919050565b60006020820190508181036000830152615110816150d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061516d82615146565b6151778185615151565b9350615187818560208601613633565b6151908161365d565b840191505092915050565b60006080820190506151b0600083018761375e565b6151bd602083018661375e565b6151ca60408301856138c7565b81810360608301526151dc8184615162565b905095945050505050565b6000815190506151f681613588565b92915050565b60006020828403121561521257615211613552565b5b6000615220848285016151e7565b9150509291505056fea26469706673582212209e5b1226264a073dd1c0aa04e92b2397ee0459e9b4b35cdbacae06f06ae3140864736f6c6343000812003368747470733a2f2f6261667962656963326e7673616667337778686b686e726f656c6962777963753277356b6d3363617261697277697833617a726175787965786a6d2e697066732e6e667473746f726167652e6c696e6b2f

Deployed Bytecode

0x6080604052600436106102045760003560e01c80637b90918411610118578063bb4e6ebc116100a0578063e086e5ec1161006f578063e086e5ec14610779578063e367f8b114610790578063e5e01c11146107cd578063e985e9c5146107f6578063e9c160fc1461083357610204565b8063bb4e6ebc14610699578063bbc97771146106d6578063c87b56dd14610713578063dda52d531461075057610204565b806395d89b41116100e757806395d89b41146105c35780639b19251a146105ee578063a22cb4651461062b578063a7049b9a14610654578063b88d4fde1461067057610204565b80637b909184146105115780638621fa9c1461052d5780638ad2f89b146105495780638fee7c0d1461058657610204565b806332d13e531161019b578063533265e61161016a578063533265e61461042857806357188aa2146104575780636352211e1461048057806366b9f0d2146104bd57806370a08231146104d457610204565b806332d13e531461038f57806339aeaa9d146103bf57806342842e0e146103d657806352e2fd21146103ff57610204565b8063095ea7b3116101d7578063095ea7b3146102d7578063124a2024146103005780631a36b7461461032957806323b872dd1461036657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc1461027157806308a4a26a146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906135b4565b61085c565b60405161023d91906135fc565b60405180910390f35b34801561025257600080fd5b5061025b61093e565b60405161026891906136a7565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906136ff565b6109d0565b6040516102a5919061376d565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613788565b610a16565b005b3480156102e357600080fd5b506102fe60048036038101906102f9919061381b565b610dfd565b005b34801561030c57600080fd5b5061032760048036038101906103229190613887565b610f14565b005b34801561033557600080fd5b50610350600480360381019061034b91906136ff565b611002565b60405161035d91906138d6565b60405180910390f35b34801561037257600080fd5b5061038d600480360381019061038891906138f1565b61101a565b005b34801561039b57600080fd5b506103a461107a565b6040516103b696959493929190613944565b60405180910390f35b3480156103cb57600080fd5b506103d46110de565b005b3480156103e257600080fd5b506103fd60048036038101906103f891906138f1565b611255565b005b34801561040b57600080fd5b50610426600480360381019061042191906139a5565b611275565b005b34801561043457600080fd5b5061043d611328565b60405161044e9594939291906139d2565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613a8a565b61136c565b005b34801561048c57600080fd5b506104a760048036038101906104a291906136ff565b6114a9565b6040516104b4919061376d565b60405180910390f35b3480156104c957600080fd5b506104d261152f565b005b3480156104e057600080fd5b506104fb60048036038101906104f69190613aea565b6115e2565b60405161050891906138d6565b60405180910390f35b61052b600480360381019061052691906136ff565b611699565b005b61054760048036038101906105429190613b17565b6117a3565b005b34801561055557600080fd5b50610570600480360381019061056b91906136ff565b6119db565b60405161057d91906135fc565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a891906136ff565b6119fb565b6040516105ba91906138d6565b60405180910390f35b3480156105cf57600080fd5b506105d8611a13565b6040516105e591906136a7565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190613aea565b611aa5565b60405161062291906138d6565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190613b57565b611abd565b005b61066e60048036038101906106699190613b97565b611ad3565b005b34801561067c57600080fd5b5061069760048036038101906106929190613d07565b611c23565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190613aea565b611c85565b6040516106cd91906135fc565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f891906136ff565b611ca5565b60405161070a91906138d6565b60405180910390f35b34801561071f57600080fd5b5061073a600480360381019061073591906136ff565b611cbd565b60405161074791906136a7565b60405180910390f35b34801561075c57600080fd5b50610777600480360381019061077291906136ff565b611e2a565b005b34801561078557600080fd5b5061078e611ed0565b005b34801561079c57600080fd5b506107b760048036038101906107b29190613aea565b611fb2565b6040516107c491906135fc565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613de0565b611fd2565b005b34801561080257600080fd5b5061081d60048036038101906108189190613e2d565b61207b565b60405161082a91906135fc565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190613f30565b61210f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610937575061093682612377565b5b9050919050565b60606000805461094d90613fbb565b80601f016020809104026020016040519081016040528092919081815260200182805461097990613fbb565b80156109c65780601f1061099b576101008083540402835291602001916109c6565b820191906000526020600020905b8154815290600101906020018083116109a957829003601f168201915b5050505050905090565b60006109db826123e1565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905060003090508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b8152600401610a7091906138d6565b602060405180830381865afa158015610a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab19190614001565b73ffffffffffffffffffffffffffffffffffffffff16148015610b7857508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b8152600401610b1f91906138d6565b602060405180830381865afa158015610b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b609190614001565b73ffffffffffffffffffffffffffffffffffffffff16145b8015610c2857508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401610bcf91906138d6565b602060405180830381865afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190614001565b73ffffffffffffffffffffffffffffffffffffffff16145b8015610cd857508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610c7f91906138d6565b602060405180830381865afa158015610c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc09190614001565b73ffffffffffffffffffffffffffffffffffffffff16145b610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e9061407a565b60405180910390fd5b600060096000858152602001908152602001600020541480610d4b5750426009600085815260200190815260200160002054105b610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d819061410c565b60405180910390fd5b6201518042610d99919061415b565b6009600085815260200190815260200160002081905550610db98661242c565b610dc28561242c565b610dcb8461242c565b610dda82600b6001015461257a565b600b6001016000815480929190610df09061418f565b9190505550505050505050565b6000610e08826114a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f90614249565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e976128a4565b73ffffffffffffffffffffffffffffffffffffffff161480610ec65750610ec581610ec06128a4565b61207b565b5b610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc906142db565b60405180910390fd5b610f0f83836128ac565b505050565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614347565b60405180910390fd5b81600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60086020528060005260406000206000915090505481565b61102b6110256128a4565b82612965565b61106a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611061906143d9565b60405180910390fd5b6110758383836129fa565b505050565b600b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900460ff16908060040160019054906101000a900460ff16905086565b600033905060001515601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151480156111495750600160136003015410155b611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90614445565b60405180910390fd5b6001601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611230919061415b565b925050819055506013600301600081548092919061124d90614465565b919050555050565b61127083838360405180602001604052806000815250611c23565b505050565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90614347565b60405180910390fd5b80600b60040160006101000a81548160ff02191690831515021790555050565b60138060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b6000339050601360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614347565b60405180910390fd5b60005b848490508110156114a257826018600087878581811061142a5761142961448e565b5b905060200201602081019061143f9190613aea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611488919061415b565b92505081905550808061149a9061418f565b915050611407565b5050505050565b6000806114b583612e12565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d90614509565b60405180910390fd5b80915050919050565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990614347565b60405180910390fd5b6001600b60040160016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061459b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006611c37937e08000905060001515600a600084815260200190815260200160002060009054906101000a900460ff1615151461170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170390614607565b60405180910390fd5b8034101561174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690614699565b60405180910390fd5b600060076000848152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78260405161179791906138d6565b60405180910390a15050565b60003390508260136001015410156117f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e790614705565b60405180910390fd5b6013600401544211611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614771565b60405180910390fd5b60006013600201548461184a9190614791565b905060011515831515036119355783601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156118da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d190614845565b60405180910390fd5b6000905083601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461192d9190614865565b925050819055505b80341015611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f9061490b565b60405180910390fd5b60005b848110156119d457600061198f6012612e4f565b905061199b6012612361565b601360010160008154809291906119b190614465565b91905055506119c08482612e5d565b5080806119cc9061418f565b91505061197b565b5050505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b60096020528060005260406000206000915090505481565b606060018054611a2290613fbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4e90613fbb565b8015611a9b5780601f10611a7057610100808354040283529160200191611a9b565b820191906000526020600020905b815481529060010190602001808311611a7e57829003601f168201915b5050505050905090565b60186020528060005260406000206000915090505481565b611acf611ac86128a4565b8383612e7b565b5050565b60006611c37937e080009050600060018303611aff576201518042611af8919061415b565b9050611b24565b60028303611b235762093a8042611b16919061415b565b9050662386f26fc1000091505b5b60001515600a600086815260200190815260200160002060009054906101000a900460ff16151514611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614607565b60405180910390fd5b81341015611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590614699565b60405180910390fd5b8060076000868152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce784604051611c1591906138d6565b60405180910390a150505050565b611c34611c2e6128a4565b83612965565b611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a906143d9565b60405180910390fd5b611c7f84848484612fe7565b50505050565b60196020528060005260406000206000915054906101000a900460ff1681565b60076020528060005260406000206000915090505481565b6060611cc8826123e1565b6000611cd2613043565b90504260076000858152602001908152602001600020541080611d08575060006007600085815260200190815260200160002054145b15611de257426008600085815260200190815260200160002054108015611d45575060011515600b60040160019054906101000a900460ff161515145b15611d9b576000815111611d685760405180602001604052806000815250611d93565b80611d72846130d5565b604051602001611d839291906149b3565b6040516020818303038152906040525b915050611e25565b6000815111611db95760405180602001604052806000815250611dda565b80604051602001611dca9190614a2e565b6040516020818303038152906040525b915050611e25565b6000815111611e005760405180602001604052806000815250611e21565b80604051602001611e119190614a9c565b6040516020818303038152906040525b9150505b919050565b6000339050601360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb990614347565b60405180910390fd5b816013600401819055505050565b6000339050601360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90614347565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611fae573d6000803e3d6000fd5b5050565b60066020528060005260406000206000915054906101000a900460ff1681565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205c90614347565b60405180910390fd5b818160109182612076929190614c75565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121be575060011515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f490614347565b60405180910390fd5b60006001820361221d576201518042612216919061415b565b9050612238565b600282036122375762093a8042612234919061415b565b90505b5b60005b835181101561235b5760001515600a600086848151811061225f5761225e61448e565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161515146122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bc90614d91565b60405180910390fd5b81600760008684815181106122dd576122dc61448e565b5b60200260200101518152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce784828151811061232b5761232a61448e565b5b602002602001015160405161234091906138d6565b60405180910390a180806123539061418f565b91505061223b565b50505050565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123ea816131a3565b612429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242090614509565b60405180910390fd5b50565b6000612437826114a9565b90506124478160008460016131e4565b612450826114a9565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125768160008460016131ea565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e090614dfd565b60405180910390fd5b6125f2816131a3565b15612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614e69565b60405180910390fd5b6126406000838360016131e4565b612649816131a3565b15612689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268090614e69565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e1042612737919061415b565b6008600083815260200190815260200160002081905550610bb881116127ee576009601154036127b55760006011819055506001600a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600b60020160008154809291906127ab9061418f565b91905055506127e9565b601160008154809291906127c89061418f565b9190505550600b60030160008154809291906127e39061418f565b91905055505b612836565b6001600a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600b60020160008154809291906128309061418f565b91905055505b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a06000838360016131ea565b5050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661291f836114a9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612971836114a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129b357506129b2818561207b565b5b806129f157508373ffffffffffffffffffffffffffffffffffffffff166129d9846109d0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a1a826114a9565b73ffffffffffffffffffffffffffffffffffffffff1614612a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6790614efb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad690614f8d565b60405180910390fd5b612aec83838360016131e4565b8273ffffffffffffffffffffffffffffffffffffffff16612b0c826114a9565b73ffffffffffffffffffffffffffffffffffffffff1614612b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5990614efb565b60405180910390fd5b60011515600b60040160009054906101000a900460ff161515148015612bac575060001515600a600083815260200190815260200160002060009054906101000a900460ff161515145b15612c4a574260076000838152602001908152602001600020541080612be5575060006007600083815260200190815260200160002054145b612c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1b90614ff9565b60405180910390fd5b610e1042612c32919061415b565b60076000838152602001908152602001600020819055505b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dd683838360016131ea565b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce781604051612e0591906138d6565b60405180910390a1505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b612e778282604051806020016040528060008152506131f0565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee090615065565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612fda91906135fc565b60405180910390a3505050565b612ff28484846129fa565b612ffe8484848461324b565b61303d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613034906150f7565b60405180910390fd5b50505050565b60606010805461305290613fbb565b80601f016020809104026020016040519081016040528092919081815260200182805461307e90613fbb565b80156130cb5780601f106130a0576101008083540402835291602001916130cb565b820191906000526020600020905b8154815290600101906020018083116130ae57829003601f168201915b5050505050905090565b6060600060016130e4846133d2565b01905060008167ffffffffffffffff81111561310357613102613bdc565b5b6040519080825280601f01601f1916602001820160405280156131355781602001600182028036833780820191505090505b509050600082602001820190505b600115613198578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161318c5761318b615117565b5b04945060008503613143575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166131c583612e12565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6131fa838361257a565b613207600084848461324b565b613246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323d906150f7565b60405180910390fd5b505050565b600061326c8473ffffffffffffffffffffffffffffffffffffffff16613525565b156133c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132956128a4565b8786866040518563ffffffff1660e01b81526004016132b7949392919061519b565b6020604051808303816000875af19250505080156132f357506040513d601f19601f820116820180604052508101906132f091906151fc565b60015b613375573d8060008114613323576040519150601f19603f3d011682016040523d82523d6000602084013e613328565b606091505b50600081510361336d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613364906150f7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133ca565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613430577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161342657613425615117565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061346d576d04ee2d6d415b85acef8100000000838161346357613462615117565b5b0492506020810190505b662386f26fc10000831061349c57662386f26fc10000838161349257613491615117565b5b0492506010810190505b6305f5e10083106134c5576305f5e10083816134bb576134ba615117565b5b0492506008810190505b61271083106134ea5761271083816134e0576134df615117565b5b0492506004810190505b6064831061350d576064838161350357613502615117565b5b0492506002810190505b600a831061351c576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135918161355c565b811461359c57600080fd5b50565b6000813590506135ae81613588565b92915050565b6000602082840312156135ca576135c9613552565b5b60006135d88482850161359f565b91505092915050565b60008115159050919050565b6135f6816135e1565b82525050565b600060208201905061361160008301846135ed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613651578082015181840152602081019050613636565b60008484015250505050565b6000601f19601f8301169050919050565b600061367982613617565b6136838185613622565b9350613693818560208601613633565b61369c8161365d565b840191505092915050565b600060208201905081810360008301526136c1818461366e565b905092915050565b6000819050919050565b6136dc816136c9565b81146136e757600080fd5b50565b6000813590506136f9816136d3565b92915050565b60006020828403121561371557613714613552565b5b6000613723848285016136ea565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137578261372c565b9050919050565b6137678161374c565b82525050565b6000602082019050613782600083018461375e565b92915050565b600080600080608085870312156137a2576137a1613552565b5b60006137b0878288016136ea565b94505060206137c1878288016136ea565b93505060406137d2878288016136ea565b92505060606137e3878288016136ea565b91505092959194509250565b6137f88161374c565b811461380357600080fd5b50565b600081359050613815816137ef565b92915050565b6000806040838503121561383257613831613552565b5b600061384085828601613806565b9250506020613851858286016136ea565b9150509250929050565b613864816135e1565b811461386f57600080fd5b50565b6000813590506138818161385b565b92915050565b6000806040838503121561389e5761389d613552565b5b60006138ac85828601613872565b92505060206138bd85828601613806565b9150509250929050565b6138d0816136c9565b82525050565b60006020820190506138eb60008301846138c7565b92915050565b60008060006060848603121561390a57613909613552565b5b600061391886828701613806565b935050602061392986828701613806565b925050604061393a868287016136ea565b9150509250925092565b600060c082019050613959600083018961375e565b61396660208301886138c7565b61397360408301876138c7565b61398060608301866138c7565b61398d60808301856135ed565b61399a60a08301846135ed565b979650505050505050565b6000602082840312156139bb576139ba613552565b5b60006139c984828501613872565b91505092915050565b600060a0820190506139e7600083018861375e565b6139f460208301876138c7565b613a0160408301866138c7565b613a0e60608301856138c7565b613a1b60808301846138c7565b9695505050505050565b600080fd5b600080fd5b600080fd5b60008083601f840112613a4a57613a49613a25565b5b8235905067ffffffffffffffff811115613a6757613a66613a2a565b5b602083019150836020820283011115613a8357613a82613a2f565b5b9250929050565b600080600060408486031215613aa357613aa2613552565b5b600084013567ffffffffffffffff811115613ac157613ac0613557565b5b613acd86828701613a34565b93509350506020613ae0868287016136ea565b9150509250925092565b600060208284031215613b0057613aff613552565b5b6000613b0e84828501613806565b91505092915050565b60008060408385031215613b2e57613b2d613552565b5b6000613b3c858286016136ea565b9250506020613b4d85828601613872565b9150509250929050565b60008060408385031215613b6e57613b6d613552565b5b6000613b7c85828601613806565b9250506020613b8d85828601613872565b9150509250929050565b60008060408385031215613bae57613bad613552565b5b6000613bbc858286016136ea565b9250506020613bcd858286016136ea565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c148261365d565b810181811067ffffffffffffffff82111715613c3357613c32613bdc565b5b80604052505050565b6000613c46613548565b9050613c528282613c0b565b919050565b600067ffffffffffffffff821115613c7257613c71613bdc565b5b613c7b8261365d565b9050602081019050919050565b82818337600083830152505050565b6000613caa613ca584613c57565b613c3c565b905082815260208101848484011115613cc657613cc5613bd7565b5b613cd1848285613c88565b509392505050565b600082601f830112613cee57613ced613a25565b5b8135613cfe848260208601613c97565b91505092915050565b60008060008060808587031215613d2157613d20613552565b5b6000613d2f87828801613806565b9450506020613d4087828801613806565b9350506040613d51878288016136ea565b925050606085013567ffffffffffffffff811115613d7257613d71613557565b5b613d7e87828801613cd9565b91505092959194509250565b60008083601f840112613da057613d9f613a25565b5b8235905067ffffffffffffffff811115613dbd57613dbc613a2a565b5b602083019150836001820283011115613dd957613dd8613a2f565b5b9250929050565b60008060208385031215613df757613df6613552565b5b600083013567ffffffffffffffff811115613e1557613e14613557565b5b613e2185828601613d8a565b92509250509250929050565b60008060408385031215613e4457613e43613552565b5b6000613e5285828601613806565b9250506020613e6385828601613806565b9150509250929050565b600067ffffffffffffffff821115613e8857613e87613bdc565b5b602082029050602081019050919050565b6000613eac613ea784613e6d565b613c3c565b90508083825260208201905060208402830185811115613ecf57613ece613a2f565b5b835b81811015613ef85780613ee488826136ea565b845260208401935050602081019050613ed1565b5050509392505050565b600082601f830112613f1757613f16613a25565b5b8135613f27848260208601613e99565b91505092915050565b60008060408385031215613f4757613f46613552565b5b600083013567ffffffffffffffff811115613f6557613f64613557565b5b613f7185828601613f02565b9250506020613f82858286016136ea565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fd357607f821691505b602082108103613fe657613fe5613f8c565b5b50919050565b600081519050613ffb816137ef565b92915050565b60006020828403121561401757614016613552565b5b600061402584828501613fec565b91505092915050565b7f596f7520646f6e2774206f776e20746865736520746f6b656e73000000000000600082015250565b6000614064601a83613622565b915061406f8261402e565b602082019050919050565b6000602082019050818103600083015261409381614057565b9050919050565b7f5468697320736e616b65206973206e6f742079657420726561647920746f206260008201527f726565642e000000000000000000000000000000000000000000000000000000602082015250565b60006140f6602583613622565b91506141018261409a565b604082019050919050565b60006020820190508181036000830152614125816140e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614166826136c9565b9150614171836136c9565b92508282019050808211156141895761418861412c565b5b92915050565b600061419a826136c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141cc576141cb61412c565b5b600182019050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614233602183613622565b915061423e826141d7565b604082019050919050565b6000602082019050818103600083015261426281614226565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006142c5603d83613622565b91506142d082614269565b604082019050919050565b600060208201905081810360008301526142f4816142b8565b9050919050565b7f41646d696e207065726d697373696f6e206f6e6c790000000000000000000000600082015250565b6000614331601583613622565b915061433c826142fb565b602082019050919050565b6000602082019050818103600083015261436081614324565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006143c3602d83613622565b91506143ce82614367565b604082019050919050565b600060208201905081810360008301526143f2816143b6565b9050919050565b7f596f75206172656e277420616c6c6f77656420746f20646f2074686973000000600082015250565b600061442f601d83613622565b915061443a826143f9565b602082019050919050565b6000602082019050818103600083015261445e81614422565b9050919050565b6000614470826136c9565b9150600082036144835761448261412c565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006144f3601883613622565b91506144fe826144bd565b602082019050919050565b60006020820190508181036000830152614522816144e6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614585602983613622565b915061459082614529565b604082019050919050565b600060208201905081810360008301526145b481614578565b9050919050565b7f5468697320746f6b656e2063616e7420676f20746f206a61696c000000000000600082015250565b60006145f1601a83613622565b91506145fc826145bb565b602082019050919050565b60006020820190508181036000830152614620816145e4565b9050919050565b7f446964206e6f742073656e642074686520636f7272656374206a61696c20666560008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000614683602183613622565b915061468e82614627565b604082019050919050565b600060208201905081810360008301526146b281614676565b9050919050565b7f546865726520617265206e6f20746f6b656e73206c6566742100000000000000600082015250565b60006146ef601983613622565b91506146fa826146b9565b602082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b7f4d696e74206973206e6f74207965742061637469766521000000000000000000600082015250565b600061475b601783613622565b915061476682614725565b602082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b600061479c826136c9565b91506147a7836136c9565b92508282026147b5816136c9565b915082820484148315176147cc576147cb61412c565b5b5092915050565b7f596f7520646f206e6f74206861766520612077686974656c69737420666f722060008201527f7468697320616d6f756e74206f66206e66747300000000000000000000000000602082015250565b600061482f603383613622565b915061483a826147d3565b604082019050919050565b6000602082019050818103600083015261485e81614822565b9050919050565b6000614870826136c9565b915061487b836136c9565b92508282039050818111156148935761489261412c565b5b92915050565b7f596f7520646964206e6f742073656e642074686520636f727265637420616d6d60008201527f6f756e74206f662065746820666f722074686973206d696e7421000000000000602082015250565b60006148f5603a83613622565b915061490082614899565b604082019050919050565b60006020820190508181036000830152614924816148e8565b9050919050565b600081905092915050565b600061494182613617565b61494b818561492b565b935061495b818560208601613633565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061499d60058361492b565b91506149a882614967565b600582019050919050565b60006149bf8285614936565b91506149cb8284614936565b91506149d682614990565b91508190509392505050565b7f4567672e6a736f6e000000000000000000000000000000000000000000000000600082015250565b6000614a1860088361492b565b9150614a23826149e2565b600882019050919050565b6000614a3a8284614936565b9150614a4582614a0b565b915081905092915050565b7f4a61696c2e6a736f6e0000000000000000000000000000000000000000000000600082015250565b6000614a8660098361492b565b9150614a9182614a50565b600982019050919050565b6000614aa88284614936565b9150614ab382614a79565b915081905092915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b2b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614aee565b614b358683614aee565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614b72614b6d614b68846136c9565b614b4d565b6136c9565b9050919050565b6000819050919050565b614b8c83614b57565b614ba0614b9882614b79565b848454614afb565b825550505050565b600090565b614bb5614ba8565b614bc0818484614b83565b505050565b5b81811015614be457614bd9600082614bad565b600181019050614bc6565b5050565b601f821115614c2957614bfa81614ac9565b614c0384614ade565b81016020851015614c12578190505b614c26614c1e85614ade565b830182614bc5565b50505b505050565b600082821c905092915050565b6000614c4c60001984600802614c2e565b1980831691505092915050565b6000614c658383614c3b565b9150826002028217905092915050565b614c7f8383614abe565b67ffffffffffffffff811115614c9857614c97613bdc565b5b614ca28254613fbb565b614cad828285614be8565b6000601f831160018114614cdc5760008415614cca578287013590505b614cd48582614c59565b865550614d3c565b601f198416614cea86614ac9565b60005b82811015614d1257848901358255600182019150602085019450602081019050614ced565b86831015614d2f5784890135614d2b601f891682614c3b565b8355505b6001600288020188555050505b50505050505050565b7f536e616b65732063616e277420676f20746f206a61696c210000000000000000600082015250565b6000614d7b601883613622565b9150614d8682614d45565b602082019050919050565b60006020820190508181036000830152614daa81614d6e565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614de7602083613622565b9150614df282614db1565b602082019050919050565b60006020820190508181036000830152614e1681614dda565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614e53601c83613622565b9150614e5e82614e1d565b602082019050919050565b60006020820190508181036000830152614e8281614e46565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ee5602583613622565b9150614ef082614e89565b604082019050919050565b60006020820190508181036000830152614f1481614ed8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f77602483613622565b9150614f8282614f1b565b604082019050919050565b60006020820190508181036000830152614fa681614f6a565b9050919050565b7f54686973204e465420697320696e204a41494c21000000000000000000000000600082015250565b6000614fe3601483613622565b9150614fee82614fad565b602082019050919050565b6000602082019050818103600083015261501281614fd6565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061504f601983613622565b915061505a82615019565b602082019050919050565b6000602082019050818103600083015261507e81615042565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006150e1603283613622565b91506150ec82615085565b604082019050919050565b60006020820190508181036000830152615110816150d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061516d82615146565b6151778185615151565b9350615187818560208601613633565b6151908161365d565b840191505092915050565b60006080820190506151b0600083018761375e565b6151bd602083018661375e565b6151ca60408301856138c7565b81810360608301526151dc8184615162565b905095945050505050565b6000815190506151f681613588565b92915050565b60006020828403121561521257615211613552565b5b6000615220848285016151e7565b9150509291505056fea26469706673582212209e5b1226264a073dd1c0aa04e92b2397ee0459e9b4b35cdbacae06f06ae3140864736f6c63430008120033

Deployed Bytecode Sourcemap

59193:2631:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41107:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42035:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44342:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38192:756;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43860:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38954:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37106:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45042:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37479:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;60484:267;;;;;;;;;;;;;:::i;:::-;;45450:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39128:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59490:23;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;60179:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41745:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42318:153;;;;;;;;;;;;;:::i;:::-;;41476:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40044:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60757:844;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37217:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37161:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42204:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59520:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44585:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40358:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45706:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59572:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37056:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42711:743;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59974:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61609:208;;;;;;;;;;;;;:::i;:::-;;37011:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42546:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44811:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39303:735;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41107:305;41209:4;41261:25;41246:40;;;:11;:40;;;;:105;;;;41318:33;41303:48;;;:11;:48;;;;41246:105;:158;;;;41368:36;41392:11;41368:23;:36::i;:::-;41246:158;41226:178;;41107:305;;;:::o;42035:100::-;42089:13;42122:5;42115:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42035:100;:::o;44342:171::-;44418:7;44438:23;44453:7;44438:14;:23::i;:::-;44481:15;:24;44497:7;44481:24;;;;;;;;;;;;;;;;;;;;;44474:31;;44342:171;;;:::o;38192:756::-;38289:12;38304:10;38289:25;;38325:11;38347:4;38325:27;;38404:4;38381:27;;:3;:11;;;38393:6;38381:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;:68;;;;;38445:4;38422:27;;:3;:11;;;38434:6;38422:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;38381:68;:109;;;;;38486:4;38463:27;;:3;:11;;;38475:6;38463:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;38381:109;:150;;;;;38527:4;38504:27;;:3;:11;;;38516:6;38504:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;38381:150;38363:219;;;;;;;;;;;;:::i;:::-;;;;;;;;;38627:1;38601:14;:22;38616:6;38601:22;;;;;;;;;;;;:27;:71;;;;38657:15;38632:14;:22;38647:6;38632:22;;;;;;;;;;;;:40;38601:71;38593:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;38768:5;38750:15;:23;;;;:::i;:::-;38725:14;:22;38740:6;38725:22;;;;;;;;;;;:48;;;;38784:13;38790:6;38784:5;:13::i;:::-;38808;38814:6;38808:5;:13::i;:::-;38832;38838:6;38832:5;:13::i;:::-;38856:42;38862:4;38868:15;:29;;;38856:5;:42::i;:::-;38909:15;:29;;;:31;;;;;;;;;:::i;:::-;;;;;;38278:670;;38192:756;;;;:::o;43860:416::-;43941:13;43957:23;43972:7;43957:14;:23::i;:::-;43941:39;;44005:5;43999:11;;:2;:11;;;43991:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44099:5;44083:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44108:37;44125:5;44132:12;:10;:12::i;:::-;44108:16;:37::i;:::-;44083:62;44061:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;44247:21;44256:2;44260:7;44247:8;:21::i;:::-;43930:346;43860:416;;:::o;38954:168::-;39038:15;:19;;;;;;;;;;;;39024:33;;:10;:33;;;39016:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39110:4;39095:6;:12;39102:4;39095:12;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;;;;;;;38954:168;;:::o;37106:48::-;;;;;;;;;;;;;;;;;:::o;45042:337::-;45237:41;45256:12;:10;:12::i;:::-;45270:7;45237:18;:41::i;:::-;45229:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45343:28;45353:4;45359:2;45363:7;45343:9;:28::i;:::-;45042:337;;;:::o;37479:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60484:267::-;60527:12;60542:10;60527:25;;60586:5;60571:20;;:5;:11;60577:4;60571:11;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;:47;;;;;60617:1;60595:8;:18;;;:23;;60571:47;60563:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;60677:4;60663:5;:11;60669:4;60663:11;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;60711:1;60692:9;:15;60702:4;60692:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;60723:8;:18;;;:20;;;;;;;;;:::i;:::-;;;;;;60516:235;60484:267::o;45450:185::-;45588:39;45605:4;45611:2;45615:7;45588:39;;;;;;;;;;;;:16;:39::i;:::-;45450:185;;;:::o;39128:169::-;39199:15;:19;;;;;;;;;;;;39185:33;;:10;:33;;;39177:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39285:4;39255:15;:27;;;:34;;;;;;;;;;;;;;;;;;39128:169;:::o;59490:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60179:299::-;60265:12;60280:10;60265:25;;60317:8;:17;;;;;;;;;;;;60309:25;;:4;:25;;;60301:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60376:6;60371:100;60392:9;;:16;;60388:1;:20;60371:100;;;60453:6;60426:9;:23;60436:9;;60446:1;60436:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;60426:23;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;60410:3;;;;;:::i;:::-;;;;60371:100;;;;60254:224;60179:299;;;:::o;41745:223::-;41817:7;41837:13;41853:17;41862:7;41853:8;:17::i;:::-;41837:33;;41906:1;41889:19;;:5;:19;;;41881:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41955:5;41948:12;;;41745:223;;;:::o;42318:153::-;42376:15;:19;;;;;;;;;;;;42362:33;;:10;:33;;;42354:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42459:4;42432:15;:24;;;:31;;;;;;;;;;;;;;;;;;42318:153::o;41476:207::-;41548:7;41593:1;41576:19;;:5;:19;;;41568:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41659:9;:16;41669:5;41659:16;;;;;;;;;;;;;;;;41652:23;;41476:207;;;:::o;40044:308::-;40101:12;40116:8;40101:23;;40161:5;40143:23;;:5;:14;40149:7;40143:14;;;;;;;;;;;;;;;;;;;;;:23;;;40135:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;40229:4;40216:9;:17;;40208:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40302:1;40282:8;:17;40291:7;40282:17;;;;;;;;;;;:21;;;;40319:23;40334:7;40319:23;;;;;;:::i;:::-;;;;;;;;40090:262;40044:308;:::o;60757:844::-;60828:12;60843:10;60828:25;;60895:6;60872:8;:19;;;:29;;60864:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60968:8;:17;;;60950:15;:35;60942:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61024:12;61048:8;:18;;;61039:6;:27;;;;:::i;:::-;61024:42;;61089:4;61081:12;;:4;:12;;;61077:197;;61137:6;61118:9;:15;61128:4;61118:15;;;;;;;;;;;;;;;;:25;;61110:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;61221:1;61214:8;;61256:6;61237:9;:15;61247:4;61237:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;61077:197;61305:4;61292:9;:17;;61284:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;61388:6;61383:207;61404:6;61400:1;:10;61383:207;;;61428:15;61446:25;:15;:23;:25::i;:::-;61428:43;;61482:27;:15;:25;:27::i;:::-;61520:8;:19;;;:21;;;;;;;;;:::i;:::-;;;;;;61552:24;61562:4;61568:7;61552:9;:24::i;:::-;61417:173;61412:3;;;;;:::i;:::-;;;;61383:207;;;;60817:784;;60757:844;;:::o;37217:37::-;;;;;;;;;;;;;;;;;;;;;;:::o;37161:49::-;;;;;;;;;;;;;;;;;:::o;42204:104::-;42260:13;42293:7;42286:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42204:104;:::o;59520:45::-;;;;;;;;;;;;;;;;;:::o;44585:155::-;44680:52;44699:12;:10;:12::i;:::-;44713:8;44723;44680:18;:52::i;:::-;44585:155;;:::o;40358:679::-;40429:12;40444:8;40429:23;;40463:12;40547:1;40539:4;:9;40535:274;;40590:5;40572:15;:23;;;;:::i;:::-;40565:30;;40535:274;;;40671:1;40663:4;:9;40659:150;;40714:6;40696:15;:24;;;;:::i;:::-;40689:31;;40789:8;40782:15;;40659:150;40535:274;40845:5;40827:23;;:5;:14;40833:7;40827:14;;;;;;;;;;;;;;;;;;;;;:23;;;40819:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;40913:4;40900:9;:17;;40892:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40986:4;40966:8;:17;40975:7;40966:17;;;;;;;;;;;:24;;;;41006:23;41021:7;41006:23;;;;;;:::i;:::-;;;;;;;;40418:619;;40358:679;;:::o;45706:322::-;45880:41;45899:12;:10;:12::i;:::-;45913:7;45880:18;:41::i;:::-;45872:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45982:38;45996:4;46002:2;46006:7;46015:4;45982:13;:38::i;:::-;45706:322;;;;:::o;59572:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;37056:43::-;;;;;;;;;;;;;;;;;:::o;42711:743::-;42784:13;42810:23;42825:7;42810:14;:23::i;:::-;42844:21;42868:10;:8;:10::i;:::-;42844:34;;42915:15;42895:8;:17;42904:7;42895:17;;;;;;;;;;;;:35;:61;;;;42955:1;42934:8;:17;42943:7;42934:17;;;;;;;;;;;;:22;42895:61;42891:542;;;43000:15;42975:13;:22;42989:7;42975:22;;;;;;;;;;;;:40;:76;;;;;43047:4;43019:32;;:15;:24;;;;;;;;;;;;:32;;;42975:76;42971:329;;;43099:1;43081:7;43075:21;:25;:95;;;;;;;;;;;;;;;;;43127:7;43136:18;:7;:16;:18::i;:::-;43110:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43075:95;43068:102;;;;;42971:329;43234:1;43216:7;43210:21;:25;:78;;;;;;;;;;;;;;;;;43262:7;43245:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;43210:78;43203:85;;;;;42891:542;43366:1;43348:7;43342:21;:25;:79;;;;;;;;;;;;;;;;;43394:7;43377:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;43342:79;43335:86;;;42711:743;;;;:::o;59974:197::-;60030:12;60045:10;60030:25;;60082:8;:17;;;;;;;;;;;;60074:25;;:4;:25;;;60066:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60156:7;60136:8;:17;;:27;;;;60019:152;59974:197;:::o;61609:208::-;61650:20;61681:10;61650:42;;61719:8;:17;;;;;;;;;;;;61711:25;;:4;:25;;;61703:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;61773:4;:13;;:36;61787:21;61773:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61639:178;61609:208::o;37011:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;42546:159::-;42629:15;:19;;;;;;;;;;;;42615:33;;:10;:33;;;42607:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42691:6;;42685:3;:12;;;;;;;:::i;:::-;;42546:159;;:::o;44811:164::-;44908:4;44932:18;:25;44951:5;44932:25;;;;;;;;;;;;;;;:35;44958:8;44932:35;;;;;;;;;;;;;;;;;;;;;;;;;44925:42;;44811:164;;;;:::o;39303:735::-;39403:15;:19;;;;;;;;;;;;39389:33;;:10;:33;;;:63;;;;39448:4;39426:26;;:6;:18;39433:10;39426:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;39389:63;39381:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;39490:12;39574:1;39566:4;:9;39562:244;;39617:5;39599:15;:23;;;;:::i;:::-;39592:30;;39562:244;;;39698:1;39690:4;:9;39686:120;;39741:6;39723:15;:24;;;;:::i;:::-;39716:31;;39686:120;39562:244;39821:6;39816:211;39835:8;:15;39831:1;:19;39816:211;;;39898:5;39876:27;;:5;:18;39882:8;39891:1;39882:11;;;;;;;;:::i;:::-;;;;;;;;39876:18;;;;;;;;;;;;;;;;;;;;;:27;;;39868:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;39968:4;39943:8;:21;39952:8;39961:1;39952:11;;;;;;;;:::i;:::-;;;;;;;;39943:21;;;;;;;;;;;:29;;;;39988:27;40003:8;40012:1;40003:11;;;;;;;;:::i;:::-;;;;;;;;39988:27;;;;;;:::i;:::-;;;;;;;;39852:3;;;;;:::i;:::-;;;;39816:211;;;;39370:668;39303:735;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;29821:157::-;29906:4;29945:25;29930:40;;;:11;:40;;;;29923:47;;29821:157;;;:::o;55017:135::-;55099:16;55107:7;55099;:16::i;:::-;55091:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;55017:135;:::o;51464:783::-;51524:13;51540:23;51555:7;51540:14;:23::i;:::-;51524:39;;51576:51;51597:5;51612:1;51616:7;51625:1;51576:20;:51::i;:::-;51740:23;51755:7;51740:14;:23::i;:::-;51732:31;;51811:15;:24;51827:7;51811:24;;;;;;;;;;;;51804:31;;;;;;;;;;;52076:1;52056:9;:16;52066:5;52056:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;52106:7;:16;52114:7;52106:16;;;;;;;;;;;;52099:23;;;;;;;;;;;52168:7;52164:1;52140:36;;52149:5;52140:36;;;;;;;;;;;;52189:50;52209:5;52224:1;52228:7;52237:1;52189:19;:50::i;:::-;51513:734;51464:783;:::o;49659:1466::-;49753:1;49739:16;;:2;:16;;;49731:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49812:16;49820:7;49812;:16::i;:::-;49811:17;49803:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49874:48;49903:1;49907:2;49911:7;49920:1;49874:20;:48::i;:::-;50021:16;50029:7;50021;:16::i;:::-;50020:17;50012:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50436:1;50419:9;:13;50429:2;50419:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;50480:2;50461:7;:16;50469:7;50461:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50536:4;50518:15;:22;;;;:::i;:::-;50493:13;:22;50507:7;50493:22;;;;;;;;;;;:47;;;;50568:4;50557:7;:15;50553:456;;50624:1;50615:5;;:10;50611:262;;50650:1;50642:5;:9;;;;50683:4;50666:5;:14;50672:7;50666:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50727:15;:26;;;:28;;;;;;;;;:::i;:::-;;;;;;50611:262;;;50788:5;;:7;;;;;;;;;:::i;:::-;;;;;;50833:15;:26;;;:28;;;;;;;;;:::i;:::-;;;;;;50611:262;50553:456;;;50922:4;50905:5;:14;50911:7;50905:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50969:15;:26;;;:28;;;;;;;;;:::i;:::-;;;;;;50553:456;51049:7;51045:2;51024:33;;51041:1;51024:33;;;;;;;;;;;;51070:47;51098:1;51102:2;51106:7;51115:1;51070:19;:47::i;:::-;49659:1466;;:::o;17343:98::-;17396:7;17423:10;17416:17;;17343:98;:::o;54296:174::-;54398:2;54371:15;:24;54387:7;54371:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54454:7;54450:2;54416:46;;54425:23;54440:7;54425:14;:23::i;:::-;54416:46;;;;;;;;;;;;54296:174;;:::o;48061:264::-;48154:4;48171:13;48187:23;48202:7;48187:14;:23::i;:::-;48171:39;;48240:5;48229:16;;:7;:16;;;:52;;;;48249:32;48266:5;48273:7;48249:16;:32::i;:::-;48229:52;:87;;;;48309:7;48285:31;;:20;48297:7;48285:11;:20::i;:::-;:31;;;48229:87;48221:96;;;48061:264;;;;:::o;52584:1593::-;52743:4;52716:31;;:23;52731:7;52716:14;:23::i;:::-;:31;;;52708:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52822:1;52808:16;;:2;:16;;;52800:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52878:42;52899:4;52905:2;52909:7;52918:1;52878:20;:42::i;:::-;53050:4;53023:31;;:23;53038:7;53023:14;:23::i;:::-;:31;;;53015:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53142:4;53111:35;;:15;:27;;;;;;;;;;;;:35;;;:62;;;;;53168:5;53150:23;;:5;:14;53156:7;53150:14;;;;;;;;;;;;;;;;;;;;;:23;;;53111:62;53107:271;;;53214:15;53194:8;:17;53203:7;53194:17;;;;;;;;;;;;:35;:61;;;;53254:1;53233:8;:17;53242:7;53233:17;;;;;;;;;;;;:22;53194:61;53186:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;53330:4;53312:15;:22;;;;:::i;:::-;53292:8;:17;53301:7;53292:17;;;;;;;;;;;:42;;;;53107:271;53449:15;:24;53465:7;53449:24;;;;;;;;;;;;53442:31;;;;;;;;;;;53944:1;53925:9;:15;53935:4;53925:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;53977:1;53960:9;:13;53970:2;53960:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;54019:2;54000:7;:16;54008:7;54000:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54058:7;54054:2;54039:27;;54048:4;54039:27;;;;;;;;;;;;54079:41;54099:4;54105:2;54109:7;54118:1;54079:19;:41::i;:::-;54136:23;54151:7;54136:23;;;;;;:::i;:::-;;;;;;;;52584:1593;;;:::o;47336:117::-;47402:7;47429;:16;47437:7;47429:16;;;;;;;;;;;;;;;;;;;;;47422:23;;47336:117;;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;48667:110::-;48743:26;48753:2;48757:7;48743:26;;;;;;;;;;;;:9;:26::i;:::-;48667:110;;:::o;54613:315::-;54768:8;54759:17;;:5;:17;;;54751:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54855:8;54817:18;:25;54836:5;54817:25;;;;;;;;;;;;;;;:35;54843:8;54817:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;54901:8;54879:41;;54894:5;54879:41;;;54911:8;54879:41;;;;;;:::i;:::-;;;;;;;;54613:315;;;:::o;46909:313::-;47065:28;47075:4;47081:2;47085:7;47065:9;:28::i;:::-;47112:47;47135:4;47141:2;47145:7;47154:4;47112:22;:47::i;:::-;47104:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46909:313;;;;:::o;43703:95::-;43754:13;43787:3;43780:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43703:95;:::o;14770:716::-;14826:13;14877:14;14914:1;14894:17;14905:5;14894:10;:17::i;:::-;:21;14877:38;;14930:20;14964:6;14953:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14930:41;;14986:11;15115:6;15111:2;15107:15;15099:6;15095:28;15088:35;;15152:288;15159:4;15152:288;;;15184:5;;;;;;;;15326:8;15321:2;15314:5;15310:14;15305:30;15300:3;15292:44;15382:2;15373:11;;;;;;:::i;:::-;;;;;15416:1;15407:5;:10;15152:288;15403:21;15152:288;15461:6;15454:13;;;;;14770:716;;;:::o;47766:128::-;47831:4;47884:1;47855:31;;:17;47864:7;47855:8;:17::i;:::-;:31;;;;47848:38;;47766:128;;;:::o;57301:159::-;;;;;:::o;58182:158::-;;;;;:::o;49004:319::-;49133:18;49139:2;49143:7;49133:5;:18::i;:::-;49184:53;49215:1;49219:2;49223:7;49232:4;49184:22;:53::i;:::-;49162:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;49004:319;;;:::o;55716:853::-;55870:4;55891:15;:2;:13;;;:15::i;:::-;55887:675;;;55943:2;55927:36;;;55964:12;:10;:12::i;:::-;55978:4;55984:7;55993:4;55927:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55923:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56185:1;56168:6;:13;:18;56164:328;;56211:60;;;;;;;;;;:::i;:::-;;;;;;;;56164:328;56442:6;56436:13;56427:6;56423:2;56419:15;56412:38;55923:584;56059:41;;;56049:51;;;:6;:51;;;;56042:58;;;;;55887:675;56546:4;56539:11;;55716:853;;;;;;;:::o;11636:922::-;11689:7;11709:14;11726:1;11709:18;;11776:6;11767:5;:15;11763:102;;11812:6;11803:15;;;;;;:::i;:::-;;;;;11847:2;11837:12;;;;11763:102;11892:6;11883:5;:15;11879:102;;11928:6;11919:15;;;;;;:::i;:::-;;;;;11963:2;11953:12;;;;11879:102;12008:6;11999:5;:15;11995:102;;12044:6;12035:15;;;;;;:::i;:::-;;;;;12079:2;12069:12;;;;11995:102;12124:5;12115;:14;12111:99;;12159:5;12150:14;;;;;;:::i;:::-;;;;;12193:1;12183:11;;;;12111:99;12237:5;12228;:14;12224:99;;12272:5;12263:14;;;;;;:::i;:::-;;;;;12306:1;12296:11;;;;12224:99;12350:5;12341;:14;12337:99;;12385:5;12376:14;;;;;;:::i;:::-;;;;;12419:1;12409:11;;;;12337:99;12463:5;12454;:14;12450:66;;12499:1;12489:11;;;;12450:66;12544:6;12537:13;;;11636:922;;;:::o;18790:326::-;18850:4;19107:1;19085:7;:19;;;:23;19078:30;;18790:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:765::-;4223:6;4231;4239;4247;4296:3;4284:9;4275:7;4271:23;4267:33;4264:120;;;4303:79;;:::i;:::-;4264:120;4423:1;4448:53;4493:7;4484:6;4473:9;4469:22;4448:53;:::i;:::-;4438:63;;4394:117;4550:2;4576:53;4621:7;4612:6;4601:9;4597:22;4576:53;:::i;:::-;4566:63;;4521:118;4678:2;4704:53;4749:7;4740:6;4729:9;4725:22;4704:53;:::i;:::-;4694:63;;4649:118;4806:2;4832:53;4877:7;4868:6;4857:9;4853:22;4832:53;:::i;:::-;4822:63;;4777:118;4137:765;;;;;;;:::o;4908:122::-;4981:24;4999:5;4981:24;:::i;:::-;4974:5;4971:35;4961:63;;5020:1;5017;5010:12;4961:63;4908:122;:::o;5036:139::-;5082:5;5120:6;5107:20;5098:29;;5136:33;5163:5;5136:33;:::i;:::-;5036:139;;;;:::o;5181:474::-;5249:6;5257;5306:2;5294:9;5285:7;5281:23;5277:32;5274:119;;;5312:79;;:::i;:::-;5274:119;5432:1;5457:53;5502:7;5493:6;5482:9;5478:22;5457:53;:::i;:::-;5447:63;;5403:117;5559:2;5585:53;5630:7;5621:6;5610:9;5606:22;5585:53;:::i;:::-;5575:63;;5530:118;5181:474;;;;;:::o;5661:116::-;5731:21;5746:5;5731:21;:::i;:::-;5724:5;5721:32;5711:60;;5767:1;5764;5757:12;5711:60;5661:116;:::o;5783:133::-;5826:5;5864:6;5851:20;5842:29;;5880:30;5904:5;5880:30;:::i;:::-;5783:133;;;;:::o;5922:468::-;5987:6;5995;6044:2;6032:9;6023:7;6019:23;6015:32;6012:119;;;6050:79;;:::i;:::-;6012:119;6170:1;6195:50;6237:7;6228:6;6217:9;6213:22;6195:50;:::i;:::-;6185:60;;6141:114;6294:2;6320:53;6365:7;6356:6;6345:9;6341:22;6320:53;:::i;:::-;6310:63;;6265:118;5922:468;;;;;:::o;6396:118::-;6483:24;6501:5;6483:24;:::i;:::-;6478:3;6471:37;6396:118;;:::o;6520:222::-;6613:4;6651:2;6640:9;6636:18;6628:26;;6664:71;6732:1;6721:9;6717:17;6708:6;6664:71;:::i;:::-;6520:222;;;;:::o;6748:619::-;6825:6;6833;6841;6890:2;6878:9;6869:7;6865:23;6861:32;6858:119;;;6896:79;;:::i;:::-;6858:119;7016:1;7041:53;7086:7;7077:6;7066:9;7062:22;7041:53;:::i;:::-;7031:63;;6987:117;7143:2;7169:53;7214:7;7205:6;7194:9;7190:22;7169:53;:::i;:::-;7159:63;;7114:118;7271:2;7297:53;7342:7;7333:6;7322:9;7318:22;7297:53;:::i;:::-;7287:63;;7242:118;6748:619;;;;;:::o;7373:751::-;7594:4;7632:3;7621:9;7617:19;7609:27;;7646:71;7714:1;7703:9;7699:17;7690:6;7646:71;:::i;:::-;7727:72;7795:2;7784:9;7780:18;7771:6;7727:72;:::i;:::-;7809;7877:2;7866:9;7862:18;7853:6;7809:72;:::i;:::-;7891;7959:2;7948:9;7944:18;7935:6;7891:72;:::i;:::-;7973:67;8035:3;8024:9;8020:19;8011:6;7973:67;:::i;:::-;8050;8112:3;8101:9;8097:19;8088:6;8050:67;:::i;:::-;7373:751;;;;;;;;;:::o;8130:323::-;8186:6;8235:2;8223:9;8214:7;8210:23;8206:32;8203:119;;;8241:79;;:::i;:::-;8203:119;8361:1;8386:50;8428:7;8419:6;8408:9;8404:22;8386:50;:::i;:::-;8376:60;;8332:114;8130:323;;;;:::o;8459:664::-;8664:4;8702:3;8691:9;8687:19;8679:27;;8716:71;8784:1;8773:9;8769:17;8760:6;8716:71;:::i;:::-;8797:72;8865:2;8854:9;8850:18;8841:6;8797:72;:::i;:::-;8879;8947:2;8936:9;8932:18;8923:6;8879:72;:::i;:::-;8961;9029:2;9018:9;9014:18;9005:6;8961:72;:::i;:::-;9043:73;9111:3;9100:9;9096:19;9087:6;9043:73;:::i;:::-;8459:664;;;;;;;;:::o;9129:117::-;9238:1;9235;9228:12;9252:117;9361:1;9358;9351:12;9375:117;9484:1;9481;9474:12;9515:568;9588:8;9598:6;9648:3;9641:4;9633:6;9629:17;9625:27;9615:122;;9656:79;;:::i;:::-;9615:122;9769:6;9756:20;9746:30;;9799:18;9791:6;9788:30;9785:117;;;9821:79;;:::i;:::-;9785:117;9935:4;9927:6;9923:17;9911:29;;9989:3;9981:4;9973:6;9969:17;9959:8;9955:32;9952:41;9949:128;;;9996:79;;:::i;:::-;9949:128;9515:568;;;;;:::o;10089:704::-;10184:6;10192;10200;10249:2;10237:9;10228:7;10224:23;10220:32;10217:119;;;10255:79;;:::i;:::-;10217:119;10403:1;10392:9;10388:17;10375:31;10433:18;10425:6;10422:30;10419:117;;;10455:79;;:::i;:::-;10419:117;10568:80;10640:7;10631:6;10620:9;10616:22;10568:80;:::i;:::-;10550:98;;;;10346:312;10697:2;10723:53;10768:7;10759:6;10748:9;10744:22;10723:53;:::i;:::-;10713:63;;10668:118;10089:704;;;;;:::o;10799:329::-;10858:6;10907:2;10895:9;10886:7;10882:23;10878:32;10875:119;;;10913:79;;:::i;:::-;10875:119;11033:1;11058:53;11103:7;11094:6;11083:9;11079:22;11058:53;:::i;:::-;11048:63;;11004:117;10799:329;;;;:::o;11134:468::-;11199:6;11207;11256:2;11244:9;11235:7;11231:23;11227:32;11224:119;;;11262:79;;:::i;:::-;11224:119;11382:1;11407:53;11452:7;11443:6;11432:9;11428:22;11407:53;:::i;:::-;11397:63;;11353:117;11509:2;11535:50;11577:7;11568:6;11557:9;11553:22;11535:50;:::i;:::-;11525:60;;11480:115;11134:468;;;;;:::o;11608:::-;11673:6;11681;11730:2;11718:9;11709:7;11705:23;11701:32;11698:119;;;11736:79;;:::i;:::-;11698:119;11856:1;11881:53;11926:7;11917:6;11906:9;11902:22;11881:53;:::i;:::-;11871:63;;11827:117;11983:2;12009:50;12051:7;12042:6;12031:9;12027:22;12009:50;:::i;:::-;11999:60;;11954:115;11608:468;;;;;:::o;12082:474::-;12150:6;12158;12207:2;12195:9;12186:7;12182:23;12178:32;12175:119;;;12213:79;;:::i;:::-;12175:119;12333:1;12358:53;12403:7;12394:6;12383:9;12379:22;12358:53;:::i;:::-;12348:63;;12304:117;12460:2;12486:53;12531:7;12522:6;12511:9;12507:22;12486:53;:::i;:::-;12476:63;;12431:118;12082:474;;;;;:::o;12562:117::-;12671:1;12668;12661:12;12685:180;12733:77;12730:1;12723:88;12830:4;12827:1;12820:15;12854:4;12851:1;12844:15;12871:281;12954:27;12976:4;12954:27;:::i;:::-;12946:6;12942:40;13084:6;13072:10;13069:22;13048:18;13036:10;13033:34;13030:62;13027:88;;;13095:18;;:::i;:::-;13027:88;13135:10;13131:2;13124:22;12914:238;12871:281;;:::o;13158:129::-;13192:6;13219:20;;:::i;:::-;13209:30;;13248:33;13276:4;13268:6;13248:33;:::i;:::-;13158:129;;;:::o;13293:307::-;13354:4;13444:18;13436:6;13433:30;13430:56;;;13466:18;;:::i;:::-;13430:56;13504:29;13526:6;13504:29;:::i;:::-;13496:37;;13588:4;13582;13578:15;13570:23;;13293:307;;;:::o;13606:146::-;13703:6;13698:3;13693;13680:30;13744:1;13735:6;13730:3;13726:16;13719:27;13606:146;;;:::o;13758:423::-;13835:5;13860:65;13876:48;13917:6;13876:48;:::i;:::-;13860:65;:::i;:::-;13851:74;;13948:6;13941:5;13934:21;13986:4;13979:5;13975:16;14024:3;14015:6;14010:3;14006:16;14003:25;14000:112;;;14031:79;;:::i;:::-;14000:112;14121:54;14168:6;14163:3;14158;14121:54;:::i;:::-;13841:340;13758:423;;;;;:::o;14200:338::-;14255:5;14304:3;14297:4;14289:6;14285:17;14281:27;14271:122;;14312:79;;:::i;:::-;14271:122;14429:6;14416:20;14454:78;14528:3;14520:6;14513:4;14505:6;14501:17;14454:78;:::i;:::-;14445:87;;14261:277;14200:338;;;;:::o;14544:943::-;14639:6;14647;14655;14663;14712:3;14700:9;14691:7;14687:23;14683:33;14680:120;;;14719:79;;:::i;:::-;14680:120;14839:1;14864:53;14909:7;14900:6;14889:9;14885:22;14864:53;:::i;:::-;14854:63;;14810:117;14966:2;14992:53;15037:7;15028:6;15017:9;15013:22;14992:53;:::i;:::-;14982:63;;14937:118;15094:2;15120:53;15165:7;15156:6;15145:9;15141:22;15120:53;:::i;:::-;15110:63;;15065:118;15250:2;15239:9;15235:18;15222:32;15281:18;15273:6;15270:30;15267:117;;;15303:79;;:::i;:::-;15267:117;15408:62;15462:7;15453:6;15442:9;15438:22;15408:62;:::i;:::-;15398:72;;15193:287;14544:943;;;;;;;:::o;15507:553::-;15565:8;15575:6;15625:3;15618:4;15610:6;15606:17;15602:27;15592:122;;15633:79;;:::i;:::-;15592:122;15746:6;15733:20;15723:30;;15776:18;15768:6;15765:30;15762:117;;;15798:79;;:::i;:::-;15762:117;15912:4;15904:6;15900:17;15888:29;;15966:3;15958:4;15950:6;15946:17;15936:8;15932:32;15929:41;15926:128;;;15973:79;;:::i;:::-;15926:128;15507:553;;;;;:::o;16066:529::-;16137:6;16145;16194:2;16182:9;16173:7;16169:23;16165:32;16162:119;;;16200:79;;:::i;:::-;16162:119;16348:1;16337:9;16333:17;16320:31;16378:18;16370:6;16367:30;16364:117;;;16400:79;;:::i;:::-;16364:117;16513:65;16570:7;16561:6;16550:9;16546:22;16513:65;:::i;:::-;16495:83;;;;16291:297;16066:529;;;;;:::o;16601:474::-;16669:6;16677;16726:2;16714:9;16705:7;16701:23;16697:32;16694:119;;;16732:79;;:::i;:::-;16694:119;16852:1;16877:53;16922:7;16913:6;16902:9;16898:22;16877:53;:::i;:::-;16867:63;;16823:117;16979:2;17005:53;17050:7;17041:6;17030:9;17026:22;17005:53;:::i;:::-;16995:63;;16950:118;16601:474;;;;;:::o;17081:311::-;17158:4;17248:18;17240:6;17237:30;17234:56;;;17270:18;;:::i;:::-;17234:56;17320:4;17312:6;17308:17;17300:25;;17380:4;17374;17370:15;17362:23;;17081:311;;;:::o;17415:710::-;17511:5;17536:81;17552:64;17609:6;17552:64;:::i;:::-;17536:81;:::i;:::-;17527:90;;17637:5;17666:6;17659:5;17652:21;17700:4;17693:5;17689:16;17682:23;;17753:4;17745:6;17741:17;17733:6;17729:30;17782:3;17774:6;17771:15;17768:122;;;17801:79;;:::i;:::-;17768:122;17916:6;17899:220;17933:6;17928:3;17925:15;17899:220;;;18008:3;18037:37;18070:3;18058:10;18037:37;:::i;:::-;18032:3;18025:50;18104:4;18099:3;18095:14;18088:21;;17975:144;17959:4;17954:3;17950:14;17943:21;;17899:220;;;17903:21;17517:608;;17415:710;;;;;:::o;18148:370::-;18219:5;18268:3;18261:4;18253:6;18249:17;18245:27;18235:122;;18276:79;;:::i;:::-;18235:122;18393:6;18380:20;18418:94;18508:3;18500:6;18493:4;18485:6;18481:17;18418:94;:::i;:::-;18409:103;;18225:293;18148:370;;;;:::o;18524:684::-;18617:6;18625;18674:2;18662:9;18653:7;18649:23;18645:32;18642:119;;;18680:79;;:::i;:::-;18642:119;18828:1;18817:9;18813:17;18800:31;18858:18;18850:6;18847:30;18844:117;;;18880:79;;:::i;:::-;18844:117;18985:78;19055:7;19046:6;19035:9;19031:22;18985:78;:::i;:::-;18975:88;;18771:302;19112:2;19138:53;19183:7;19174:6;19163:9;19159:22;19138:53;:::i;:::-;19128:63;;19083:118;18524:684;;;;;:::o;19214:180::-;19262:77;19259:1;19252:88;19359:4;19356:1;19349:15;19383:4;19380:1;19373:15;19400:320;19444:6;19481:1;19475:4;19471:12;19461:22;;19528:1;19522:4;19518:12;19549:18;19539:81;;19605:4;19597:6;19593:17;19583:27;;19539:81;19667:2;19659:6;19656:14;19636:18;19633:38;19630:84;;19686:18;;:::i;:::-;19630:84;19451:269;19400:320;;;:::o;19726:143::-;19783:5;19814:6;19808:13;19799:22;;19830:33;19857:5;19830:33;:::i;:::-;19726:143;;;;:::o;19875:351::-;19945:6;19994:2;19982:9;19973:7;19969:23;19965:32;19962:119;;;20000:79;;:::i;:::-;19962:119;20120:1;20145:64;20201:7;20192:6;20181:9;20177:22;20145:64;:::i;:::-;20135:74;;20091:128;19875:351;;;;:::o;20232:176::-;20372:28;20368:1;20360:6;20356:14;20349:52;20232:176;:::o;20414:366::-;20556:3;20577:67;20641:2;20636:3;20577:67;:::i;:::-;20570:74;;20653:93;20742:3;20653:93;:::i;:::-;20771:2;20766:3;20762:12;20755:19;;20414:366;;;:::o;20786:419::-;20952:4;20990:2;20979:9;20975:18;20967:26;;21039:9;21033:4;21029:20;21025:1;21014:9;21010:17;21003:47;21067:131;21193:4;21067:131;:::i;:::-;21059:139;;20786:419;;;:::o;21211:224::-;21351:34;21347:1;21339:6;21335:14;21328:58;21420:7;21415:2;21407:6;21403:15;21396:32;21211:224;:::o;21441:366::-;21583:3;21604:67;21668:2;21663:3;21604:67;:::i;:::-;21597:74;;21680:93;21769:3;21680:93;:::i;:::-;21798:2;21793:3;21789:12;21782:19;;21441:366;;;:::o;21813:419::-;21979:4;22017:2;22006:9;22002:18;21994:26;;22066:9;22060:4;22056:20;22052:1;22041:9;22037:17;22030:47;22094:131;22220:4;22094:131;:::i;:::-;22086:139;;21813:419;;;:::o;22238:180::-;22286:77;22283:1;22276:88;22383:4;22380:1;22373:15;22407:4;22404:1;22397:15;22424:191;22464:3;22483:20;22501:1;22483:20;:::i;:::-;22478:25;;22517:20;22535:1;22517:20;:::i;:::-;22512:25;;22560:1;22557;22553:9;22546:16;;22581:3;22578:1;22575:10;22572:36;;;22588:18;;:::i;:::-;22572:36;22424:191;;;;:::o;22621:233::-;22660:3;22683:24;22701:5;22683:24;:::i;:::-;22674:33;;22729:66;22722:5;22719:77;22716:103;;22799:18;;:::i;:::-;22716:103;22846:1;22839:5;22835:13;22828:20;;22621:233;;;:::o;22860:220::-;23000:34;22996:1;22988:6;22984:14;22977:58;23069:3;23064:2;23056:6;23052:15;23045:28;22860:220;:::o;23086:366::-;23228:3;23249:67;23313:2;23308:3;23249:67;:::i;:::-;23242:74;;23325:93;23414:3;23325:93;:::i;:::-;23443:2;23438:3;23434:12;23427:19;;23086:366;;;:::o;23458:419::-;23624:4;23662:2;23651:9;23647:18;23639:26;;23711:9;23705:4;23701:20;23697:1;23686:9;23682:17;23675:47;23739:131;23865:4;23739:131;:::i;:::-;23731:139;;23458:419;;;:::o;23883:248::-;24023:34;24019:1;24011:6;24007:14;24000:58;24092:31;24087:2;24079:6;24075:15;24068:56;23883:248;:::o;24137:366::-;24279:3;24300:67;24364:2;24359:3;24300:67;:::i;:::-;24293:74;;24376:93;24465:3;24376:93;:::i;:::-;24494:2;24489:3;24485:12;24478:19;;24137:366;;;:::o;24509:419::-;24675:4;24713:2;24702:9;24698:18;24690:26;;24762:9;24756:4;24752:20;24748:1;24737:9;24733:17;24726:47;24790:131;24916:4;24790:131;:::i;:::-;24782:139;;24509:419;;;:::o;24934:171::-;25074:23;25070:1;25062:6;25058:14;25051:47;24934:171;:::o;25111:366::-;25253:3;25274:67;25338:2;25333:3;25274:67;:::i;:::-;25267:74;;25350:93;25439:3;25350:93;:::i;:::-;25468:2;25463:3;25459:12;25452:19;;25111:366;;;:::o;25483:419::-;25649:4;25687:2;25676:9;25672:18;25664:26;;25736:9;25730:4;25726:20;25722:1;25711:9;25707:17;25700:47;25764:131;25890:4;25764:131;:::i;:::-;25756:139;;25483:419;;;:::o;25908:232::-;26048:34;26044:1;26036:6;26032:14;26025:58;26117:15;26112:2;26104:6;26100:15;26093:40;25908:232;:::o;26146:366::-;26288:3;26309:67;26373:2;26368:3;26309:67;:::i;:::-;26302:74;;26385:93;26474:3;26385:93;:::i;:::-;26503:2;26498:3;26494:12;26487:19;;26146:366;;;:::o;26518:419::-;26684:4;26722:2;26711:9;26707:18;26699:26;;26771:9;26765:4;26761:20;26757:1;26746:9;26742:17;26735:47;26799:131;26925:4;26799:131;:::i;:::-;26791:139;;26518:419;;;:::o;26943:179::-;27083:31;27079:1;27071:6;27067:14;27060:55;26943:179;:::o;27128:366::-;27270:3;27291:67;27355:2;27350:3;27291:67;:::i;:::-;27284:74;;27367:93;27456:3;27367:93;:::i;:::-;27485:2;27480:3;27476:12;27469:19;;27128:366;;;:::o;27500:419::-;27666:4;27704:2;27693:9;27689:18;27681:26;;27753:9;27747:4;27743:20;27739:1;27728:9;27724:17;27717:47;27781:131;27907:4;27781:131;:::i;:::-;27773:139;;27500:419;;;:::o;27925:171::-;27964:3;27987:24;28005:5;27987:24;:::i;:::-;27978:33;;28033:4;28026:5;28023:15;28020:41;;28041:18;;:::i;:::-;28020:41;28088:1;28081:5;28077:13;28070:20;;27925:171;;;:::o;28102:180::-;28150:77;28147:1;28140:88;28247:4;28244:1;28237:15;28271:4;28268:1;28261:15;28288:174;28428:26;28424:1;28416:6;28412:14;28405:50;28288:174;:::o;28468:366::-;28610:3;28631:67;28695:2;28690:3;28631:67;:::i;:::-;28624:74;;28707:93;28796:3;28707:93;:::i;:::-;28825:2;28820:3;28816:12;28809:19;;28468:366;;;:::o;28840:419::-;29006:4;29044:2;29033:9;29029:18;29021:26;;29093:9;29087:4;29083:20;29079:1;29068:9;29064:17;29057:47;29121:131;29247:4;29121:131;:::i;:::-;29113:139;;28840:419;;;:::o;29265:228::-;29405:34;29401:1;29393:6;29389:14;29382:58;29474:11;29469:2;29461:6;29457:15;29450:36;29265:228;:::o;29499:366::-;29641:3;29662:67;29726:2;29721:3;29662:67;:::i;:::-;29655:74;;29738:93;29827:3;29738:93;:::i;:::-;29856:2;29851:3;29847:12;29840:19;;29499:366;;;:::o;29871:419::-;30037:4;30075:2;30064:9;30060:18;30052:26;;30124:9;30118:4;30114:20;30110:1;30099:9;30095:17;30088:47;30152:131;30278:4;30152:131;:::i;:::-;30144:139;;29871:419;;;:::o;30296:176::-;30436:28;30432:1;30424:6;30420:14;30413:52;30296:176;:::o;30478:366::-;30620:3;30641:67;30705:2;30700:3;30641:67;:::i;:::-;30634:74;;30717:93;30806:3;30717:93;:::i;:::-;30835:2;30830:3;30826:12;30819:19;;30478:366;;;:::o;30850:419::-;31016:4;31054:2;31043:9;31039:18;31031:26;;31103:9;31097:4;31093:20;31089:1;31078:9;31074:17;31067:47;31131:131;31257:4;31131:131;:::i;:::-;31123:139;;30850:419;;;:::o;31275:220::-;31415:34;31411:1;31403:6;31399:14;31392:58;31484:3;31479:2;31471:6;31467:15;31460:28;31275:220;:::o;31501:366::-;31643:3;31664:67;31728:2;31723:3;31664:67;:::i;:::-;31657:74;;31740:93;31829:3;31740:93;:::i;:::-;31858:2;31853:3;31849:12;31842:19;;31501:366;;;:::o;31873:419::-;32039:4;32077:2;32066:9;32062:18;32054:26;;32126:9;32120:4;32116:20;32112:1;32101:9;32097:17;32090:47;32154:131;32280:4;32154:131;:::i;:::-;32146:139;;31873:419;;;:::o;32298:175::-;32438:27;32434:1;32426:6;32422:14;32415:51;32298:175;:::o;32479:366::-;32621:3;32642:67;32706:2;32701:3;32642:67;:::i;:::-;32635:74;;32718:93;32807:3;32718:93;:::i;:::-;32836:2;32831:3;32827:12;32820:19;;32479:366;;;:::o;32851:419::-;33017:4;33055:2;33044:9;33040:18;33032:26;;33104:9;33098:4;33094:20;33090:1;33079:9;33075:17;33068:47;33132:131;33258:4;33132:131;:::i;:::-;33124:139;;32851:419;;;:::o;33276:173::-;33416:25;33412:1;33404:6;33400:14;33393:49;33276:173;:::o;33455:366::-;33597:3;33618:67;33682:2;33677:3;33618:67;:::i;:::-;33611:74;;33694:93;33783:3;33694:93;:::i;:::-;33812:2;33807:3;33803:12;33796:19;;33455:366;;;:::o;33827:419::-;33993:4;34031:2;34020:9;34016:18;34008:26;;34080:9;34074:4;34070:20;34066:1;34055:9;34051:17;34044:47;34108:131;34234:4;34108:131;:::i;:::-;34100:139;;33827:419;;;:::o;34252:410::-;34292:7;34315:20;34333:1;34315:20;:::i;:::-;34310:25;;34349:20;34367:1;34349:20;:::i;:::-;34344:25;;34404:1;34401;34397:9;34426:30;34444:11;34426:30;:::i;:::-;34415:41;;34605:1;34596:7;34592:15;34589:1;34586:22;34566:1;34559:9;34539:83;34516:139;;34635:18;;:::i;:::-;34516:139;34300:362;34252:410;;;;:::o;34668:238::-;34808:34;34804:1;34796:6;34792:14;34785:58;34877:21;34872:2;34864:6;34860:15;34853:46;34668:238;:::o;34912:366::-;35054:3;35075:67;35139:2;35134:3;35075:67;:::i;:::-;35068:74;;35151:93;35240:3;35151:93;:::i;:::-;35269:2;35264:3;35260:12;35253:19;;34912:366;;;:::o;35284:419::-;35450:4;35488:2;35477:9;35473:18;35465:26;;35537:9;35531:4;35527:20;35523:1;35512:9;35508:17;35501:47;35565:131;35691:4;35565:131;:::i;:::-;35557:139;;35284:419;;;:::o;35709:194::-;35749:4;35769:20;35787:1;35769:20;:::i;:::-;35764:25;;35803:20;35821:1;35803:20;:::i;:::-;35798:25;;35847:1;35844;35840:9;35832:17;;35871:1;35865:4;35862:11;35859:37;;;35876:18;;:::i;:::-;35859:37;35709:194;;;;:::o;35909:245::-;36049:34;36045:1;36037:6;36033:14;36026:58;36118:28;36113:2;36105:6;36101:15;36094:53;35909:245;:::o;36160:366::-;36302:3;36323:67;36387:2;36382:3;36323:67;:::i;:::-;36316:74;;36399:93;36488:3;36399:93;:::i;:::-;36517:2;36512:3;36508:12;36501:19;;36160:366;;;:::o;36532:419::-;36698:4;36736:2;36725:9;36721:18;36713:26;;36785:9;36779:4;36775:20;36771:1;36760:9;36756:17;36749:47;36813:131;36939:4;36813:131;:::i;:::-;36805:139;;36532:419;;;:::o;36957:148::-;37059:11;37096:3;37081:18;;36957:148;;;;:::o;37111:390::-;37217:3;37245:39;37278:5;37245:39;:::i;:::-;37300:89;37382:6;37377:3;37300:89;:::i;:::-;37293:96;;37398:65;37456:6;37451:3;37444:4;37437:5;37433:16;37398:65;:::i;:::-;37488:6;37483:3;37479:16;37472:23;;37221:280;37111:390;;;;:::o;37507:155::-;37647:7;37643:1;37635:6;37631:14;37624:31;37507:155;:::o;37668:400::-;37828:3;37849:84;37931:1;37926:3;37849:84;:::i;:::-;37842:91;;37942:93;38031:3;37942:93;:::i;:::-;38060:1;38055:3;38051:11;38044:18;;37668:400;;;:::o;38074:701::-;38355:3;38377:95;38468:3;38459:6;38377:95;:::i;:::-;38370:102;;38489:95;38580:3;38571:6;38489:95;:::i;:::-;38482:102;;38601:148;38745:3;38601:148;:::i;:::-;38594:155;;38766:3;38759:10;;38074:701;;;;;:::o;38781:158::-;38921:10;38917:1;38909:6;38905:14;38898:34;38781:158;:::o;38945:400::-;39105:3;39126:84;39208:1;39203:3;39126:84;:::i;:::-;39119:91;;39219:93;39308:3;39219:93;:::i;:::-;39337:1;39332:3;39328:11;39321:18;;38945:400;;;:::o;39351:541::-;39584:3;39606:95;39697:3;39688:6;39606:95;:::i;:::-;39599:102;;39718:148;39862:3;39718:148;:::i;:::-;39711:155;;39883:3;39876:10;;39351:541;;;;:::o;39898:159::-;40038:11;40034:1;40026:6;40022:14;40015:35;39898:159;:::o;40063:400::-;40223:3;40244:84;40326:1;40321:3;40244:84;:::i;:::-;40237:91;;40337:93;40426:3;40337:93;:::i;:::-;40455:1;40450:3;40446:11;40439:18;;40063:400;;;:::o;40469:541::-;40702:3;40724:95;40815:3;40806:6;40724:95;:::i;:::-;40717:102;;40836:148;40980:3;40836:148;:::i;:::-;40829:155;;41001:3;40994:10;;40469:541;;;;:::o;41016:97::-;41075:6;41103:3;41093:13;;41016:97;;;;:::o;41119:141::-;41168:4;41191:3;41183:11;;41214:3;41211:1;41204:14;41248:4;41245:1;41235:18;41227:26;;41119:141;;;:::o;41266:93::-;41303:6;41350:2;41345;41338:5;41334:14;41330:23;41320:33;;41266:93;;;:::o;41365:107::-;41409:8;41459:5;41453:4;41449:16;41428:37;;41365:107;;;;:::o;41478:393::-;41547:6;41597:1;41585:10;41581:18;41620:97;41650:66;41639:9;41620:97;:::i;:::-;41738:39;41768:8;41757:9;41738:39;:::i;:::-;41726:51;;41810:4;41806:9;41799:5;41795:21;41786:30;;41859:4;41849:8;41845:19;41838:5;41835:30;41825:40;;41554:317;;41478:393;;;;;:::o;41877:60::-;41905:3;41926:5;41919:12;;41877:60;;;:::o;41943:142::-;41993:9;42026:53;42044:34;42053:24;42071:5;42053:24;:::i;:::-;42044:34;:::i;:::-;42026:53;:::i;:::-;42013:66;;41943:142;;;:::o;42091:75::-;42134:3;42155:5;42148:12;;42091:75;;;:::o;42172:269::-;42282:39;42313:7;42282:39;:::i;:::-;42343:91;42392:41;42416:16;42392:41;:::i;:::-;42384:6;42377:4;42371:11;42343:91;:::i;:::-;42337:4;42330:105;42248:193;42172:269;;;:::o;42447:73::-;42492:3;42447:73;:::o;42526:189::-;42603:32;;:::i;:::-;42644:65;42702:6;42694;42688:4;42644:65;:::i;:::-;42579:136;42526:189;;:::o;42721:186::-;42781:120;42798:3;42791:5;42788:14;42781:120;;;42852:39;42889:1;42882:5;42852:39;:::i;:::-;42825:1;42818:5;42814:13;42805:22;;42781:120;;;42721:186;;:::o;42913:543::-;43014:2;43009:3;43006:11;43003:446;;;43048:38;43080:5;43048:38;:::i;:::-;43132:29;43150:10;43132:29;:::i;:::-;43122:8;43118:44;43315:2;43303:10;43300:18;43297:49;;;43336:8;43321:23;;43297:49;43359:80;43415:22;43433:3;43415:22;:::i;:::-;43405:8;43401:37;43388:11;43359:80;:::i;:::-;43018:431;;43003:446;42913:543;;;:::o;43462:117::-;43516:8;43566:5;43560:4;43556:16;43535:37;;43462:117;;;;:::o;43585:169::-;43629:6;43662:51;43710:1;43706:6;43698:5;43695:1;43691:13;43662:51;:::i;:::-;43658:56;43743:4;43737;43733:15;43723:25;;43636:118;43585:169;;;;:::o;43759:295::-;43835:4;43981:29;44006:3;44000:4;43981:29;:::i;:::-;43973:37;;44043:3;44040:1;44036:11;44030:4;44027:21;44019:29;;43759:295;;;;:::o;44059:1403::-;44183:44;44223:3;44218;44183:44;:::i;:::-;44292:18;44284:6;44281:30;44278:56;;;44314:18;;:::i;:::-;44278:56;44358:38;44390:4;44384:11;44358:38;:::i;:::-;44443:67;44503:6;44495;44489:4;44443:67;:::i;:::-;44537:1;44566:2;44558:6;44555:14;44583:1;44578:632;;;;45254:1;45271:6;45268:84;;;45327:9;45322:3;45318:19;45305:33;45296:42;;45268:84;45378:67;45438:6;45431:5;45378:67;:::i;:::-;45372:4;45365:81;45227:229;44548:908;;44578:632;44630:4;44626:9;44618:6;44614:22;44664:37;44696:4;44664:37;:::i;:::-;44723:1;44737:215;44751:7;44748:1;44745:14;44737:215;;;44837:9;44832:3;44828:19;44815:33;44807:6;44800:49;44888:1;44880:6;44876:14;44866:24;;44935:2;44924:9;44920:18;44907:31;;44774:4;44771:1;44767:12;44762:17;;44737:215;;;44980:6;44971:7;44968:19;44965:186;;;45045:9;45040:3;45036:19;45023:33;45088:48;45130:4;45122:6;45118:17;45107:9;45088:48;:::i;:::-;45080:6;45073:64;44988:163;44965:186;45197:1;45193;45185:6;45181:14;45177:22;45171:4;45164:36;44585:625;;;44548:908;;44158:1304;;;44059:1403;;;:::o;45468:174::-;45608:26;45604:1;45596:6;45592:14;45585:50;45468:174;:::o;45648:366::-;45790:3;45811:67;45875:2;45870:3;45811:67;:::i;:::-;45804:74;;45887:93;45976:3;45887:93;:::i;:::-;46005:2;46000:3;45996:12;45989:19;;45648:366;;;:::o;46020:419::-;46186:4;46224:2;46213:9;46209:18;46201:26;;46273:9;46267:4;46263:20;46259:1;46248:9;46244:17;46237:47;46301:131;46427:4;46301:131;:::i;:::-;46293:139;;46020:419;;;:::o;46445:182::-;46585:34;46581:1;46573:6;46569:14;46562:58;46445:182;:::o;46633:366::-;46775:3;46796:67;46860:2;46855:3;46796:67;:::i;:::-;46789:74;;46872:93;46961:3;46872:93;:::i;:::-;46990:2;46985:3;46981:12;46974:19;;46633:366;;;:::o;47005:419::-;47171:4;47209:2;47198:9;47194:18;47186:26;;47258:9;47252:4;47248:20;47244:1;47233:9;47229:17;47222:47;47286:131;47412:4;47286:131;:::i;:::-;47278:139;;47005:419;;;:::o;47430:178::-;47570:30;47566:1;47558:6;47554:14;47547:54;47430:178;:::o;47614:366::-;47756:3;47777:67;47841:2;47836:3;47777:67;:::i;:::-;47770:74;;47853:93;47942:3;47853:93;:::i;:::-;47971:2;47966:3;47962:12;47955:19;;47614:366;;;:::o;47986:419::-;48152:4;48190:2;48179:9;48175:18;48167:26;;48239:9;48233:4;48229:20;48225:1;48214:9;48210:17;48203:47;48267:131;48393:4;48267:131;:::i;:::-;48259:139;;47986:419;;;:::o;48411:224::-;48551:34;48547:1;48539:6;48535:14;48528:58;48620:7;48615:2;48607:6;48603:15;48596:32;48411:224;:::o;48641:366::-;48783:3;48804:67;48868:2;48863:3;48804:67;:::i;:::-;48797:74;;48880:93;48969:3;48880:93;:::i;:::-;48998:2;48993:3;48989:12;48982:19;;48641:366;;;:::o;49013:419::-;49179:4;49217:2;49206:9;49202:18;49194:26;;49266:9;49260:4;49256:20;49252:1;49241:9;49237:17;49230:47;49294:131;49420:4;49294:131;:::i;:::-;49286:139;;49013:419;;;:::o;49438:223::-;49578:34;49574:1;49566:6;49562:14;49555:58;49647:6;49642:2;49634:6;49630:15;49623:31;49438:223;:::o;49667:366::-;49809:3;49830:67;49894:2;49889:3;49830:67;:::i;:::-;49823:74;;49906:93;49995:3;49906:93;:::i;:::-;50024:2;50019:3;50015:12;50008:19;;49667:366;;;:::o;50039:419::-;50205:4;50243:2;50232:9;50228:18;50220:26;;50292:9;50286:4;50282:20;50278:1;50267:9;50263:17;50256:47;50320:131;50446:4;50320:131;:::i;:::-;50312:139;;50039:419;;;:::o;50464:170::-;50604:22;50600:1;50592:6;50588:14;50581:46;50464:170;:::o;50640:366::-;50782:3;50803:67;50867:2;50862:3;50803:67;:::i;:::-;50796:74;;50879:93;50968:3;50879:93;:::i;:::-;50997:2;50992:3;50988:12;50981:19;;50640:366;;;:::o;51012:419::-;51178:4;51216:2;51205:9;51201:18;51193:26;;51265:9;51259:4;51255:20;51251:1;51240:9;51236:17;51229:47;51293:131;51419:4;51293:131;:::i;:::-;51285:139;;51012:419;;;:::o;51437:175::-;51577:27;51573:1;51565:6;51561:14;51554:51;51437:175;:::o;51618:366::-;51760:3;51781:67;51845:2;51840:3;51781:67;:::i;:::-;51774:74;;51857:93;51946:3;51857:93;:::i;:::-;51975:2;51970:3;51966:12;51959:19;;51618:366;;;:::o;51990:419::-;52156:4;52194:2;52183:9;52179:18;52171:26;;52243:9;52237:4;52233:20;52229:1;52218:9;52214:17;52207:47;52271:131;52397:4;52271:131;:::i;:::-;52263:139;;51990:419;;;:::o;52415:237::-;52555:34;52551:1;52543:6;52539:14;52532:58;52624:20;52619:2;52611:6;52607:15;52600:45;52415:237;:::o;52658:366::-;52800:3;52821:67;52885:2;52880:3;52821:67;:::i;:::-;52814:74;;52897:93;52986:3;52897:93;:::i;:::-;53015:2;53010:3;53006:12;52999:19;;52658:366;;;:::o;53030:419::-;53196:4;53234:2;53223:9;53219:18;53211:26;;53283:9;53277:4;53273:20;53269:1;53258:9;53254:17;53247:47;53311:131;53437:4;53311:131;:::i;:::-;53303:139;;53030:419;;;:::o;53455:180::-;53503:77;53500:1;53493:88;53600:4;53597:1;53590:15;53624:4;53621:1;53614:15;53641:98;53692:6;53726:5;53720:12;53710:22;;53641:98;;;:::o;53745:168::-;53828:11;53862:6;53857:3;53850:19;53902:4;53897:3;53893:14;53878:29;;53745:168;;;;:::o;53919:373::-;54005:3;54033:38;54065:5;54033:38;:::i;:::-;54087:70;54150:6;54145:3;54087:70;:::i;:::-;54080:77;;54166:65;54224:6;54219:3;54212:4;54205:5;54201:16;54166:65;:::i;:::-;54256:29;54278:6;54256:29;:::i;:::-;54251:3;54247:39;54240:46;;54009:283;53919:373;;;;:::o;54298:640::-;54493:4;54531:3;54520:9;54516:19;54508:27;;54545:71;54613:1;54602:9;54598:17;54589:6;54545:71;:::i;:::-;54626:72;54694:2;54683:9;54679:18;54670:6;54626:72;:::i;:::-;54708;54776:2;54765:9;54761:18;54752:6;54708:72;:::i;:::-;54827:9;54821:4;54817:20;54812:2;54801:9;54797:18;54790:48;54855:76;54926:4;54917:6;54855:76;:::i;:::-;54847:84;;54298:640;;;;;;;:::o;54944:141::-;55000:5;55031:6;55025:13;55016:22;;55047:32;55073:5;55047:32;:::i;:::-;54944:141;;;;:::o;55091:349::-;55160:6;55209:2;55197:9;55188:7;55184:23;55180:32;55177:119;;;55215:79;;:::i;:::-;55177:119;55335:1;55360:63;55415:7;55406:6;55395:9;55391:22;55360:63;:::i;:::-;55350:73;;55306:127;55091:349;;;;:::o

Swarm Source

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