Token Crazzzy Monsters

Overview CRC721

Total Supply:
8,413 CMOG

Holders:
278 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CrazzzyMonsters

Compiler Version
v0.8.17+commit.8df45f5f

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

// File: @openzeppelin/contracts/utils/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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.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/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// 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/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not 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;

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

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

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

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/3_Ballot.sol


pragma solidity ^0.8.17;

// Coded by CRMax






contract CrazzzyMonsters is ERC721Enumerable, ERC2981, Ownable, ReentrancyGuard{
    using Strings for uint256;
    uint256 public publicTimestamp = 1681412400; // Thursday April 13, 7PM UTC
    string baseURI;
    string public baseExtension = ".json";
    uint256 public cost = 60 ether;
    uint256 public wlCost = 45 ether;
    uint256 public constant maxSupply = 10000;
    uint256[maxSupply] internal availableIds;
    address public burnContract;
    bool public paused = false;
    address[] holders;
    uint256[] counts;
    address public teamWallet = 0x81a6147d6bd8B43F13704908D1Fb30460980283d;
    uint256 public teamFee = 950; // 95%
    address public crmaxWallet = 0xd40D96B07e0f9FDFE66306F0975f6025E01A5ce5;
    uint256 public crmaxFee = 50; // 5%
    address public royaltyWallet = 0x9D2349C58861287358905e133F28c5F0a5b687E3;
    uint256 constant SCALE = 1000;
    mapping(address => bool) public whitelisted;

    struct MintInfo {
        bool paused;
        uint256 supply;
        uint256 publicTimestamp;
    }

    constructor() ERC721("Crazzzy Monsters", "CMOG") {
        setDefaultRoyalty(royaltyWallet, 1000);
    }

    // external
    function setBurnContractAddress(address newAddr) external onlyOwner {
        burnContract = newAddr;
    }

    function withdraw() external {
        uint256 balance = address(this).balance;
        uint256 team = (balance * teamFee) / SCALE;
        uint256 crmax = (balance * crmaxFee) / SCALE;
        (bool sent, ) = payable(teamWallet).call{value: team}("");
        require(sent, "Sending cro failed");
        (sent, ) = payable(crmaxWallet).call{value: crmax}("");
        require(sent, "Sending cro failed");
    }

    function burn(uint256 tokenId) external {
        require(msg.sender == burnContract, "Not the burn contract");
        _burn(tokenId);
    }

    function getMintInfo() external view returns (MintInfo memory) {
        return MintInfo(paused, totalSupply(), publicTimestamp);
    }

    // public
    function setDefaultRoyalty(
        address receiver,
        uint96 feeNumerator

    ) public onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function quoteMintValue(uint256 amount) public view returns (uint256 mintValue) {
        uint256 amountNormal = amount;
        uint256 amountDiscount = 0;

        if (whitelisted[msg.sender]) {
            if (balanceOf(msg.sender) < 25) {
                if (balanceOf(msg.sender) + amount < 25) {
                    amountDiscount = amount;
                    amountNormal = 0;
                }
                else {
                    amountDiscount = 25 - balanceOf(msg.sender);
                    amountNormal = amount - amountDiscount;
                }
            }
        }

        mintValue = cost * amountNormal + wlCost * amountDiscount;
    }

    function mint(uint256 amount) public payable {
        require(!paused, "paused");
        require(block.timestamp >= publicTimestamp, "Mint is not live yet");
        require(amount > 0 && amount <= 25, "Invalid amount");
        uint256 supply = totalSupply();
        require(supply + amount <= maxSupply, "Max supply exceeded");
        uint256 mintValue = quoteMintValue(amount);
        require(msg.value >= mintValue, "insufficient funds");

        for (uint256 i = 0; i < amount; i++) {
            _safeMint(msg.sender, _getNewId(supply+i));
        }
    }

    function walletOfOwner(
        address _owner
    ) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(
        uint256 tokenId
    ) public view virtual override returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

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

    function setBaseExtension(
        string memory _newBaseExtension
    ) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setAirDropCounts(
        address[] memory _holders,
        uint256[] memory _counts
    ) external onlyOwner {
        require(_holders.length == _counts.length, "Input Data error");
        for (uint256 i = 0; i < _holders.length; i++) {
            holders.push(_holders[i]);
            counts.push(_counts[i]);
        }
    }

    function airdropNFTs(
        address[] memory _holders,
        uint256[] memory _counts
    ) external onlyOwner {
        require(_holders.length == _counts.length, "Input Data error");
        uint256 supply = totalSupply();
        for (uint256 i = 0; i < _holders.length; i++) {
            for (uint256 j = 0; j < _counts[i]; j++) {
                _safeMint(_holders[i], _getNewId(supply + j));
            }
            supply += _counts[i];
        }
    }

    function mintCost(address _minter)
        external
        view
        returns (uint256)
    {
        if (whitelisted[_minter]) return wlCost;
        return cost;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setWlCost(uint256 _newCost) public onlyOwner {
        wlCost = _newCost;
    }

    function setWhitelisted(address _address, bool _whitelisted) public onlyOwner {
        whitelisted[_address] = _whitelisted;
    }

    function setWhitelistAddresses(address[] memory addresses) public onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            whitelisted[addresses[i]] = true;
        }
    }

    function setPublicTimestamp(uint256 publicTimestamp_) public onlyOwner {
        publicTimestamp = publicTimestamp_;
    }

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

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

    function _getNewId(uint256 _totalMinted) internal returns (uint256 value) {
        uint256 remaining = maxSupply - _totalMinted;
        uint256 rand = uint256(
            keccak256(
                abi.encodePacked(
                    msg.sender,
                    block.difficulty,
                    block.timestamp,
                    remaining
                )
            )
        ) % remaining;
        value = 0;
        if (availableIds[rand] != 0) value = availableIds[rand];
        else value = rand;
        if (availableIds[remaining - 1] == 0)
            availableIds[rand] = remaining - 1;
        else availableIds[rand] = availableIds[remaining - 1];
        value += 1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"},{"internalType":"uint256[]","name":"_counts","type":"uint256[]"}],"name":"airdropNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crmaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crmaxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintInfo","outputs":[{"components":[{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"publicTimestamp","type":"uint256"}],"internalType":"struct CrazzzyMonsters.MintInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"quoteMintValue","outputs":[{"internalType":"uint256","name":"mintValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"},{"internalType":"uint256[]","name":"_counts","type":"uint256[]"}],"name":"setAirDropCounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddr","type":"address"}],"name":"setBurnContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicTimestamp_","type":"uint256"}],"name":"setPublicTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setWhitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setWlCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526364385130600e556040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506010908162000052919062000873565b50680340aad21b3b700000601155680270801d946c940000601255600061272360146101000a81548160ff0219169083151502179055507381a6147d6bd8b43f13704908d1fb30460980283d61272660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103b66127275573d40d96b07e0f9fdfe66306f0975f6025e01a5ce561272860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603261272955739d2349c58861287358905e133f28c5f0a5b687e361272a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001a557600080fd5b506040518060400160405280601081526020017f4372617a7a7a79204d6f6e7374657273000000000000000000000000000000008152506040518060400160405280600481526020017f434d4f4700000000000000000000000000000000000000000000000000000000815250816000908162000223919062000873565b50806001908162000235919062000873565b505050620002586200024c6200029d60201b60201c565b620002a560201b60201c565b6001600d819055506200029761272a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e86200036b60201b60201c565b62000ae7565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200037b6200039160201b60201c565b6200038d82826200042260201b60201c565b5050565b620003a16200029d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003c7620005c560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041790620009bb565b60405180910390fd5b565b62000432620005ef60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000493576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200048a9062000a53565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000505576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004fc9062000ac5565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600a60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200067b57607f821691505b60208210810362000691576200069062000633565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006fb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620006bc565b620007078683620006bc565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007546200074e62000748846200071f565b62000729565b6200071f565b9050919050565b6000819050919050565b620007708362000733565b620007886200077f826200075b565b848454620006c9565b825550505050565b600090565b6200079f62000790565b620007ac81848462000765565b505050565b5b81811015620007d457620007c860008262000795565b600181019050620007b2565b5050565b601f8211156200082357620007ed8162000697565b620007f884620006ac565b8101602085101562000808578190505b620008206200081785620006ac565b830182620007b1565b50505b505050565b600082821c905092915050565b6000620008486000198460080262000828565b1980831691505092915050565b600062000863838362000835565b9150826002028217905092915050565b6200087e82620005f9565b67ffffffffffffffff8111156200089a576200089962000604565b5b620008a6825462000662565b620008b3828285620007d8565b600060209050601f831160018114620008eb5760008415620008d6578287015190505b620008e2858262000855565b86555062000952565b601f198416620008fb8662000697565b60005b828110156200092557848901518255600182019150602085019450602081019050620008fe565b8683101562000945578489015162000941601f89168262000835565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009a36020836200095a565b9150620009b0826200096b565b602082019050919050565b60006020820190508181036000830152620009d68162000994565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000a3b602a836200095a565b915062000a4882620009dd565b604082019050919050565b6000602082019050818103600083015262000a6e8162000a2c565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000aad6019836200095a565b915062000aba8262000a75565b602082019050919050565b6000602082019050818103600083015262000ae08162000a9e565b9050919050565b615d378062000af76000396000f3fe6080604052600436106102ff5760003560e01c80635da9038611610190578063c6682862116100dc578063d936547e11610095578063e985e9c51161006f578063e985e9c514610b96578063f12f6d5d14610bd3578063f2fde38b14610bfc578063f52ccc2d14610c25576102ff565b8063d936547e14610b07578063da3ef23f14610b44578063e213b5f614610b6d576102ff565b8063c6682862146109f3578063c87b56dd14610a1e578063d0520c2314610a5b578063d5abeb0114610a86578063d70a28d114610ab1578063d7c94efd14610adc576102ff565b80639281aa0b11610149578063a22cb46511610123578063a22cb4651461094d578063b88d4fde14610976578063be3aa3371461099f578063c37f7381146109ca576102ff565b80639281aa0b146108dd57806395d89b4114610906578063a0712d6814610931576102ff565b80635da90386146107bb5780636352211e146107f857806370a0823114610835578063715018a61461087257806381cdf766146108895780638da5cb5b146108b2576102ff565b80632d35b7951161024f57806342966c68116102085780634f6ccce7116101e25780634f6ccce7146106ff57806355f804b31461073c57806359927044146107655780635c975abb14610790576102ff565b806342966c6814610670578063438b63001461069957806344a0d68a146106d6576102ff565b80632d35b795146105745780632f745c591461059d5780633a1e87f5146105da5780633ccfd60b146106055780633f0d2ec11461061c57806342842e0e14610647576102ff565b806313faede6116102bc5780631e6d487a116102965780631e6d487a146104a557806323b872dd146104d05780632a55205a146104f95780632acc659e14610537576102ff565b806313faede61461042457806318160ddd1461044f5780631c0973a41461047a576102ff565b806301ffc9a71461030457806302329a291461034157806304634d8d1461036a57806306fdde0314610393578063081812fc146103be578063095ea7b3146103fb575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613d07565b610c4e565b6040516103389190613d4f565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613d96565b610c60565b005b34801561037657600080fd5b50610391600480360381019061038c9190613e65565b610c86565b005b34801561039f57600080fd5b506103a8610c9c565b6040516103b59190613f35565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190613f8d565b610d2e565b6040516103f29190613fc9565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190613fe4565b610d74565b005b34801561043057600080fd5b50610439610e8b565b6040516104469190614033565b60405180910390f35b34801561045b57600080fd5b50610464610e91565b6040516104719190614033565b60405180910390f35b34801561048657600080fd5b5061048f610e9e565b60405161049c9190613fc9565b60405180910390f35b3480156104b157600080fd5b506104ba610ec5565b6040516104c79190614033565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f2919061404e565b610ecb565b005b34801561050557600080fd5b50610520600480360381019061051b91906140a1565b610f2b565b60405161052e9291906140e1565b60405180910390f35b34801561054357600080fd5b5061055e6004803603810190610559919061410a565b611115565b60405161056b9190614033565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190614342565b61117f565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613fe4565b6112b1565b6040516105d19190614033565b60405180910390f35b3480156105e657600080fd5b506105ef611356565b6040516105fc9190613fc9565b60405180910390f35b34801561061157600080fd5b5061061a61137d565b005b34801561062857600080fd5b50610631611566565b60405161063e9190613fc9565b60405180910390f35b34801561065357600080fd5b5061066e6004803603810190610669919061404e565b61158d565b005b34801561067c57600080fd5b5061069760048036038101906106929190613f8d565b6115ad565b005b3480156106a557600080fd5b506106c060048036038101906106bb919061410a565b61164a565b6040516106cd9190614478565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f89190613f8d565b6116f8565b005b34801561070b57600080fd5b5061072660048036038101906107219190613f8d565b61170a565b6040516107339190614033565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e919061454f565b61177b565b005b34801561077157600080fd5b5061077a611796565b6040516107879190613fc9565b60405180910390f35b34801561079c57600080fd5b506107a56117bd565b6040516107b29190613d4f565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190613f8d565b6117d1565b6040516107ef9190614033565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190613f8d565b6118bc565b60405161082c9190613fc9565b60405180910390f35b34801561084157600080fd5b5061085c6004803603810190610857919061410a565b611942565b6040516108699190614033565b60405180910390f35b34801561087e57600080fd5b506108876119f9565b005b34801561089557600080fd5b506108b060048036038101906108ab919061410a565b611a0d565b005b3480156108be57600080fd5b506108c7611a5a565b6040516108d49190613fc9565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff9190614598565b611a84565b005b34801561091257600080fd5b5061091b611ae8565b6040516109289190613f35565b60405180910390f35b61094b60048036038101906109469190613f8d565b611b7a565b005b34801561095957600080fd5b50610974600480360381019061096f9190614598565b611d4d565b005b34801561098257600080fd5b5061099d60048036038101906109989190614679565b611d63565b005b3480156109ab57600080fd5b506109b4611dc5565b6040516109c19190614033565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec9190613f8d565b611dcc565b005b3480156109ff57600080fd5b50610a08611dde565b604051610a159190613f35565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a409190613f8d565b611e6c565b604051610a529190613f35565b60405180910390f35b348015610a6757600080fd5b50610a70611f16565b604051610a7d919061474d565b60405180910390f35b348015610a9257600080fd5b50610a9b611f59565b604051610aa89190614033565b60405180910390f35b348015610abd57600080fd5b50610ac6611f5f565b604051610ad39190614033565b60405180910390f35b348015610ae857600080fd5b50610af1611f65565b604051610afe9190614033565b60405180910390f35b348015610b1357600080fd5b50610b2e6004803603810190610b29919061410a565b611f6c565b604051610b3b9190613d4f565b60405180910390f35b348015610b5057600080fd5b50610b6b6004803603810190610b66919061454f565b611f8d565b005b348015610b7957600080fd5b50610b946004803603810190610b8f9190614342565b611fa8565b005b348015610ba257600080fd5b50610bbd6004803603810190610bb89190614768565b6120bd565b604051610bca9190613d4f565b60405180910390f35b348015610bdf57600080fd5b50610bfa6004803603810190610bf59190613f8d565b612151565b005b348015610c0857600080fd5b50610c236004803603810190610c1e919061410a565b612163565b005b348015610c3157600080fd5b50610c4c6004803603810190610c4791906147a8565b6121e6565b005b6000610c5982612284565b9050919050565b610c686122fe565b8061272360146101000a81548160ff02191690831515021790555050565b610c8e6122fe565b610c98828261237c565b5050565b606060008054610cab90614820565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd790614820565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b6000610d3982612511565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d7f826118bc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de6906148c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e0e61255c565b73ffffffffffffffffffffffffffffffffffffffff161480610e3d5750610e3c81610e3761255c565b6120bd565b5b610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390614955565b60405180910390fd5b610e868383612564565b505050565b60115481565b6000600880549050905090565b61272360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b610edc610ed661255c565b8261261d565b610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f12906149e7565b60405180910390fd5b610f268383836126b2565b505050565b6000806000600b60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036110c057600a6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006110ca6129ab565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866110f69190614a36565b6111009190614aa7565b90508160000151819350935050509250929050565b600061272b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561117457601254905061117a565b60115490505b919050565b6111876122fe565b80518251146111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c290614b24565b60405180910390fd5b60005b82518110156112ac576127248382815181106111ed576111ec614b44565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061272582828151811061126b5761126a614b44565b5b6020026020010151908060018154018082558091505060019003906000526020600020016000909190919091505580806112a490614b73565b9150506111ce565b505050565b60006112bc83611942565b82106112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490614c2d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61272860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600047905060006103e861272754836113969190614a36565b6113a09190614aa7565b905060006103e861272954846113b69190614a36565b6113c09190614aa7565b9050600061272660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161140b90614c7e565b60006040518083038185875af1925050503d8060008114611448576040519150601f19603f3d011682016040523d82523d6000602084013e61144d565b606091505b5050905080611491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148890614cdf565b60405180910390fd5b61272860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516114d890614c7e565b60006040518083038185875af1925050503d8060008114611515576040519150601f19603f3d011682016040523d82523d6000602084013e61151a565b606091505b50508091505080611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155790614cdf565b60405180910390fd5b50505050565b61272a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115a883838360405180602001604052806000815250611d63565b505050565b61272360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590614d4b565b60405180910390fd5b611647816129b5565b50565b6060600061165783611942565b905060008167ffffffffffffffff8111156116755761167461413c565b5b6040519080825280602002602001820160405280156116a35781602001602082028036833780820191505090505b50905060005b828110156116ed576116bb85826112b1565b8282815181106116ce576116cd614b44565b5b60200260200101818152505080806116e590614b73565b9150506116a9565b508092505050919050565b6117006122fe565b8060118190555050565b6000611714610e91565b8210611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90614ddd565b60405180910390fd5b6008828154811061176957611768614b44565b5b90600052602060002001549050919050565b6117836122fe565b80600f90816117929190614fa9565b5050565b61272660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61272360149054906101000a900460ff1681565b600080829050600061272b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561188d57601961183733611942565b101561188c5760198461184933611942565b611853919061507b565b1015611865578390506000915061188b565b61186e33611942565b601961187a91906150af565b9050808461188891906150af565b91505b5b5b8060125461189b9190614a36565b826011546118a99190614a36565b6118b3919061507b565b92505050919050565b6000806118c883612b03565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611939576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119309061512f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a9906151c1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a016122fe565b611a0b6000612b40565b565b611a156122fe565b8061272360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a8c6122fe565b8061272b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b606060018054611af790614820565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2390614820565b8015611b705780601f10611b4557610100808354040283529160200191611b70565b820191906000526020600020905b815481529060010190602001808311611b5357829003601f168201915b5050505050905090565b61272360149054906101000a900460ff1615611bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc29061522d565b60405180910390fd5b600e54421015611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0790615299565b60405180910390fd5b600081118015611c21575060198111155b611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790615305565b60405180910390fd5b6000611c6a610e91565b90506127108282611c7b919061507b565b1115611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390615371565b60405180910390fd5b6000611cc7836117d1565b905080341015611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d03906153dd565b60405180910390fd5b60005b83811015611d4757611d3433611d2f8386611d2a919061507b565b612c06565b612d46565b8080611d3f90614b73565b915050611d0f565b50505050565b611d5f611d5861255c565b8383612d64565b5050565b611d74611d6e61255c565b8361261d565b611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa906149e7565b60405180910390fd5b611dbf84848484612ed0565b50505050565b6127295481565b611dd46122fe565b80600e8190555050565b60108054611deb90614820565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1790614820565b8015611e645780601f10611e3957610100808354040283529160200191611e64565b820191906000526020600020905b815481529060010190602001808311611e4757829003601f168201915b505050505081565b6060611e7782612f2c565b611eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ead9061546f565b60405180910390fd5b6000611ec0612f6d565b90506000815111611ee05760405180602001604052806000815250611f0e565b80611eea84612fff565b6010604051602001611efe9392919061554e565b6040516020818303038152906040525b915050919050565b611f1e613c78565b604051806060016040528061272360149054906101000a900460ff1615158152602001611f49610e91565b8152602001600e54815250905090565b61271081565b60125481565b6127275481565b61272b6020528060005260406000206000915054906101000a900460ff1681565b611f956122fe565b8060109081611fa49190614fa9565b5050565b611fb06122fe565b8051825114611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb90614b24565b60405180910390fd5b6000611ffe610e91565b905060005b83518110156120b75760005b83828151811061202257612021614b44565b5b602002602001015181101561207b5761206885838151811061204757612046614b44565b5b6020026020010151612063838661205e919061507b565b612c06565b612d46565b808061207390614b73565b91505061200f565b5082818151811061208f5761208e614b44565b5b6020026020010151826120a2919061507b565b915080806120af90614b73565b915050612003565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121596122fe565b8060128190555050565b61216b6122fe565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d1906155f1565b60405180910390fd5b6121e381612b40565b50565b6121ee6122fe565b60005b815181101561228057600161272b600084848151811061221457612213614b44565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061227890614b73565b9150506121f1565b5050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122f757506122f6826130cd565b5b9050919050565b61230661255c565b73ffffffffffffffffffffffffffffffffffffffff16612324611a5a565b73ffffffffffffffffffffffffffffffffffffffff161461237a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123719061565d565b60405180910390fd5b565b6123846129ab565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d9906156ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612451576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124489061575b565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600a60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b61251a81612f2c565b612559576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125509061512f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125d7836118bc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612629836118bc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061266b575061266a81856120bd565b5b806126a957508373ffffffffffffffffffffffffffffffffffffffff1661269184610d2e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126d2826118bc565b73ffffffffffffffffffffffffffffffffffffffff1614612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f906157ed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e9061587f565b60405180910390fd5b6127a48383836001613147565b8273ffffffffffffffffffffffffffffffffffffffff166127c4826118bc565b73ffffffffffffffffffffffffffffffffffffffff161461281a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612811906157ed565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129a683838360016132a5565b505050565b6000612710905090565b60006129c0826118bc565b90506129d0816000846001613147565b6129d9826118bc565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aff8160008460016132a5565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082612710612c1791906150af565b905060008133444285604051602001612c339493929190615908565b6040516020818303038152906040528051906020012060001c612c569190615956565b90506000925060006013826127108110612c7357612c72614b44565b5b015414612c98576013816127108110612c8f57612c8e614b44565b5b01549250612c9c565b8092505b60006013600184612cad91906150af565b6127108110612cbf57612cbe614b44565b5b015403612cf257600182612cd391906150af565b6013826127108110612ce857612ce7614b44565b5b0181905550612d30565b6013600183612d0191906150af565b6127108110612d1357612d12614b44565b5b01546013826127108110612d2a57612d29614b44565b5b01819055505b600183612d3d919061507b565b92505050919050565b612d608282604051806020016040528060008152506132ab565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc9906159d3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ec39190613d4f565b60405180910390a3505050565b612edb8484846126b2565b612ee784848484613306565b612f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1d90615a65565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612f4e83612b03565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600f8054612f7c90614820565b80601f0160208091040260200160405190810160405280929190818152602001828054612fa890614820565b8015612ff55780601f10612fca57610100808354040283529160200191612ff5565b820191906000526020600020905b815481529060010190602001808311612fd857829003601f168201915b5050505050905090565b60606000600161300e8461348d565b01905060008167ffffffffffffffff81111561302d5761302c61413c565b5b6040519080825280601f01601f19166020018201604052801561305f5781602001600182028036833780820191505090505b509050600082602001820190505b6001156130c2578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816130b6576130b5614a78565b5b0494506000850361306d575b819350505050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613140575061313f826135e0565b5b9050919050565b613153848484846136c2565b6001811115613197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318e90615af7565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131de576131d9816136c8565b61321d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461321c5761321b8582613711565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361325f5761325a8161387e565b61329e565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461329d5761329c848261394f565b5b5b5050505050565b50505050565b6132b583836139ce565b6132c26000848484613306565b613301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f890615a65565b60405180910390fd5b505050565b60006133278473ffffffffffffffffffffffffffffffffffffffff16613beb565b15613480578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261335061255c565b8786866040518563ffffffff1660e01b81526004016133729493929190615b6c565b6020604051808303816000875af19250505080156133ae57506040513d601f19601f820116820180604052508101906133ab9190615bcd565b60015b613430573d80600081146133de576040519150601f19603f3d011682016040523d82523d6000602084013e6133e3565b606091505b506000815103613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f90615a65565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613485565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134eb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134e1576134e0614a78565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613528576d04ee2d6d415b85acef8100000000838161351e5761351d614a78565b5b0492506020810190505b662386f26fc10000831061355757662386f26fc10000838161354d5761354c614a78565b5b0492506010810190505b6305f5e1008310613580576305f5e100838161357657613575614a78565b5b0492506008810190505b61271083106135a557612710838161359b5761359a614a78565b5b0492506004810190505b606483106135c857606483816135be576135bd614a78565b5b0492506002810190505b600a83106135d7576001810190505b80915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136ab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806136bb57506136ba82613c0e565b5b9050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161371e84611942565b61372891906150af565b905060006007600084815260200190815260200160002054905081811461380d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061389291906150af565b90506000600960008481526020019081526020016000205490506000600883815481106138c2576138c1614b44565b5b9060005260206000200154905080600883815481106138e4576138e3614b44565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061393357613932615bfa565b5b6001900381819060005260206000200160009055905550505050565b600061395a83611942565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3490615c75565b60405180910390fd5b613a4681612f2c565b15613a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7d90615ce1565b60405180910390fd5b613a94600083836001613147565b613a9d81612f2c565b15613add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad490615ce1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613be76000838360016132a5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b604051806060016040528060001515815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ce481613caf565b8114613cef57600080fd5b50565b600081359050613d0181613cdb565b92915050565b600060208284031215613d1d57613d1c613ca5565b5b6000613d2b84828501613cf2565b91505092915050565b60008115159050919050565b613d4981613d34565b82525050565b6000602082019050613d646000830184613d40565b92915050565b613d7381613d34565b8114613d7e57600080fd5b50565b600081359050613d9081613d6a565b92915050565b600060208284031215613dac57613dab613ca5565b5b6000613dba84828501613d81565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613dee82613dc3565b9050919050565b613dfe81613de3565b8114613e0957600080fd5b50565b600081359050613e1b81613df5565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613e4281613e21565b8114613e4d57600080fd5b50565b600081359050613e5f81613e39565b92915050565b60008060408385031215613e7c57613e7b613ca5565b5b6000613e8a85828601613e0c565b9250506020613e9b85828601613e50565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613edf578082015181840152602081019050613ec4565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f0782613ea5565b613f118185613eb0565b9350613f21818560208601613ec1565b613f2a81613eeb565b840191505092915050565b60006020820190508181036000830152613f4f8184613efc565b905092915050565b6000819050919050565b613f6a81613f57565b8114613f7557600080fd5b50565b600081359050613f8781613f61565b92915050565b600060208284031215613fa357613fa2613ca5565b5b6000613fb184828501613f78565b91505092915050565b613fc381613de3565b82525050565b6000602082019050613fde6000830184613fba565b92915050565b60008060408385031215613ffb57613ffa613ca5565b5b600061400985828601613e0c565b925050602061401a85828601613f78565b9150509250929050565b61402d81613f57565b82525050565b60006020820190506140486000830184614024565b92915050565b60008060006060848603121561406757614066613ca5565b5b600061407586828701613e0c565b935050602061408686828701613e0c565b925050604061409786828701613f78565b9150509250925092565b600080604083850312156140b8576140b7613ca5565b5b60006140c685828601613f78565b92505060206140d785828601613f78565b9150509250929050565b60006040820190506140f66000830185613fba565b6141036020830184614024565b9392505050565b6000602082840312156141205761411f613ca5565b5b600061412e84828501613e0c565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61417482613eeb565b810181811067ffffffffffffffff821117156141935761419261413c565b5b80604052505050565b60006141a6613c9b565b90506141b2828261416b565b919050565b600067ffffffffffffffff8211156141d2576141d161413c565b5b602082029050602081019050919050565b600080fd5b60006141fb6141f6846141b7565b61419c565b9050808382526020820190506020840283018581111561421e5761421d6141e3565b5b835b8181101561424757806142338882613e0c565b845260208401935050602081019050614220565b5050509392505050565b600082601f83011261426657614265614137565b5b81356142768482602086016141e8565b91505092915050565b600067ffffffffffffffff82111561429a5761429961413c565b5b602082029050602081019050919050565b60006142be6142b98461427f565b61419c565b905080838252602082019050602084028301858111156142e1576142e06141e3565b5b835b8181101561430a57806142f68882613f78565b8452602084019350506020810190506142e3565b5050509392505050565b600082601f83011261432957614328614137565b5b81356143398482602086016142ab565b91505092915050565b6000806040838503121561435957614358613ca5565b5b600083013567ffffffffffffffff81111561437757614376613caa565b5b61438385828601614251565b925050602083013567ffffffffffffffff8111156143a4576143a3613caa565b5b6143b085828601614314565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6143ef81613f57565b82525050565b600061440183836143e6565b60208301905092915050565b6000602082019050919050565b6000614425826143ba565b61442f81856143c5565b935061443a836143d6565b8060005b8381101561446b57815161445288826143f5565b975061445d8361440d565b92505060018101905061443e565b5085935050505092915050565b60006020820190508181036000830152614492818461441a565b905092915050565b600080fd5b600067ffffffffffffffff8211156144ba576144b961413c565b5b6144c382613eeb565b9050602081019050919050565b82818337600083830152505050565b60006144f26144ed8461449f565b61419c565b90508281526020810184848401111561450e5761450d61449a565b5b6145198482856144d0565b509392505050565b600082601f83011261453657614535614137565b5b81356145468482602086016144df565b91505092915050565b60006020828403121561456557614564613ca5565b5b600082013567ffffffffffffffff81111561458357614582613caa565b5b61458f84828501614521565b91505092915050565b600080604083850312156145af576145ae613ca5565b5b60006145bd85828601613e0c565b92505060206145ce85828601613d81565b9150509250929050565b600067ffffffffffffffff8211156145f3576145f261413c565b5b6145fc82613eeb565b9050602081019050919050565b600061461c614617846145d8565b61419c565b9050828152602081018484840111156146385761463761449a565b5b6146438482856144d0565b509392505050565b600082601f8301126146605761465f614137565b5b8135614670848260208601614609565b91505092915050565b6000806000806080858703121561469357614692613ca5565b5b60006146a187828801613e0c565b94505060206146b287828801613e0c565b93505060406146c387828801613f78565b925050606085013567ffffffffffffffff8111156146e4576146e3613caa565b5b6146f08782880161464b565b91505092959194509250565b61470581613d34565b82525050565b60608201600082015161472160008501826146fc565b50602082015161473460208501826143e6565b50604082015161474760408501826143e6565b50505050565b6000606082019050614762600083018461470b565b92915050565b6000806040838503121561477f5761477e613ca5565b5b600061478d85828601613e0c565b925050602061479e85828601613e0c565b9150509250929050565b6000602082840312156147be576147bd613ca5565b5b600082013567ffffffffffffffff8111156147dc576147db613caa565b5b6147e884828501614251565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061483857607f821691505b60208210810361484b5761484a6147f1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006148ad602183613eb0565b91506148b882614851565b604082019050919050565b600060208201905081810360008301526148dc816148a0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061493f603d83613eb0565b915061494a826148e3565b604082019050919050565b6000602082019050818103600083015261496e81614932565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006149d1602d83613eb0565b91506149dc82614975565b604082019050919050565b60006020820190508181036000830152614a00816149c4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a4182613f57565b9150614a4c83613f57565b9250828202614a5a81613f57565b91508282048414831517614a7157614a70614a07565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ab282613f57565b9150614abd83613f57565b925082614acd57614acc614a78565b5b828204905092915050565b7f496e7075742044617461206572726f7200000000000000000000000000000000600082015250565b6000614b0e601083613eb0565b9150614b1982614ad8565b602082019050919050565b60006020820190508181036000830152614b3d81614b01565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614b7e82613f57565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bb057614baf614a07565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614c17602b83613eb0565b9150614c2282614bbb565b604082019050919050565b60006020820190508181036000830152614c4681614c0a565b9050919050565b600081905092915050565b50565b6000614c68600083614c4d565b9150614c7382614c58565b600082019050919050565b6000614c8982614c5b565b9150819050919050565b7f53656e64696e672063726f206661696c65640000000000000000000000000000600082015250565b6000614cc9601283613eb0565b9150614cd482614c93565b602082019050919050565b60006020820190508181036000830152614cf881614cbc565b9050919050565b7f4e6f7420746865206275726e20636f6e74726163740000000000000000000000600082015250565b6000614d35601583613eb0565b9150614d4082614cff565b602082019050919050565b60006020820190508181036000830152614d6481614d28565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614dc7602c83613eb0565b9150614dd282614d6b565b604082019050919050565b60006020820190508181036000830152614df681614dba565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614e5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e22565b614e698683614e22565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ea6614ea1614e9c84613f57565b614e81565b613f57565b9050919050565b6000819050919050565b614ec083614e8b565b614ed4614ecc82614ead565b848454614e2f565b825550505050565b600090565b614ee9614edc565b614ef4818484614eb7565b505050565b5b81811015614f1857614f0d600082614ee1565b600181019050614efa565b5050565b601f821115614f5d57614f2e81614dfd565b614f3784614e12565b81016020851015614f46578190505b614f5a614f5285614e12565b830182614ef9565b50505b505050565b600082821c905092915050565b6000614f8060001984600802614f62565b1980831691505092915050565b6000614f998383614f6f565b9150826002028217905092915050565b614fb282613ea5565b67ffffffffffffffff811115614fcb57614fca61413c565b5b614fd58254614820565b614fe0828285614f1c565b600060209050601f8311600181146150135760008415615001578287015190505b61500b8582614f8d565b865550615073565b601f19841661502186614dfd565b60005b8281101561504957848901518255600182019150602085019450602081019050615024565b868310156150665784890151615062601f891682614f6f565b8355505b6001600288020188555050505b505050505050565b600061508682613f57565b915061509183613f57565b92508282019050808211156150a9576150a8614a07565b5b92915050565b60006150ba82613f57565b91506150c583613f57565b92508282039050818111156150dd576150dc614a07565b5b92915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000615119601883613eb0565b9150615124826150e3565b602082019050919050565b600060208201905081810360008301526151488161510c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006151ab602983613eb0565b91506151b68261514f565b604082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000615217600683613eb0565b9150615222826151e1565b602082019050919050565b600060208201905081810360008301526152468161520a565b9050919050565b7f4d696e74206973206e6f74206c69766520796574000000000000000000000000600082015250565b6000615283601483613eb0565b915061528e8261524d565b602082019050919050565b600060208201905081810360008301526152b281615276565b9050919050565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b60006152ef600e83613eb0565b91506152fa826152b9565b602082019050919050565b6000602082019050818103600083015261531e816152e2565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600061535b601383613eb0565b915061536682615325565b602082019050919050565b6000602082019050818103600083015261538a8161534e565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006153c7601283613eb0565b91506153d282615391565b602082019050919050565b600060208201905081810360008301526153f6816153ba565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615459602f83613eb0565b9150615464826153fd565b604082019050919050565b600060208201905081810360008301526154888161544c565b9050919050565b600081905092915050565b60006154a582613ea5565b6154af818561548f565b93506154bf818560208601613ec1565b80840191505092915050565b600081546154d881614820565b6154e2818661548f565b945060018216600081146154fd576001811461551257615545565b60ff1983168652811515820286019350615545565b61551b85614dfd565b60005b8381101561553d5781548189015260018201915060208101905061551e565b838801955050505b50505092915050565b600061555a828661549a565b9150615566828561549a565b915061557282846154cb565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006155db602683613eb0565b91506155e68261557f565b604082019050919050565b6000602082019050818103600083015261560a816155ce565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615647602083613eb0565b915061565282615611565b602082019050919050565b600060208201905081810360008301526156768161563a565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006156d9602a83613eb0565b91506156e48261567d565b604082019050919050565b60006020820190508181036000830152615708816156cc565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000615745601983613eb0565b91506157508261570f565b602082019050919050565b6000602082019050818103600083015261577481615738565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006157d7602583613eb0565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615869602483613eb0565b91506158748261580d565b604082019050919050565b600060208201905081810360008301526158988161585c565b9050919050565b60008160601b9050919050565b60006158b78261589f565b9050919050565b60006158c9826158ac565b9050919050565b6158e16158dc82613de3565b6158be565b82525050565b6000819050919050565b6159026158fd82613f57565b6158e7565b82525050565b600061591482876158d0565b60148201915061592482866158f1565b60208201915061593482856158f1565b60208201915061594482846158f1565b60208201915081905095945050505050565b600061596182613f57565b915061596c83613f57565b92508261597c5761597b614a78565b5b828206905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006159bd601983613eb0565b91506159c882615987565b602082019050919050565b600060208201905081810360008301526159ec816159b0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615a4f603283613eb0565b9150615a5a826159f3565b604082019050919050565b60006020820190508181036000830152615a7e81615a42565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615ae1603583613eb0565b9150615aec82615a85565b604082019050919050565b60006020820190508181036000830152615b1081615ad4565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b3e82615b17565b615b488185615b22565b9350615b58818560208601613ec1565b615b6181613eeb565b840191505092915050565b6000608082019050615b816000830187613fba565b615b8e6020830186613fba565b615b9b6040830185614024565b8181036060830152615bad8184615b33565b905095945050505050565b600081519050615bc781613cdb565b92915050565b600060208284031215615be357615be2613ca5565b5b6000615bf184828501615bb8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615c5f602083613eb0565b9150615c6a82615c29565b602082019050919050565b60006020820190508181036000830152615c8e81615c52565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615ccb601c83613eb0565b9150615cd682615c95565b602082019050919050565b60006020820190508181036000830152615cfa81615cbe565b905091905056fea2646970667358221220bbdcb0ce8838201aff2dc8dda08955c7410e957a541bbe92ef33309e0264c03c64736f6c63430008110033

Deployed ByteCode Sourcemap

70873:7618:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77436:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75648:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72928:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48549:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50061:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49579:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71136:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65482:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71307:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70991:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50761:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36720:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76579:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75735:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65150:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71540:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72188:420;;;;;;;;;;;;;:::i;:::-;;71659:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51167:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72616:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74386:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76766:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65672:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75384:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71421:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71341:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73107:684;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48259:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47990:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20921:103;;;;;;;;;;;;;:::i;:::-;;72071:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20273:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76958:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48718:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73799:579;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50304:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51423:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71618:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77304:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71092:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74768:608;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72768:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71212:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71173:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71498:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71775:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75496:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76093:478;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50530:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76860:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21179:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77099:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77436:188;77556:4;77580:36;77604:11;77580:23;:36::i;:::-;77573:43;;77436:188;;;:::o;75648:79::-;20159:13;:11;:13::i;:::-;75713:6:::1;75704;;:15;;;;;;;;;;;;;;;;;;75648:79:::0;:::o;72928:171::-;20159:13;:11;:13::i;:::-;73049:42:::1;73068:8;73078:12;73049:18;:42::i;:::-;72928:171:::0;;:::o;48549:100::-;48603:13;48636:5;48629:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48549:100;:::o;50061:171::-;50137:7;50157:23;50172:7;50157:14;:23::i;:::-;50200:15;:24;50216:7;50200:24;;;;;;;;;;;;;;;;;;;;;50193:31;;50061:171;;;:::o;49579:416::-;49660:13;49676:23;49691:7;49676:14;:23::i;:::-;49660:39;;49724:5;49718:11;;:2;:11;;;49710:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49818:5;49802:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49827:37;49844:5;49851:12;:10;:12::i;:::-;49827:16;:37::i;:::-;49802:62;49780:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;49966:21;49975:2;49979:7;49966:8;:21::i;:::-;49649:346;49579:416;;:::o;71136:30::-;;;;:::o;65482:113::-;65543:7;65570:10;:17;;;;65563:24;;65482:113;:::o;71307:27::-;;;;;;;;;;;;;:::o;70991:43::-;;;;:::o;50761:335::-;50956:41;50975:12;:10;:12::i;:::-;50989:7;50956:18;:41::i;:::-;50948:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51060:28;51070:4;51076:2;51080:7;51060:9;:28::i;:::-;50761:335;;;:::o;36720:442::-;36817:7;36826;36846:26;36875:17;:27;36893:8;36875:27;;;;;;;;;;;36846:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36947:1;36919:30;;:7;:16;;;:30;;;36915:92;;36976:19;36966:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36915:92;37019:21;37084:17;:15;:17::i;:::-;37043:58;;37057:7;:23;;;37044:36;;:10;:36;;;;:::i;:::-;37043:58;;;;:::i;:::-;37019:82;;37122:7;:16;;;37140:13;37114:40;;;;;;36720:442;;;;;:::o;76579:179::-;76664:7;76693:11;:20;76705:7;76693:20;;;;;;;;;;;;;;;;;;;;;;;;;76689:39;;;76722:6;;76715:13;;;;76689:39;76746:4;;76739:11;;76579:179;;;;:::o;75735:350::-;20159:13;:11;:13::i;:::-;75896:7:::1;:14;75877:8;:15;:33;75869:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;75947:9;75942:136;75966:8;:15;75962:1;:19;75942:136;;;76003:7;76016:8;76025:1;76016:11;;;;;;;;:::i;:::-;;;;;;;;76003:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76043:6;76055:7;76063:1;76055:10;;;;;;;;:::i;:::-;;;;;;;;76043:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75983:3;;;;;:::i;:::-;;;;75942:136;;;;75735:350:::0;;:::o;65150:256::-;65247:7;65283:23;65300:5;65283:16;:23::i;:::-;65275:5;:31;65267:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;65372:12;:19;65385:5;65372:19;;;;;;;;;;;;;;;:26;65392:5;65372:26;;;;;;;;;;;;65365:33;;65150:256;;;;:::o;71540:71::-;;;;;;;;;;;;;:::o;72188:420::-;72228:15;72246:21;72228:39;;72278:12;71764:4;72304:7;;72294;:17;;;;:::i;:::-;72293:27;;;;:::i;:::-;72278:42;;72331:13;71764:4;72358:8;;72348:7;:18;;;;:::i;:::-;72347:28;;;;:::i;:::-;72331:44;;72387:9;72410:10;;;;;;;;;;;72402:24;;72434:4;72402:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72386:57;;;72462:4;72454:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;72519:11;;;;;;;;;;;72511:25;;72544:5;72511:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72500:54;;;;;72573:4;72565:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;72217:391;;;;72188:420::o;71659:73::-;;;;;;;;;;;;;:::o;51167:185::-;51305:39;51322:4;51328:2;51332:7;51305:39;;;;;;;;;;;;:16;:39::i;:::-;51167:185;;;:::o;72616:144::-;72689:12;;;;;;;;;;;72675:26;;:10;:26;;;72667:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72738:14;72744:7;72738:5;:14::i;:::-;72616:144;:::o;74386:374::-;74462:16;74491:23;74517:17;74527:6;74517:9;:17::i;:::-;74491:43;;74545:25;74587:15;74573:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74545:58;;74619:9;74614:113;74634:15;74630:1;:19;74614:113;;;74685:30;74705:6;74713:1;74685:19;:30::i;:::-;74671:8;74680:1;74671:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;74651:3;;;;;:::i;:::-;;;;74614:113;;;;74744:8;74737:15;;;;74386:374;;;:::o;76766:86::-;20159:13;:11;:13::i;:::-;76836:8:::1;76829:4;:15;;;;76766:86:::0;:::o;65672:233::-;65747:7;65783:30;:28;:30::i;:::-;65775:5;:38;65767:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;65880:10;65891:5;65880:17;;;;;;;;:::i;:::-;;;;;;;;;;65873:24;;65672:233;;;:::o;75384:104::-;20159:13;:11;:13::i;:::-;75469:11:::1;75459:7;:21;;;;;;:::i;:::-;;75384:104:::0;:::o;71421:70::-;;;;;;;;;;;;;:::o;71341:26::-;;;;;;;;;;;;;:::o;73107:684::-;73168:17;73198:20;73221:6;73198:29;;73238:22;73281:11;:23;73293:10;73281:23;;;;;;;;;;;;;;;;;;;;;;;;;73277:437;;;73349:2;73325:21;73335:10;73325:9;:21::i;:::-;:26;73321:382;;;73409:2;73400:6;73376:21;73386:10;73376:9;:21::i;:::-;:30;;;;:::i;:::-;:35;73372:316;;;73453:6;73436:23;;73497:1;73482:16;;73372:316;;;73586:21;73596:10;73586:9;:21::i;:::-;73581:2;:26;;;;:::i;:::-;73564:43;;73654:14;73645:6;:23;;;;:::i;:::-;73630:38;;73372:316;73321:382;73277:437;73769:14;73760:6;;:23;;;;:::i;:::-;73745:12;73738:4;;:19;;;;:::i;:::-;:45;;;;:::i;:::-;73726:57;;73187:604;;73107:684;;;:::o;48259:223::-;48331:7;48351:13;48367:17;48376:7;48367:8;:17::i;:::-;48351:33;;48420:1;48403:19;;:5;:19;;;48395:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48469:5;48462:12;;;48259:223;;;:::o;47990:207::-;48062:7;48107:1;48090:19;;:5;:19;;;48082:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48173:9;:16;48183:5;48173:16;;;;;;;;;;;;;;;;48166:23;;47990:207;;;:::o;20921:103::-;20159:13;:11;:13::i;:::-;20986:30:::1;21013:1;20986:18;:30::i;:::-;20921:103::o:0;72071:109::-;20159:13;:11;:13::i;:::-;72165:7:::1;72150:12;;:22;;;;;;;;;;;;;;;;;;72071:109:::0;:::o;20273:87::-;20319:7;20346:6;;;;;;;;;;;20339:13;;20273:87;:::o;76958:133::-;20159:13;:11;:13::i;:::-;77071:12:::1;77047:11;:21;77059:8;77047:21;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;76958:133:::0;;:::o;48718:104::-;48774:13;48807:7;48800:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48718:104;:::o;73799:579::-;73864:6;;;;;;;;;;;73863:7;73855:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;73919:15;;73900;:34;;73892:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;73987:1;73978:6;:10;:26;;;;;74002:2;73992:6;:12;;73978:26;73970:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;74034:14;74051:13;:11;:13::i;:::-;74034:30;;71248:5;74092:6;74083;:15;;;;:::i;:::-;:28;;74075:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;74146:17;74166:22;74181:6;74166:14;:22::i;:::-;74146:42;;74220:9;74207;:22;;74199:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;74270:9;74265:106;74289:6;74285:1;:10;74265:106;;;74317:42;74327:10;74339:19;74356:1;74349:6;:8;;;;:::i;:::-;74339:9;:19::i;:::-;74317:9;:42::i;:::-;74297:3;;;;;:::i;:::-;;;;74265:106;;;;73844:534;;73799:579;:::o;50304:155::-;50399:52;50418:12;:10;:12::i;:::-;50432:8;50442;50399:18;:52::i;:::-;50304:155;;:::o;51423:322::-;51597:41;51616:12;:10;:12::i;:::-;51630:7;51597:18;:41::i;:::-;51589:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51699:38;51713:4;51719:2;51723:7;51732:4;51699:13;:38::i;:::-;51423:322;;;;:::o;71618:28::-;;;;:::o;77304:124::-;20159:13;:11;:13::i;:::-;77404:16:::1;77386:15;:34;;;;77304:124:::0;:::o;71092:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74768:608::-;74857:13;74905:16;74913:7;74905;:16::i;:::-;74883:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;75009:28;75040:10;:8;:10::i;:::-;75009:41;;75112:1;75087:14;75081:28;:32;:287;;;;;;;;;;;;;;;;;75205:14;75246:18;:7;:16;:18::i;:::-;75291:13;75162:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75081:287;75061:307;;;74768:608;;;:::o;72768:137::-;72814:15;;:::i;:::-;72849:48;;;;;;;;72858:6;;;;;;;;;;;72849:48;;;;;;72866:13;:11;:13::i;:::-;72849:48;;;;72881:15;;72849:48;;;72842:55;;72768:137;:::o;71212:41::-;71248:5;71212:41;:::o;71173:32::-;;;;:::o;71498:28::-;;;;:::o;71775:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;75496:144::-;20159:13;:11;:13::i;:::-;75615:17:::1;75599:13;:33;;;;;;:::i;:::-;;75496:144:::0;:::o;76093:478::-;20159:13;:11;:13::i;:::-;76249:7:::1;:14;76230:8;:15;:33;76222:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;76295:14;76312:13;:11;:13::i;:::-;76295:30;;76341:9;76336:228;76360:8;:15;76356:1;:19;76336:228;;;76402:9;76397:121;76421:7;76429:1;76421:10;;;;;;;;:::i;:::-;;;;;;;;76417:1;:14;76397:121;;;76457:45;76467:8;76476:1;76467:11;;;;;;;;:::i;:::-;;;;;;;;76480:21;76499:1;76490:6;:10;;;;:::i;:::-;76480:9;:21::i;:::-;76457:9;:45::i;:::-;76433:3;;;;;:::i;:::-;;;;76397:121;;;;76542:7;76550:1;76542:10;;;;;;;;:::i;:::-;;;;;;;;76532:20;;;;;:::i;:::-;;;76377:3;;;;;:::i;:::-;;;;76336:228;;;;76211:360;76093:478:::0;;:::o;50530:164::-;50627:4;50651:18;:25;50670:5;50651:25;;;;;;;;;;;;;;;:35;50677:8;50651:35;;;;;;;;;;;;;;;;;;;;;;;;;50644:42;;50530:164;;;;:::o;76860:90::-;20159:13;:11;:13::i;:::-;76934:8:::1;76925:6;:17;;;;76860:90:::0;:::o;21179:201::-;20159:13;:11;:13::i;:::-;21288:1:::1;21268:22;;:8;:22;;::::0;21260:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21344:28;21363:8;21344:18;:28::i;:::-;21179:201:::0;:::o;77099:197::-;20159:13;:11;:13::i;:::-;77191:6:::1;77186:103;77207:9;:16;77203:1;:20;77186:103;;;77273:4;77245:11;:25;77257:9;77267:1;77257:12;;;;;;;;:::i;:::-;;;;;;;;77245:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;77225:3;;;;;:::i;:::-;;;;77186:103;;;;77099:197:::0;:::o;36450:215::-;36552:4;36591:26;36576:41;;;:11;:41;;;;:81;;;;36621:36;36645:11;36621:23;:36::i;:::-;36576:81;36569:88;;36450:215;;;:::o;20438:132::-;20513:12;:10;:12::i;:::-;20502:23;;:7;:5;:7::i;:::-;:23;;;20494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20438:132::o;37812:332::-;37931:17;:15;:17::i;:::-;37915:33;;:12;:33;;;;37907:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;38034:1;38014:22;;:8;:22;;;38006:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;38101:35;;;;;;;;38113:8;38101:35;;;;;;38123:12;38101:35;;;;;38079:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37812:332;;:::o;59880:135::-;59962:16;59970:7;59962;:16::i;:::-;59954:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59880:135;:::o;18824:98::-;18877:7;18904:10;18897:17;;18824:98;:::o;59159:174::-;59261:2;59234:15;:24;59250:7;59234:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59317:7;59313:2;59279:46;;59288:23;59303:7;59288:14;:23::i;:::-;59279:46;;;;;;;;;;;;59159:174;;:::o;53778:264::-;53871:4;53888:13;53904:23;53919:7;53904:14;:23::i;:::-;53888:39;;53957:5;53946:16;;:7;:16;;;:52;;;;53966:32;53983:5;53990:7;53966:16;:32::i;:::-;53946:52;:87;;;;54026:7;54002:31;;:20;54014:7;54002:11;:20::i;:::-;:31;;;53946:87;53938:96;;;53778:264;;;;:::o;57777:1263::-;57936:4;57909:31;;:23;57924:7;57909:14;:23::i;:::-;:31;;;57901:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58015:1;58001:16;;:2;:16;;;57993:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58071:42;58092:4;58098:2;58102:7;58111:1;58071:20;:42::i;:::-;58243:4;58216:31;;:23;58231:7;58216:14;:23::i;:::-;:31;;;58208:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58361:15;:24;58377:7;58361:24;;;;;;;;;;;;58354:31;;;;;;;;;;;58856:1;58837:9;:15;58847:4;58837:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;58889:1;58872:9;:13;58882:2;58872:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;58931:2;58912:7;:16;58920:7;58912:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;58970:7;58966:2;58951:27;;58960:4;58951:27;;;;;;;;;;;;58991:41;59011:4;59017:2;59021:7;59030:1;58991:19;:41::i;:::-;57777:1263;;;:::o;37444:97::-;37502:6;37528:5;37521:12;;37444:97;:::o;56657:783::-;56717:13;56733:23;56748:7;56733:14;:23::i;:::-;56717:39;;56769:51;56790:5;56805:1;56809:7;56818:1;56769:20;:51::i;:::-;56933:23;56948:7;56933:14;:23::i;:::-;56925:31;;57004:15;:24;57020:7;57004:24;;;;;;;;;;;;56997:31;;;;;;;;;;;57269:1;57249:9;:16;57259:5;57249:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;57299:7;:16;57307:7;57299:16;;;;;;;;;;;;57292:23;;;;;;;;;;;57361:7;57357:1;57333:36;;57342:5;57333:36;;;;;;;;;;;;57382:50;57402:5;57417:1;57421:7;57430:1;57382:19;:50::i;:::-;56706:734;56657:783;:::o;53053:117::-;53119:7;53146;:16;53154:7;53146:16;;;;;;;;;;;;;;;;;;;;;53139:23;;53053:117;;;:::o;21540:191::-;21614:16;21633:6;;;;;;;;;;;21614:25;;21659:8;21650:6;;:17;;;;;;;;;;;;;;;;;;21714:8;21683:40;;21704:8;21683:40;;;;;;;;;;;;21603:128;21540:191;:::o;77765:723::-;77824:13;77850:17;77882:12;71248:5;77870:24;;;;:::i;:::-;77850:44;;77905:12;78176:9;78009:10;78042:16;78081:15;78119:9;77970:177;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77942:220;;;;;;77920:253;;:265;;;;:::i;:::-;77905:280;;78204:1;78196:9;;78242:1;78220:12;78233:4;78220:18;;;;;;;:::i;:::-;;;;:23;78216:83;;78253:12;78266:4;78253:18;;;;;;;:::i;:::-;;;;78245:26;;78216:83;;;78295:4;78287:12;;78216:83;78345:1;78314:12;78339:1;78327:9;:13;;;;:::i;:::-;78314:27;;;;;;;:::i;:::-;;;;:32;78310:149;;78394:1;78382:9;:13;;;;:::i;:::-;78361:12;78374:4;78361:18;;;;;;;:::i;:::-;;;:34;;;;78310:149;;;78432:12;78457:1;78445:9;:13;;;;:::i;:::-;78432:27;;;;;;;:::i;:::-;;;;78411:12;78424:4;78411:18;;;;;;;:::i;:::-;;;:48;;;;78310:149;78479:1;78470:10;;;;;:::i;:::-;;;77839:649;;77765:723;;;:::o;54384:110::-;54460:26;54470:2;54474:7;54460:26;;;;;;;;;;;;:9;:26::i;:::-;54384:110;;:::o;59476:315::-;59631:8;59622:17;;:5;:17;;;59614:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59718:8;59680:18;:25;59699:5;59680:25;;;;;;;;;;;;;;;:35;59706:8;59680:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59764:8;59742:41;;59757:5;59742:41;;;59774:8;59742:41;;;;;;:::i;:::-;;;;;;;;59476:315;;;:::o;52626:313::-;52782:28;52792:4;52798:2;52802:7;52782:9;:28::i;:::-;52829:47;52852:4;52858:2;52862:7;52871:4;52829:22;:47::i;:::-;52821:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52626:313;;;;:::o;53483:128::-;53548:4;53601:1;53572:31;;:17;53581:7;53572:8;:17::i;:::-;:31;;;;53565:38;;53483:128;;;:::o;77649:108::-;77709:13;77742:7;77735:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77649:108;:::o;16251:716::-;16307:13;16358:14;16395:1;16375:17;16386:5;16375:10;:17::i;:::-;:21;16358:38;;16411:20;16445:6;16434:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16411:41;;16467:11;16596:6;16592:2;16588:15;16580:6;16576:28;16569:35;;16633:288;16640:4;16633:288;;;16665:5;;;;;;;;16807:8;16802:2;16795:5;16791:14;16786:30;16781:3;16773:44;16863:2;16854:11;;;;;;:::i;:::-;;;;;16897:1;16888:5;:10;16633:288;16884:21;16633:288;16942:6;16935:13;;;;;16251:716;;;:::o;64842:224::-;64944:4;64983:35;64968:50;;;:11;:50;;;;:90;;;;65022:36;65046:11;65022:23;:36::i;:::-;64968:90;64961:97;;64842:224;;;:::o;65979:915::-;66156:61;66183:4;66189:2;66193:12;66207:9;66156:26;:61::i;:::-;66246:1;66234:9;:13;66230:222;;;66377:63;;;;;;;;;;:::i;:::-;;;;;;;;66230:222;66464:15;66482:12;66464:30;;66527:1;66511:18;;:4;:18;;;66507:187;;66546:40;66578:7;66546:31;:40::i;:::-;66507:187;;;66616:2;66608:10;;:4;:10;;;66604:90;;66635:47;66668:4;66674:7;66635:32;:47::i;:::-;66604:90;66507:187;66722:1;66708:16;;:2;:16;;;66704:183;;66741:45;66778:7;66741:36;:45::i;:::-;66704:183;;;66814:4;66808:10;;:2;:10;;;66804:83;;66835:40;66863:2;66867:7;66835:27;:40::i;:::-;66804:83;66704:183;66145:749;65979:915;;;;:::o;63045:158::-;;;;;:::o;54721:319::-;54850:18;54856:2;54860:7;54850:5;:18::i;:::-;54901:53;54932:1;54936:2;54940:7;54949:4;54901:22;:53::i;:::-;54879:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;54721:319;;;:::o;60579:853::-;60733:4;60754:15;:2;:13;;;:15::i;:::-;60750:675;;;60806:2;60790:36;;;60827:12;:10;:12::i;:::-;60841:4;60847:7;60856:4;60790:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60786:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61048:1;61031:6;:13;:18;61027:328;;61074:60;;;;;;;;;;:::i;:::-;;;;;;;;61027:328;61305:6;61299:13;61290:6;61286:2;61282:15;61275:38;60786:584;60922:41;;;60912:51;;;:6;:51;;;;60905:58;;;;;60750:675;61409:4;61402:11;;60579:853;;;;;;;:::o;13117:922::-;13170:7;13190:14;13207:1;13190:18;;13257:6;13248:5;:15;13244:102;;13293:6;13284:15;;;;;;:::i;:::-;;;;;13328:2;13318:12;;;;13244:102;13373:6;13364:5;:15;13360:102;;13409:6;13400:15;;;;;;:::i;:::-;;;;;13444:2;13434:12;;;;13360:102;13489:6;13480:5;:15;13476:102;;13525:6;13516:15;;;;;;:::i;:::-;;;;;13560:2;13550:12;;;;13476:102;13605:5;13596;:14;13592:99;;13640:5;13631:14;;;;;;:::i;:::-;;;;;13674:1;13664:11;;;;13592:99;13718:5;13709;:14;13705:99;;13753:5;13744:14;;;;;;:::i;:::-;;;;;13787:1;13777:11;;;;13705:99;13831:5;13822;:14;13818:99;;13866:5;13857:14;;;;;;:::i;:::-;;;;;13900:1;13890:11;;;;13818:99;13944:5;13935;:14;13931:66;;13980:1;13970:11;;;;13931:66;14025:6;14018:13;;;13117:922;;;:::o;47621:305::-;47723:4;47775:25;47760:40;;;:11;:40;;;;:105;;;;47832:33;47817:48;;;:11;:48;;;;47760:105;:158;;;;47882:36;47906:11;47882:23;:36::i;:::-;47760:158;47740:178;;47621:305;;;:::o;62164:159::-;;;;;:::o;67617:164::-;67721:10;:17;;;;67694:15;:24;67710:7;67694:24;;;;;;;;;;;:44;;;;67749:10;67765:7;67749:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67617:164;:::o;68408:988::-;68674:22;68724:1;68699:22;68716:4;68699:16;:22::i;:::-;:26;;;;:::i;:::-;68674:51;;68736:18;68757:17;:26;68775:7;68757:26;;;;;;;;;;;;68736:47;;68904:14;68890:10;:28;68886:328;;68935:19;68957:12;:18;68970:4;68957:18;;;;;;;;;;;;;;;:34;68976:14;68957:34;;;;;;;;;;;;68935:56;;69041:11;69008:12;:18;69021:4;69008:18;;;;;;;;;;;;;;;:30;69027:10;69008:30;;;;;;;;;;;:44;;;;69158:10;69125:17;:30;69143:11;69125:30;;;;;;;;;;;:43;;;;68920:294;68886:328;69310:17;:26;69328:7;69310:26;;;;;;;;;;;69303:33;;;69354:12;:18;69367:4;69354:18;;;;;;;;;;;;;;;:34;69373:14;69354:34;;;;;;;;;;;69347:41;;;68489:907;;68408:988;;:::o;69691:1079::-;69944:22;69989:1;69969:10;:17;;;;:21;;;;:::i;:::-;69944:46;;70001:18;70022:15;:24;70038:7;70022:24;;;;;;;;;;;;70001:45;;70373:19;70395:10;70406:14;70395:26;;;;;;;;:::i;:::-;;;;;;;;;;70373:48;;70459:11;70434:10;70445;70434:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;70570:10;70539:15;:28;70555:11;70539:28;;;;;;;;;;;:41;;;;70711:15;:24;70727:7;70711:24;;;;;;;;;;;70704:31;;;70746:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;69762:1008;;;69691:1079;:::o;67195:221::-;67280:14;67297:20;67314:2;67297:16;:20::i;:::-;67280:37;;67355:7;67328:12;:16;67341:2;67328:16;;;;;;;;;;;;;;;:24;67345:6;67328:24;;;;;;;;;;;:34;;;;67402:6;67373:17;:26;67391:7;67373:26;;;;;;;;;;;:35;;;;67269:147;67195:221;;:::o;55376:942::-;55470:1;55456:16;;:2;:16;;;55448:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55529:16;55537:7;55529;:16::i;:::-;55528:17;55520:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55591:48;55620:1;55624:2;55628:7;55637:1;55591:20;:48::i;:::-;55738:16;55746:7;55738;:16::i;:::-;55737:17;55729:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56153:1;56136:9;:13;56146:2;56136:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56197:2;56178:7;:16;56186:7;56178:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56242:7;56238:2;56217:33;;56234:1;56217:33;;;;;;;;;;;;56263:47;56291:1;56295:2;56299:7;56308:1;56263:19;:47::i;:::-;55376:942;;:::o;22971:326::-;23031:4;23288:1;23266:7;:19;;;:23;23259:30;;22971:326;;;:::o;34900:157::-;34985:4;35024:25;35009:40;;;:11;:40;;;;35002:47;;34900:157;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:126::-;2145:7;2185:42;2178:5;2174:54;2163:65;;2108:126;;;:::o;2240:96::-;2277:7;2306:24;2324:5;2306:24;:::i;:::-;2295:35;;2240:96;;;:::o;2342:122::-;2415:24;2433:5;2415:24;:::i;:::-;2408:5;2405:35;2395:63;;2454:1;2451;2444:12;2395:63;2342:122;:::o;2470:139::-;2516:5;2554:6;2541:20;2532:29;;2570:33;2597:5;2570:33;:::i;:::-;2470:139;;;;:::o;2615:109::-;2651:7;2691:26;2684:5;2680:38;2669:49;;2615:109;;;:::o;2730:120::-;2802:23;2819:5;2802:23;:::i;:::-;2795:5;2792:34;2782:62;;2840:1;2837;2830:12;2782:62;2730:120;:::o;2856:137::-;2901:5;2939:6;2926:20;2917:29;;2955:32;2981:5;2955:32;:::i;:::-;2856:137;;;;:::o;2999:472::-;3066:6;3074;3123:2;3111:9;3102:7;3098:23;3094:32;3091:119;;;3129:79;;:::i;:::-;3091:119;3249:1;3274:53;3319:7;3310:6;3299:9;3295:22;3274:53;:::i;:::-;3264:63;;3220:117;3376:2;3402:52;3446:7;3437:6;3426:9;3422:22;3402:52;:::i;:::-;3392:62;;3347:117;2999:472;;;;;:::o;3477:99::-;3529:6;3563:5;3557:12;3547:22;;3477:99;;;:::o;3582:169::-;3666:11;3700:6;3695:3;3688:19;3740:4;3735:3;3731:14;3716:29;;3582:169;;;;:::o;3757:246::-;3838:1;3848:113;3862:6;3859:1;3856:13;3848:113;;;3947:1;3942:3;3938:11;3932:18;3928:1;3923:3;3919:11;3912:39;3884:2;3881:1;3877:10;3872:15;;3848:113;;;3995:1;3986:6;3981:3;3977:16;3970:27;3819:184;3757:246;;;:::o;4009:102::-;4050:6;4101:2;4097:7;4092:2;4085:5;4081:14;4077:28;4067:38;;4009:102;;;:::o;4117:377::-;4205:3;4233:39;4266:5;4233:39;:::i;:::-;4288:71;4352:6;4347:3;4288:71;:::i;:::-;4281:78;;4368:65;4426:6;4421:3;4414:4;4407:5;4403:16;4368:65;:::i;:::-;4458:29;4480:6;4458:29;:::i;:::-;4453:3;4449:39;4442:46;;4209:285;4117:377;;;;:::o;4500:313::-;4613:4;4651:2;4640:9;4636:18;4628:26;;4700:9;4694:4;4690:20;4686:1;4675:9;4671:17;4664:47;4728:78;4801:4;4792:6;4728:78;:::i;:::-;4720:86;;4500:313;;;;:::o;4819:77::-;4856:7;4885:5;4874:16;;4819:77;;;:::o;4902:122::-;4975:24;4993:5;4975:24;:::i;:::-;4968:5;4965:35;4955:63;;5014:1;5011;5004:12;4955:63;4902:122;:::o;5030:139::-;5076:5;5114:6;5101:20;5092:29;;5130:33;5157:5;5130:33;:::i;:::-;5030:139;;;;:::o;5175:329::-;5234:6;5283:2;5271:9;5262:7;5258:23;5254:32;5251:119;;;5289:79;;:::i;:::-;5251:119;5409:1;5434:53;5479:7;5470:6;5459:9;5455:22;5434:53;:::i;:::-;5424:63;;5380:117;5175:329;;;;:::o;5510:118::-;5597:24;5615:5;5597:24;:::i;:::-;5592:3;5585:37;5510:118;;:::o;5634:222::-;5727:4;5765:2;5754:9;5750:18;5742:26;;5778:71;5846:1;5835:9;5831:17;5822:6;5778:71;:::i;:::-;5634:222;;;;:::o;5862:474::-;5930:6;5938;5987:2;5975:9;5966:7;5962:23;5958:32;5955:119;;;5993:79;;:::i;:::-;5955:119;6113:1;6138:53;6183:7;6174:6;6163:9;6159:22;6138:53;:::i;:::-;6128:63;;6084:117;6240:2;6266:53;6311:7;6302:6;6291:9;6287:22;6266:53;:::i;:::-;6256:63;;6211:118;5862:474;;;;;:::o;6342:118::-;6429:24;6447:5;6429:24;:::i;:::-;6424:3;6417:37;6342:118;;:::o;6466:222::-;6559:4;6597:2;6586:9;6582:18;6574:26;;6610:71;6678:1;6667:9;6663:17;6654:6;6610:71;:::i;:::-;6466:222;;;;:::o;6694:619::-;6771:6;6779;6787;6836:2;6824:9;6815:7;6811:23;6807:32;6804:119;;;6842:79;;:::i;:::-;6804:119;6962:1;6987:53;7032:7;7023:6;7012:9;7008:22;6987:53;:::i;:::-;6977:63;;6933:117;7089:2;7115:53;7160:7;7151:6;7140:9;7136:22;7115:53;:::i;:::-;7105:63;;7060:118;7217:2;7243:53;7288:7;7279:6;7268:9;7264:22;7243:53;:::i;:::-;7233:63;;7188:118;6694:619;;;;;:::o;7319:474::-;7387:6;7395;7444:2;7432:9;7423:7;7419:23;7415:32;7412:119;;;7450:79;;:::i;:::-;7412:119;7570:1;7595:53;7640:7;7631:6;7620:9;7616:22;7595:53;:::i;:::-;7585:63;;7541:117;7697:2;7723:53;7768:7;7759:6;7748:9;7744:22;7723:53;:::i;:::-;7713:63;;7668:118;7319:474;;;;;:::o;7799:332::-;7920:4;7958:2;7947:9;7943:18;7935:26;;7971:71;8039:1;8028:9;8024:17;8015:6;7971:71;:::i;:::-;8052:72;8120:2;8109:9;8105:18;8096:6;8052:72;:::i;:::-;7799:332;;;;;:::o;8137:329::-;8196:6;8245:2;8233:9;8224:7;8220:23;8216:32;8213:119;;;8251:79;;:::i;:::-;8213:119;8371:1;8396:53;8441:7;8432:6;8421:9;8417:22;8396:53;:::i;:::-;8386:63;;8342:117;8137:329;;;;:::o;8472:117::-;8581:1;8578;8571:12;8595:180;8643:77;8640:1;8633:88;8740:4;8737:1;8730:15;8764:4;8761:1;8754:15;8781:281;8864:27;8886:4;8864:27;:::i;:::-;8856:6;8852:40;8994:6;8982:10;8979:22;8958:18;8946:10;8943:34;8940:62;8937:88;;;9005:18;;:::i;:::-;8937:88;9045:10;9041:2;9034:22;8824:238;8781:281;;:::o;9068:129::-;9102:6;9129:20;;:::i;:::-;9119:30;;9158:33;9186:4;9178:6;9158:33;:::i;:::-;9068:129;;;:::o;9203:311::-;9280:4;9370:18;9362:6;9359:30;9356:56;;;9392:18;;:::i;:::-;9356:56;9442:4;9434:6;9430:17;9422:25;;9502:4;9496;9492:15;9484:23;;9203:311;;;:::o;9520:117::-;9629:1;9626;9619:12;9660:710;9756:5;9781:81;9797:64;9854:6;9797:64;:::i;:::-;9781:81;:::i;:::-;9772:90;;9882:5;9911:6;9904:5;9897:21;9945:4;9938:5;9934:16;9927:23;;9998:4;9990:6;9986:17;9978:6;9974:30;10027:3;10019:6;10016:15;10013:122;;;10046:79;;:::i;:::-;10013:122;10161:6;10144:220;10178:6;10173:3;10170:15;10144:220;;;10253:3;10282:37;10315:3;10303:10;10282:37;:::i;:::-;10277:3;10270:50;10349:4;10344:3;10340:14;10333:21;;10220:144;10204:4;10199:3;10195:14;10188:21;;10144:220;;;10148:21;9762:608;;9660:710;;;;;:::o;10393:370::-;10464:5;10513:3;10506:4;10498:6;10494:17;10490:27;10480:122;;10521:79;;:::i;:::-;10480:122;10638:6;10625:20;10663:94;10753:3;10745:6;10738:4;10730:6;10726:17;10663:94;:::i;:::-;10654:103;;10470:293;10393:370;;;;:::o;10769:311::-;10846:4;10936:18;10928:6;10925:30;10922:56;;;10958:18;;:::i;:::-;10922:56;11008:4;11000:6;10996:17;10988:25;;11068:4;11062;11058:15;11050:23;;10769:311;;;:::o;11103:710::-;11199:5;11224:81;11240:64;11297:6;11240:64;:::i;:::-;11224:81;:::i;:::-;11215:90;;11325:5;11354:6;11347:5;11340:21;11388:4;11381:5;11377:16;11370:23;;11441:4;11433:6;11429:17;11421:6;11417:30;11470:3;11462:6;11459:15;11456:122;;;11489:79;;:::i;:::-;11456:122;11604:6;11587:220;11621:6;11616:3;11613:15;11587:220;;;11696:3;11725:37;11758:3;11746:10;11725:37;:::i;:::-;11720:3;11713:50;11792:4;11787:3;11783:14;11776:21;;11663:144;11647:4;11642:3;11638:14;11631:21;;11587:220;;;11591:21;11205:608;;11103:710;;;;;:::o;11836:370::-;11907:5;11956:3;11949:4;11941:6;11937:17;11933:27;11923:122;;11964:79;;:::i;:::-;11923:122;12081:6;12068:20;12106:94;12196:3;12188:6;12181:4;12173:6;12169:17;12106:94;:::i;:::-;12097:103;;11913:293;11836:370;;;;:::o;12212:894::-;12330:6;12338;12387:2;12375:9;12366:7;12362:23;12358:32;12355:119;;;12393:79;;:::i;:::-;12355:119;12541:1;12530:9;12526:17;12513:31;12571:18;12563:6;12560:30;12557:117;;;12593:79;;:::i;:::-;12557:117;12698:78;12768:7;12759:6;12748:9;12744:22;12698:78;:::i;:::-;12688:88;;12484:302;12853:2;12842:9;12838:18;12825:32;12884:18;12876:6;12873:30;12870:117;;;12906:79;;:::i;:::-;12870:117;13011:78;13081:7;13072:6;13061:9;13057:22;13011:78;:::i;:::-;13001:88;;12796:303;12212:894;;;;;:::o;13112:114::-;13179:6;13213:5;13207:12;13197:22;;13112:114;;;:::o;13232:184::-;13331:11;13365:6;13360:3;13353:19;13405:4;13400:3;13396:14;13381:29;;13232:184;;;;:::o;13422:132::-;13489:4;13512:3;13504:11;;13542:4;13537:3;13533:14;13525:22;;13422:132;;;:::o;13560:108::-;13637:24;13655:5;13637:24;:::i;:::-;13632:3;13625:37;13560:108;;:::o;13674:179::-;13743:10;13764:46;13806:3;13798:6;13764:46;:::i;:::-;13842:4;13837:3;13833:14;13819:28;;13674:179;;;;:::o;13859:113::-;13929:4;13961;13956:3;13952:14;13944:22;;13859:113;;;:::o;14008:732::-;14127:3;14156:54;14204:5;14156:54;:::i;:::-;14226:86;14305:6;14300:3;14226:86;:::i;:::-;14219:93;;14336:56;14386:5;14336:56;:::i;:::-;14415:7;14446:1;14431:284;14456:6;14453:1;14450:13;14431:284;;;14532:6;14526:13;14559:63;14618:3;14603:13;14559:63;:::i;:::-;14552:70;;14645:60;14698:6;14645:60;:::i;:::-;14635:70;;14491:224;14478:1;14475;14471:9;14466:14;;14431:284;;;14435:14;14731:3;14724:10;;14132:608;;;14008:732;;;;:::o;14746:373::-;14889:4;14927:2;14916:9;14912:18;14904:26;;14976:9;14970:4;14966:20;14962:1;14951:9;14947:17;14940:47;15004:108;15107:4;15098:6;15004:108;:::i;:::-;14996:116;;14746:373;;;;:::o;15125:117::-;15234:1;15231;15224:12;15248:308;15310:4;15400:18;15392:6;15389:30;15386:56;;;15422:18;;:::i;:::-;15386:56;15460:29;15482:6;15460:29;:::i;:::-;15452:37;;15544:4;15538;15534:15;15526:23;;15248:308;;;:::o;15562:146::-;15659:6;15654:3;15649;15636:30;15700:1;15691:6;15686:3;15682:16;15675:27;15562:146;;;:::o;15714:425::-;15792:5;15817:66;15833:49;15875:6;15833:49;:::i;:::-;15817:66;:::i;:::-;15808:75;;15906:6;15899:5;15892:21;15944:4;15937:5;15933:16;15982:3;15973:6;15968:3;15964:16;15961:25;15958:112;;;15989:79;;:::i;:::-;15958:112;16079:54;16126:6;16121:3;16116;16079:54;:::i;:::-;15798:341;15714:425;;;;;:::o;16159:340::-;16215:5;16264:3;16257:4;16249:6;16245:17;16241:27;16231:122;;16272:79;;:::i;:::-;16231:122;16389:6;16376:20;16414:79;16489:3;16481:6;16474:4;16466:6;16462:17;16414:79;:::i;:::-;16405:88;;16221:278;16159:340;;;;:::o;16505:509::-;16574:6;16623:2;16611:9;16602:7;16598:23;16594:32;16591:119;;;16629:79;;:::i;:::-;16591:119;16777:1;16766:9;16762:17;16749:31;16807:18;16799:6;16796:30;16793:117;;;16829:79;;:::i;:::-;16793:117;16934:63;16989:7;16980:6;16969:9;16965:22;16934:63;:::i;:::-;16924:73;;16720:287;16505:509;;;;:::o;17020:468::-;17085:6;17093;17142:2;17130:9;17121:7;17117:23;17113:32;17110:119;;;17148:79;;:::i;:::-;17110:119;17268:1;17293:53;17338:7;17329:6;17318:9;17314:22;17293:53;:::i;:::-;17283:63;;17239:117;17395:2;17421:50;17463:7;17454:6;17443:9;17439:22;17421:50;:::i;:::-;17411:60;;17366:115;17020:468;;;;;:::o;17494:307::-;17555:4;17645:18;17637:6;17634:30;17631:56;;;17667:18;;:::i;:::-;17631:56;17705:29;17727:6;17705:29;:::i;:::-;17697:37;;17789:4;17783;17779:15;17771:23;;17494:307;;;:::o;17807:423::-;17884:5;17909:65;17925:48;17966:6;17925:48;:::i;:::-;17909:65;:::i;:::-;17900:74;;17997:6;17990:5;17983:21;18035:4;18028:5;18024:16;18073:3;18064:6;18059:3;18055:16;18052:25;18049:112;;;18080:79;;:::i;:::-;18049:112;18170:54;18217:6;18212:3;18207;18170:54;:::i;:::-;17890:340;17807:423;;;;;:::o;18249:338::-;18304:5;18353:3;18346:4;18338:6;18334:17;18330:27;18320:122;;18361:79;;:::i;:::-;18320:122;18478:6;18465:20;18503:78;18577:3;18569:6;18562:4;18554:6;18550:17;18503:78;:::i;:::-;18494:87;;18310:277;18249:338;;;;:::o;18593:943::-;18688:6;18696;18704;18712;18761:3;18749:9;18740:7;18736:23;18732:33;18729:120;;;18768:79;;:::i;:::-;18729:120;18888:1;18913:53;18958:7;18949:6;18938:9;18934:22;18913:53;:::i;:::-;18903:63;;18859:117;19015:2;19041:53;19086:7;19077:6;19066:9;19062:22;19041:53;:::i;:::-;19031:63;;18986:118;19143:2;19169:53;19214:7;19205:6;19194:9;19190:22;19169:53;:::i;:::-;19159:63;;19114:118;19299:2;19288:9;19284:18;19271:32;19330:18;19322:6;19319:30;19316:117;;;19352:79;;:::i;:::-;19316:117;19457:62;19511:7;19502:6;19491:9;19487:22;19457:62;:::i;:::-;19447:72;;19242:287;18593:943;;;;;;;:::o;19542:99::-;19613:21;19628:5;19613:21;:::i;:::-;19608:3;19601:34;19542:99;;:::o;19721:692::-;19870:4;19865:3;19861:14;19959:4;19952:5;19948:16;19942:23;19978:57;20029:4;20024:3;20020:14;20006:12;19978:57;:::i;:::-;19885:160;20129:4;20122:5;20118:16;20112:23;20148:63;20205:4;20200:3;20196:14;20182:12;20148:63;:::i;:::-;20055:166;20314:4;20307:5;20303:16;20297:23;20333:63;20390:4;20385:3;20381:14;20367:12;20333:63;:::i;:::-;20231:175;19839:574;19721:692;;:::o;20419:326::-;20564:4;20602:2;20591:9;20587:18;20579:26;;20615:123;20735:1;20724:9;20720:17;20711:6;20615:123;:::i;:::-;20419:326;;;;:::o;20751:474::-;20819:6;20827;20876:2;20864:9;20855:7;20851:23;20847:32;20844:119;;;20882:79;;:::i;:::-;20844:119;21002:1;21027:53;21072:7;21063:6;21052:9;21048:22;21027:53;:::i;:::-;21017:63;;20973:117;21129:2;21155:53;21200:7;21191:6;21180:9;21176:22;21155:53;:::i;:::-;21145:63;;21100:118;20751:474;;;;;:::o;21231:539::-;21315:6;21364:2;21352:9;21343:7;21339:23;21335:32;21332:119;;;21370:79;;:::i;:::-;21332:119;21518:1;21507:9;21503:17;21490:31;21548:18;21540:6;21537:30;21534:117;;;21570:79;;:::i;:::-;21534:117;21675:78;21745:7;21736:6;21725:9;21721:22;21675:78;:::i;:::-;21665:88;;21461:302;21231:539;;;;:::o;21776:180::-;21824:77;21821:1;21814:88;21921:4;21918:1;21911:15;21945:4;21942:1;21935:15;21962:320;22006:6;22043:1;22037:4;22033:12;22023:22;;22090:1;22084:4;22080:12;22111:18;22101:81;;22167:4;22159:6;22155:17;22145:27;;22101:81;22229:2;22221:6;22218:14;22198:18;22195:38;22192:84;;22248:18;;:::i;:::-;22192:84;22013:269;21962:320;;;:::o;22288:220::-;22428:34;22424:1;22416:6;22412:14;22405:58;22497:3;22492:2;22484:6;22480:15;22473:28;22288:220;:::o;22514:366::-;22656:3;22677:67;22741:2;22736:3;22677:67;:::i;:::-;22670:74;;22753:93;22842:3;22753:93;:::i;:::-;22871:2;22866:3;22862:12;22855:19;;22514:366;;;:::o;22886:419::-;23052:4;23090:2;23079:9;23075:18;23067:26;;23139:9;23133:4;23129:20;23125:1;23114:9;23110:17;23103:47;23167:131;23293:4;23167:131;:::i;:::-;23159:139;;22886:419;;;:::o;23311:248::-;23451:34;23447:1;23439:6;23435:14;23428:58;23520:31;23515:2;23507:6;23503:15;23496:56;23311:248;:::o;23565:366::-;23707:3;23728:67;23792:2;23787:3;23728:67;:::i;:::-;23721:74;;23804:93;23893:3;23804:93;:::i;:::-;23922:2;23917:3;23913:12;23906:19;;23565:366;;;:::o;23937:419::-;24103:4;24141:2;24130:9;24126:18;24118:26;;24190:9;24184:4;24180:20;24176:1;24165:9;24161:17;24154:47;24218:131;24344:4;24218:131;:::i;:::-;24210:139;;23937:419;;;:::o;24362:232::-;24502:34;24498:1;24490:6;24486:14;24479:58;24571:15;24566:2;24558:6;24554:15;24547:40;24362:232;:::o;24600:366::-;24742:3;24763:67;24827:2;24822:3;24763:67;:::i;:::-;24756:74;;24839:93;24928:3;24839:93;:::i;:::-;24957:2;24952:3;24948:12;24941:19;;24600:366;;;:::o;24972:419::-;25138:4;25176:2;25165:9;25161:18;25153:26;;25225:9;25219:4;25215:20;25211:1;25200:9;25196:17;25189:47;25253:131;25379:4;25253:131;:::i;:::-;25245:139;;24972:419;;;:::o;25397:180::-;25445:77;25442:1;25435:88;25542:4;25539:1;25532:15;25566:4;25563:1;25556:15;25583:410;25623:7;25646:20;25664:1;25646:20;:::i;:::-;25641:25;;25680:20;25698:1;25680:20;:::i;:::-;25675:25;;25735:1;25732;25728:9;25757:30;25775:11;25757:30;:::i;:::-;25746:41;;25936:1;25927:7;25923:15;25920:1;25917:22;25897:1;25890:9;25870:83;25847:139;;25966:18;;:::i;:::-;25847:139;25631:362;25583:410;;;;:::o;25999:180::-;26047:77;26044:1;26037:88;26144:4;26141:1;26134:15;26168:4;26165:1;26158:15;26185:185;26225:1;26242:20;26260:1;26242:20;:::i;:::-;26237:25;;26276:20;26294:1;26276:20;:::i;:::-;26271:25;;26315:1;26305:35;;26320:18;;:::i;:::-;26305:35;26362:1;26359;26355:9;26350:14;;26185:185;;;;:::o;26376:166::-;26516:18;26512:1;26504:6;26500:14;26493:42;26376:166;:::o;26548:366::-;26690:3;26711:67;26775:2;26770:3;26711:67;:::i;:::-;26704:74;;26787:93;26876:3;26787:93;:::i;:::-;26905:2;26900:3;26896:12;26889:19;;26548:366;;;:::o;26920:419::-;27086:4;27124:2;27113:9;27109:18;27101:26;;27173:9;27167:4;27163:20;27159:1;27148:9;27144:17;27137:47;27201:131;27327:4;27201:131;:::i;:::-;27193:139;;26920:419;;;:::o;27345:180::-;27393:77;27390:1;27383:88;27490:4;27487:1;27480:15;27514:4;27511:1;27504:15;27531:233;27570:3;27593:24;27611:5;27593:24;:::i;:::-;27584:33;;27639:66;27632:5;27629:77;27626:103;;27709:18;;:::i;:::-;27626:103;27756:1;27749:5;27745:13;27738:20;;27531:233;;;:::o;27770:230::-;27910:34;27906:1;27898:6;27894:14;27887:58;27979:13;27974:2;27966:6;27962:15;27955:38;27770:230;:::o;28006:366::-;28148:3;28169:67;28233:2;28228:3;28169:67;:::i;:::-;28162:74;;28245:93;28334:3;28245:93;:::i;:::-;28363:2;28358:3;28354:12;28347:19;;28006:366;;;:::o;28378:419::-;28544:4;28582:2;28571:9;28567:18;28559:26;;28631:9;28625:4;28621:20;28617:1;28606:9;28602:17;28595:47;28659:131;28785:4;28659:131;:::i;:::-;28651:139;;28378:419;;;:::o;28803:147::-;28904:11;28941:3;28926:18;;28803:147;;;;:::o;28956:114::-;;:::o;29076:398::-;29235:3;29256:83;29337:1;29332:3;29256:83;:::i;:::-;29249:90;;29348:93;29437:3;29348:93;:::i;:::-;29466:1;29461:3;29457:11;29450:18;;29076:398;;;:::o;29480:379::-;29664:3;29686:147;29829:3;29686:147;:::i;:::-;29679:154;;29850:3;29843:10;;29480:379;;;:::o;29865:168::-;30005:20;30001:1;29993:6;29989:14;29982:44;29865:168;:::o;30039:366::-;30181:3;30202:67;30266:2;30261:3;30202:67;:::i;:::-;30195:74;;30278:93;30367:3;30278:93;:::i;:::-;30396:2;30391:3;30387:12;30380:19;;30039:366;;;:::o;30411:419::-;30577:4;30615:2;30604:9;30600:18;30592:26;;30664:9;30658:4;30654:20;30650:1;30639:9;30635:17;30628:47;30692:131;30818:4;30692:131;:::i;:::-;30684:139;;30411:419;;;:::o;30836:171::-;30976:23;30972:1;30964:6;30960:14;30953:47;30836:171;:::o;31013:366::-;31155:3;31176:67;31240:2;31235:3;31176:67;:::i;:::-;31169:74;;31252:93;31341:3;31252:93;:::i;:::-;31370:2;31365:3;31361:12;31354:19;;31013:366;;;:::o;31385:419::-;31551:4;31589:2;31578:9;31574:18;31566:26;;31638:9;31632:4;31628:20;31624:1;31613:9;31609:17;31602:47;31666:131;31792:4;31666:131;:::i;:::-;31658:139;;31385:419;;;:::o;31810:231::-;31950:34;31946:1;31938:6;31934:14;31927:58;32019:14;32014:2;32006:6;32002:15;31995:39;31810:231;:::o;32047:366::-;32189:3;32210:67;32274:2;32269:3;32210:67;:::i;:::-;32203:74;;32286:93;32375:3;32286:93;:::i;:::-;32404:2;32399:3;32395:12;32388:19;;32047:366;;;:::o;32419:419::-;32585:4;32623:2;32612:9;32608:18;32600:26;;32672:9;32666:4;32662:20;32658:1;32647:9;32643:17;32636:47;32700:131;32826:4;32700:131;:::i;:::-;32692:139;;32419:419;;;:::o;32844:141::-;32893:4;32916:3;32908:11;;32939:3;32936:1;32929:14;32973:4;32970:1;32960:18;32952:26;;32844:141;;;:::o;32991:93::-;33028:6;33075:2;33070;33063:5;33059:14;33055:23;33045:33;;32991:93;;;:::o;33090:107::-;33134:8;33184:5;33178:4;33174:16;33153:37;;33090:107;;;;:::o;33203:393::-;33272:6;33322:1;33310:10;33306:18;33345:97;33375:66;33364:9;33345:97;:::i;:::-;33463:39;33493:8;33482:9;33463:39;:::i;:::-;33451:51;;33535:4;33531:9;33524:5;33520:21;33511:30;;33584:4;33574:8;33570:19;33563:5;33560:30;33550:40;;33279:317;;33203:393;;;;;:::o;33602:60::-;33630:3;33651:5;33644:12;;33602:60;;;:::o;33668:142::-;33718:9;33751:53;33769:34;33778:24;33796:5;33778:24;:::i;:::-;33769:34;:::i;:::-;33751:53;:::i;:::-;33738:66;;33668:142;;;:::o;33816:75::-;33859:3;33880:5;33873:12;;33816:75;;;:::o;33897:269::-;34007:39;34038:7;34007:39;:::i;:::-;34068:91;34117:41;34141:16;34117:41;:::i;:::-;34109:6;34102:4;34096:11;34068:91;:::i;:::-;34062:4;34055:105;33973:193;33897:269;;;:::o;34172:73::-;34217:3;34172:73;:::o;34251:189::-;34328:32;;:::i;:::-;34369:65;34427:6;34419;34413:4;34369:65;:::i;:::-;34304:136;34251:189;;:::o;34446:186::-;34506:120;34523:3;34516:5;34513:14;34506:120;;;34577:39;34614:1;34607:5;34577:39;:::i;:::-;34550:1;34543:5;34539:13;34530:22;;34506:120;;;34446:186;;:::o;34638:543::-;34739:2;34734:3;34731:11;34728:446;;;34773:38;34805:5;34773:38;:::i;:::-;34857:29;34875:10;34857:29;:::i;:::-;34847:8;34843:44;35040:2;35028:10;35025:18;35022:49;;;35061:8;35046:23;;35022:49;35084:80;35140:22;35158:3;35140:22;:::i;:::-;35130:8;35126:37;35113:11;35084:80;:::i;:::-;34743:431;;34728:446;34638:543;;;:::o;35187:117::-;35241:8;35291:5;35285:4;35281:16;35260:37;;35187:117;;;;:::o;35310:169::-;35354:6;35387:51;35435:1;35431:6;35423:5;35420:1;35416:13;35387:51;:::i;:::-;35383:56;35468:4;35462;35458:15;35448:25;;35361:118;35310:169;;;;:::o;35484:295::-;35560:4;35706:29;35731:3;35725:4;35706:29;:::i;:::-;35698:37;;35768:3;35765:1;35761:11;35755:4;35752:21;35744:29;;35484:295;;;;:::o;35784:1395::-;35901:37;35934:3;35901:37;:::i;:::-;36003:18;35995:6;35992:30;35989:56;;;36025:18;;:::i;:::-;35989:56;36069:38;36101:4;36095:11;36069:38;:::i;:::-;36154:67;36214:6;36206;36200:4;36154:67;:::i;:::-;36248:1;36272:4;36259:17;;36304:2;36296:6;36293:14;36321:1;36316:618;;;;36978:1;36995:6;36992:77;;;37044:9;37039:3;37035:19;37029:26;37020:35;;36992:77;37095:67;37155:6;37148:5;37095:67;:::i;:::-;37089:4;37082:81;36951:222;36286:887;;36316:618;36368:4;36364:9;36356:6;36352:22;36402:37;36434:4;36402:37;:::i;:::-;36461:1;36475:208;36489:7;36486:1;36483:14;36475:208;;;36568:9;36563:3;36559:19;36553:26;36545:6;36538:42;36619:1;36611:6;36607:14;36597:24;;36666:2;36655:9;36651:18;36638:31;;36512:4;36509:1;36505:12;36500:17;;36475:208;;;36711:6;36702:7;36699:19;36696:179;;;36769:9;36764:3;36760:19;36754:26;36812:48;36854:4;36846:6;36842:17;36831:9;36812:48;:::i;:::-;36804:6;36797:64;36719:156;36696:179;36921:1;36917;36909:6;36905:14;36901:22;36895:4;36888:36;36323:611;;;36286:887;;35876:1303;;;35784:1395;;:::o;37185:191::-;37225:3;37244:20;37262:1;37244:20;:::i;:::-;37239:25;;37278:20;37296:1;37278:20;:::i;:::-;37273:25;;37321:1;37318;37314:9;37307:16;;37342:3;37339:1;37336:10;37333:36;;;37349:18;;:::i;:::-;37333:36;37185:191;;;;:::o;37382:194::-;37422:4;37442:20;37460:1;37442:20;:::i;:::-;37437:25;;37476:20;37494:1;37476:20;:::i;:::-;37471:25;;37520:1;37517;37513:9;37505:17;;37544:1;37538:4;37535:11;37532:37;;;37549:18;;:::i;:::-;37532:37;37382:194;;;;:::o;37582:174::-;37722:26;37718:1;37710:6;37706:14;37699:50;37582:174;:::o;37762:366::-;37904:3;37925:67;37989:2;37984:3;37925:67;:::i;:::-;37918:74;;38001:93;38090:3;38001:93;:::i;:::-;38119:2;38114:3;38110:12;38103:19;;37762:366;;;:::o;38134:419::-;38300:4;38338:2;38327:9;38323:18;38315:26;;38387:9;38381:4;38377:20;38373:1;38362:9;38358:17;38351:47;38415:131;38541:4;38415:131;:::i;:::-;38407:139;;38134:419;;;:::o;38559:228::-;38699:34;38695:1;38687:6;38683:14;38676:58;38768:11;38763:2;38755:6;38751:15;38744:36;38559:228;:::o;38793:366::-;38935:3;38956:67;39020:2;39015:3;38956:67;:::i;:::-;38949:74;;39032:93;39121:3;39032:93;:::i;:::-;39150:2;39145:3;39141:12;39134:19;;38793:366;;;:::o;39165:419::-;39331:4;39369:2;39358:9;39354:18;39346:26;;39418:9;39412:4;39408:20;39404:1;39393:9;39389:17;39382:47;39446:131;39572:4;39446:131;:::i;:::-;39438:139;;39165:419;;;:::o;39590:156::-;39730:8;39726:1;39718:6;39714:14;39707:32;39590:156;:::o;39752:365::-;39894:3;39915:66;39979:1;39974:3;39915:66;:::i;:::-;39908:73;;39990:93;40079:3;39990:93;:::i;:::-;40108:2;40103:3;40099:12;40092:19;;39752:365;;;:::o;40123:419::-;40289:4;40327:2;40316:9;40312:18;40304:26;;40376:9;40370:4;40366:20;40362:1;40351:9;40347:17;40340:47;40404:131;40530:4;40404:131;:::i;:::-;40396:139;;40123:419;;;:::o;40548:170::-;40688:22;40684:1;40676:6;40672:14;40665:46;40548:170;:::o;40724:366::-;40866:3;40887:67;40951:2;40946:3;40887:67;:::i;:::-;40880:74;;40963:93;41052:3;40963:93;:::i;:::-;41081:2;41076:3;41072:12;41065:19;;40724:366;;;:::o;41096:419::-;41262:4;41300:2;41289:9;41285:18;41277:26;;41349:9;41343:4;41339:20;41335:1;41324:9;41320:17;41313:47;41377:131;41503:4;41377:131;:::i;:::-;41369:139;;41096:419;;;:::o;41521:164::-;41661:16;41657:1;41649:6;41645:14;41638:40;41521:164;:::o;41691:366::-;41833:3;41854:67;41918:2;41913:3;41854:67;:::i;:::-;41847:74;;41930:93;42019:3;41930:93;:::i;:::-;42048:2;42043:3;42039:12;42032:19;;41691:366;;;:::o;42063:419::-;42229:4;42267:2;42256:9;42252:18;42244:26;;42316:9;42310:4;42306:20;42302:1;42291:9;42287:17;42280:47;42344:131;42470:4;42344:131;:::i;:::-;42336:139;;42063:419;;;:::o;42488:169::-;42628:21;42624:1;42616:6;42612:14;42605:45;42488:169;:::o;42663:366::-;42805:3;42826:67;42890:2;42885:3;42826:67;:::i;:::-;42819:74;;42902:93;42991:3;42902:93;:::i;:::-;43020:2;43015:3;43011:12;43004:19;;42663:366;;;:::o;43035:419::-;43201:4;43239:2;43228:9;43224:18;43216:26;;43288:9;43282:4;43278:20;43274:1;43263:9;43259:17;43252:47;43316:131;43442:4;43316:131;:::i;:::-;43308:139;;43035:419;;;:::o;43460:168::-;43600:20;43596:1;43588:6;43584:14;43577:44;43460:168;:::o;43634:366::-;43776:3;43797:67;43861:2;43856:3;43797:67;:::i;:::-;43790:74;;43873:93;43962:3;43873:93;:::i;:::-;43991:2;43986:3;43982:12;43975:19;;43634:366;;;:::o;44006:419::-;44172:4;44210:2;44199:9;44195:18;44187:26;;44259:9;44253:4;44249:20;44245:1;44234:9;44230:17;44223:47;44287:131;44413:4;44287:131;:::i;:::-;44279:139;;44006:419;;;:::o;44431:234::-;44571:34;44567:1;44559:6;44555:14;44548:58;44640:17;44635:2;44627:6;44623:15;44616:42;44431:234;:::o;44671:366::-;44813:3;44834:67;44898:2;44893:3;44834:67;:::i;:::-;44827:74;;44910:93;44999:3;44910:93;:::i;:::-;45028:2;45023:3;45019:12;45012:19;;44671:366;;;:::o;45043:419::-;45209:4;45247:2;45236:9;45232:18;45224:26;;45296:9;45290:4;45286:20;45282:1;45271:9;45267:17;45260:47;45324:131;45450:4;45324:131;:::i;:::-;45316:139;;45043:419;;;:::o;45468:148::-;45570:11;45607:3;45592:18;;45468:148;;;;:::o;45622:390::-;45728:3;45756:39;45789:5;45756:39;:::i;:::-;45811:89;45893:6;45888:3;45811:89;:::i;:::-;45804:96;;45909:65;45967:6;45962:3;45955:4;45948:5;45944:16;45909:65;:::i;:::-;45999:6;45994:3;45990:16;45983:23;;45732:280;45622:390;;;;:::o;46042:874::-;46145:3;46182:5;46176:12;46211:36;46237:9;46211:36;:::i;:::-;46263:89;46345:6;46340:3;46263:89;:::i;:::-;46256:96;;46383:1;46372:9;46368:17;46399:1;46394:166;;;;46574:1;46569:341;;;;46361:549;;46394:166;46478:4;46474:9;46463;46459:25;46454:3;46447:38;46540:6;46533:14;46526:22;46518:6;46514:35;46509:3;46505:45;46498:52;;46394:166;;46569:341;46636:38;46668:5;46636:38;:::i;:::-;46696:1;46710:154;46724:6;46721:1;46718:13;46710:154;;;46798:7;46792:14;46788:1;46783:3;46779:11;46772:35;46848:1;46839:7;46835:15;46824:26;;46746:4;46743:1;46739:12;46734:17;;46710:154;;;46893:6;46888:3;46884:16;46877:23;;46576:334;;46361:549;;46149:767;;46042:874;;;;:::o;46922:589::-;47147:3;47169:95;47260:3;47251:6;47169:95;:::i;:::-;47162:102;;47281:95;47372:3;47363:6;47281:95;:::i;:::-;47274:102;;47393:92;47481:3;47472:6;47393:92;:::i;:::-;47386:99;;47502:3;47495:10;;46922:589;;;;;;:::o;47517:225::-;47657:34;47653:1;47645:6;47641:14;47634:58;47726:8;47721:2;47713:6;47709:15;47702:33;47517:225;:::o;47748:366::-;47890:3;47911:67;47975:2;47970:3;47911:67;:::i;:::-;47904:74;;47987:93;48076:3;47987:93;:::i;:::-;48105:2;48100:3;48096:12;48089:19;;47748:366;;;:::o;48120:419::-;48286:4;48324:2;48313:9;48309:18;48301:26;;48373:9;48367:4;48363:20;48359:1;48348:9;48344:17;48337:47;48401:131;48527:4;48401:131;:::i;:::-;48393:139;;48120:419;;;:::o;48545:182::-;48685:34;48681:1;48673:6;48669:14;48662:58;48545:182;:::o;48733:366::-;48875:3;48896:67;48960:2;48955:3;48896:67;:::i;:::-;48889:74;;48972:93;49061:3;48972:93;:::i;:::-;49090:2;49085:3;49081:12;49074:19;;48733:366;;;:::o;49105:419::-;49271:4;49309:2;49298:9;49294:18;49286:26;;49358:9;49352:4;49348:20;49344:1;49333:9;49329:17;49322:47;49386:131;49512:4;49386:131;:::i;:::-;49378:139;;49105:419;;;:::o;49530:229::-;49670:34;49666:1;49658:6;49654:14;49647:58;49739:12;49734:2;49726:6;49722:15;49715:37;49530:229;:::o;49765:366::-;49907:3;49928:67;49992:2;49987:3;49928:67;:::i;:::-;49921:74;;50004:93;50093:3;50004:93;:::i;:::-;50122:2;50117:3;50113:12;50106:19;;49765:366;;;:::o;50137:419::-;50303:4;50341:2;50330:9;50326:18;50318:26;;50390:9;50384:4;50380:20;50376:1;50365:9;50361:17;50354:47;50418:131;50544:4;50418:131;:::i;:::-;50410:139;;50137:419;;;:::o;50562:175::-;50702:27;50698:1;50690:6;50686:14;50679:51;50562:175;:::o;50743:366::-;50885:3;50906:67;50970:2;50965:3;50906:67;:::i;:::-;50899:74;;50982:93;51071:3;50982:93;:::i;:::-;51100:2;51095:3;51091:12;51084:19;;50743:366;;;:::o;51115:419::-;51281:4;51319:2;51308:9;51304:18;51296:26;;51368:9;51362:4;51358:20;51354:1;51343:9;51339:17;51332:47;51396:131;51522:4;51396:131;:::i;:::-;51388:139;;51115:419;;;:::o;51540:224::-;51680:34;51676:1;51668:6;51664:14;51657:58;51749:7;51744:2;51736:6;51732:15;51725:32;51540:224;:::o;51770:366::-;51912:3;51933:67;51997:2;51992:3;51933:67;:::i;:::-;51926:74;;52009:93;52098:3;52009:93;:::i;:::-;52127:2;52122:3;52118:12;52111:19;;51770:366;;;:::o;52142:419::-;52308:4;52346:2;52335:9;52331:18;52323:26;;52395:9;52389:4;52385:20;52381:1;52370:9;52366:17;52359:47;52423:131;52549:4;52423:131;:::i;:::-;52415:139;;52142:419;;;:::o;52567:223::-;52707:34;52703:1;52695:6;52691:14;52684:58;52776:6;52771:2;52763:6;52759:15;52752:31;52567:223;:::o;52796:366::-;52938:3;52959:67;53023:2;53018:3;52959:67;:::i;:::-;52952:74;;53035:93;53124:3;53035:93;:::i;:::-;53153:2;53148:3;53144:12;53137:19;;52796:366;;;:::o;53168:419::-;53334:4;53372:2;53361:9;53357:18;53349:26;;53421:9;53415:4;53411:20;53407:1;53396:9;53392:17;53385:47;53449:131;53575:4;53449:131;:::i;:::-;53441:139;;53168:419;;;:::o;53593:94::-;53626:8;53674:5;53670:2;53666:14;53645:35;;53593:94;;;:::o;53693:::-;53732:7;53761:20;53775:5;53761:20;:::i;:::-;53750:31;;53693:94;;;:::o;53793:100::-;53832:7;53861:26;53881:5;53861:26;:::i;:::-;53850:37;;53793:100;;;:::o;53899:157::-;54004:45;54024:24;54042:5;54024:24;:::i;:::-;54004:45;:::i;:::-;53999:3;53992:58;53899:157;;:::o;54062:79::-;54101:7;54130:5;54119:16;;54062:79;;;:::o;54147:157::-;54252:45;54272:24;54290:5;54272:24;:::i;:::-;54252:45;:::i;:::-;54247:3;54240:58;54147:157;;:::o;54310:679::-;54506:3;54521:75;54592:3;54583:6;54521:75;:::i;:::-;54621:2;54616:3;54612:12;54605:19;;54634:75;54705:3;54696:6;54634:75;:::i;:::-;54734:2;54729:3;54725:12;54718:19;;54747:75;54818:3;54809:6;54747:75;:::i;:::-;54847:2;54842:3;54838:12;54831:19;;54860:75;54931:3;54922:6;54860:75;:::i;:::-;54960:2;54955:3;54951:12;54944:19;;54980:3;54973:10;;54310:679;;;;;;;:::o;54995:176::-;55027:1;55044:20;55062:1;55044:20;:::i;:::-;55039:25;;55078:20;55096:1;55078:20;:::i;:::-;55073:25;;55117:1;55107:35;;55122:18;;:::i;:::-;55107:35;55163:1;55160;55156:9;55151:14;;54995:176;;;;:::o;55177:175::-;55317:27;55313:1;55305:6;55301:14;55294:51;55177:175;:::o;55358:366::-;55500:3;55521:67;55585:2;55580:3;55521:67;:::i;:::-;55514:74;;55597:93;55686:3;55597:93;:::i;:::-;55715:2;55710:3;55706:12;55699:19;;55358:366;;;:::o;55730:419::-;55896:4;55934:2;55923:9;55919:18;55911:26;;55983:9;55977:4;55973:20;55969:1;55958:9;55954:17;55947:47;56011:131;56137:4;56011:131;:::i;:::-;56003:139;;55730:419;;;:::o;56155:237::-;56295:34;56291:1;56283:6;56279:14;56272:58;56364:20;56359:2;56351:6;56347:15;56340:45;56155:237;:::o;56398:366::-;56540:3;56561:67;56625:2;56620:3;56561:67;:::i;:::-;56554:74;;56637:93;56726:3;56637:93;:::i;:::-;56755:2;56750:3;56746:12;56739:19;;56398:366;;;:::o;56770:419::-;56936:4;56974:2;56963:9;56959:18;56951:26;;57023:9;57017:4;57013:20;57009:1;56998:9;56994:17;56987:47;57051:131;57177:4;57051:131;:::i;:::-;57043:139;;56770:419;;;:::o;57195:240::-;57335:34;57331:1;57323:6;57319:14;57312:58;57404:23;57399:2;57391:6;57387:15;57380:48;57195:240;:::o;57441:366::-;57583:3;57604:67;57668:2;57663:3;57604:67;:::i;:::-;57597:74;;57680:93;57769:3;57680:93;:::i;:::-;57798:2;57793:3;57789:12;57782:19;;57441:366;;;:::o;57813:419::-;57979:4;58017:2;58006:9;58002:18;57994:26;;58066:9;58060:4;58056:20;58052:1;58041:9;58037:17;58030:47;58094:131;58220:4;58094:131;:::i;:::-;58086:139;;57813:419;;;:::o;58238:98::-;58289:6;58323:5;58317:12;58307:22;;58238:98;;;:::o;58342:168::-;58425:11;58459:6;58454:3;58447:19;58499:4;58494:3;58490:14;58475:29;;58342:168;;;;:::o;58516:373::-;58602:3;58630:38;58662:5;58630:38;:::i;:::-;58684:70;58747:6;58742:3;58684:70;:::i;:::-;58677:77;;58763:65;58821:6;58816:3;58809:4;58802:5;58798:16;58763:65;:::i;:::-;58853:29;58875:6;58853:29;:::i;:::-;58848:3;58844:39;58837:46;;58606:283;58516:373;;;;:::o;58895:640::-;59090:4;59128:3;59117:9;59113:19;59105:27;;59142:71;59210:1;59199:9;59195:17;59186:6;59142:71;:::i;:::-;59223:72;59291:2;59280:9;59276:18;59267:6;59223:72;:::i;:::-;59305;59373:2;59362:9;59358:18;59349:6;59305:72;:::i;:::-;59424:9;59418:4;59414:20;59409:2;59398:9;59394:18;59387:48;59452:76;59523:4;59514:6;59452:76;:::i;:::-;59444:84;;58895:640;;;;;;;:::o;59541:141::-;59597:5;59628:6;59622:13;59613:22;;59644:32;59670:5;59644:32;:::i;:::-;59541:141;;;;:::o;59688:349::-;59757:6;59806:2;59794:9;59785:7;59781:23;59777:32;59774:119;;;59812:79;;:::i;:::-;59774:119;59932:1;59957:63;60012:7;60003:6;59992:9;59988:22;59957:63;:::i;:::-;59947:73;;59903:127;59688:349;;;;:::o;60043:180::-;60091:77;60088:1;60081:88;60188:4;60185:1;60178:15;60212:4;60209:1;60202:15;60229:182;60369:34;60365:1;60357:6;60353:14;60346:58;60229:182;:::o;60417:366::-;60559:3;60580:67;60644:2;60639:3;60580:67;:::i;:::-;60573:74;;60656:93;60745:3;60656:93;:::i;:::-;60774:2;60769:3;60765:12;60758:19;;60417:366;;;:::o;60789:419::-;60955:4;60993:2;60982:9;60978:18;60970:26;;61042:9;61036:4;61032:20;61028:1;61017:9;61013:17;61006:47;61070:131;61196:4;61070:131;:::i;:::-;61062:139;;60789:419;;;:::o;61214:178::-;61354:30;61350:1;61342:6;61338:14;61331:54;61214:178;:::o;61398:366::-;61540:3;61561:67;61625:2;61620:3;61561:67;:::i;:::-;61554:74;;61637:93;61726:3;61637:93;:::i;:::-;61755:2;61750:3;61746:12;61739:19;;61398:366;;;:::o;61770:419::-;61936:4;61974:2;61963:9;61959:18;61951:26;;62023:9;62017:4;62013:20;62009:1;61998:9;61994:17;61987:47;62051:131;62177:4;62051:131;:::i;:::-;62043:139;;61770:419;;;:::o

Swarm Source

ipfs://bbdcb0ce8838201aff2dc8dda08955c7410e957a541bbe92ef33309e0264c03c
Loading