ETH Price: $2,611.47 (+0.64%)

Token

Proof Of Nothing (PON)
 

Overview

Max Total Supply

100,000,000 PON

Holders

84

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Null: 0x00...dEaD
Balance
2,189,759.1743456 PON

Value
$0.00
0x000000000000000000000000000000000000dead
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ProofOfNothing

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-10
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

/**

 __          __                                          _                           _   _     _               _                      _               _
 \ \        / /                                         (_)                         | | | |   (_)             | |                    | |             | |
  \ \  /\  / /__    __ _ _ __ ___   _ __  _ __ _____   ___ _ __   __ _   _ __   ___ | |_| |__  _ _ __   __ _  | |_ ___    _ __   ___ | |__   ___   __| |_   _
   \ \/  \/ / _ \  / _` | '__/ _ \ | '_ \| '__/ _ \ \ / / | '_ \ / _` | | '_ \ / _ \| __| '_ \| | '_ \ / _` | | __/ _ \  | '_ \ / _ \| '_ \ / _ \ / _` | | | |
    \  /\  /  __/ | (_| | | |  __/ | |_) | | | (_) \ V /| | | | | (_| | | | | | (_) | |_| | | | | | | | (_| | | || (_) | | | | | (_) | |_) | (_) | (_| | |_| |
     \/  \/ \___|  \__,_|_|  \___| | .__/|_|  \___/ \_/ |_|_| |_|\__, | |_| |_|\___/ \__|_| |_|_|_| |_|\__, |  \__\___/  |_| |_|\___/|_.__/ \___/ \__,_|\__, |
                                   | |                            __/ |                                 __/ |                                            __/ |
                                   |_|                           |___/                                 |___/                                            |___/

*/




/**
 * @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://consensys.net/diligence/blog/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);
        }
    }
}


/**
 * @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;
    }
}
/**
 * @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);
    }
}
/**
 * @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 << 3) < value ? 1 : 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);
    }
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

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

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

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

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

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

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

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

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


contract ProofOfNothing is Context, IERC20, Ownable
{


    // Info? are you sure?
    string private constant Name = "Proof Of Nothing";
    string private constant Symbol = "PON";
    uint8 private constant Decimals = 18;
    uint256 private TotalSupply = 100_000_000 * 10**Decimals;
    uint256 private constant MAX = ~uint256(0);
    uint256 private ReflactionaryTotal = (MAX - (MAX % TotalSupply));

    // Routing to nowhere
    IUniswapV2Router02 public UniswapV2Router;
    address public PancakeSwapAddress;

    // Snipers are not welcomed
    uint256 public liqAddedBlockNumber;
    uint256 public blocksToWait = 0;

    // Important addresses
    address payable private DevAddress = payable(0xd660145C3092100d9dd83ECe6c0449d992c8Df6E);
    address payable private MarketingAddress = payable(0xe175D48089df657C392bCF50Acf32E8CaE62Cbd7);
    address payable private BurnAddress = payable(0x000000000000000000000000000000000000dEaD);

    uint256 private HardCap = TotalSupply / 33;
    uint256 private HardCapBuy = HardCap;
    uint256 private HardCapSell = HardCap;

    mapping (address => uint256) private BalancesRefraccionarios;
    mapping (address => uint256) private BalancesReales;
    mapping (address => mapping (address => uint256)) private Allowances;
    mapping (address => bool) private Bots;


    mapping (address => bool) private WalletsExcludedFromFee;
    mapping (address => bool) private WalletsExcludedFromHardCap;
    mapping (address => bool) public AutomatedMarketMakerPairs;

    // Some cool statistics
    uint256 public TotalFee;
    uint256 public TotalSwapped;
    uint256 private TotalTokenBurn;

    // Swap for... nothing...
    bool private InSwap = false;
    bool private SwapEnabled = false;


    // Cool trick to control swap
    modifier swaping {
        InSwap = true;
        _;
        InSwap = false;
    }

    // Distribution based on taxes collected.
    uint256 private MarketingDistributionPct = 50;
    uint256 private DevDistributionPct = 25;
    uint256 private LPDistributionPct = 25;

    uint256 private LiquidityThreshold = 1 * 10 ** Decimals;

    // Tax rates
    struct TaxRates
    {
        uint256 BurnTax;
        uint256 LiquidityTax;
        uint256 MarketingTax;
        uint256 DevelopmentTax;
        uint256 RewardTax;
        string TaxPresetName;
    }

    // Fees, which are amounts calculated based on tax
    struct TransactionFees
    {
        uint256 TransactionFee;
        uint256 BurnFee;
        uint256 DevFee;
        uint256 MarketingFee;
        uint256 LiquidityFee;
        uint256 TransferrableFee;
        uint256 TotalFee;
    }

    TaxRates public BuyingTaxes =
    TaxRates({
    RewardTax: 0,
    BurnTax: 0,
    DevelopmentTax: 33,
    MarketingTax: 33,
    LiquidityTax: 33,
    TaxPresetName: "Buying"
    });

    TaxRates public SellTaxes =
    TaxRates({
    RewardTax: 0,
    BurnTax: 0,
    DevelopmentTax: 33,
    MarketingTax: 33,
    LiquidityTax: 33,
    TaxPresetName: "Selling"
    });

    TaxRates public AppliedRatesPercentage = BuyingTaxes;


    TransactionFees private AccumulatedFeeForDistribution = TransactionFees({
    DevFee: 0,
    MarketingFee: 0,
    LiquidityFee: 0,
    BurnFee:0,
    TransferrableFee: 0,
    TotalFee: 0,
    TransactionFee: 0
    });


    // Events
    event setDevAddress(address indexed previous, address indexed adr);
    event setMktAddress(address indexed previous, address indexed adr);
    event LiquidityAdded(uint256 tokenAmount, uint256 ETHAmount);
    event TreasuryAndDevFeesAdded(uint256 devFee, uint256 treasuryFee);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event BlacklistedUser(address botAddress, bool indexed value);
    event MaxWalletAmountUpdated(uint256 amount);
    event ExcludeFromMaxWallet(address account, bool indexed isExcluded);
    event SwapAndLiquifyEnabledUpdated(bool _enabled);


    constructor(address swap)
    {
        // Discovering Uniswap, where is the unicorn??
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(swap);
        UniswapV2Router = _uniswapV2Router;

        PancakeSwapAddress = IUniswapV2Factory(UniswapV2Router.factory()).createPair(address(this), UniswapV2Router.WETH());

        AutomatedMarketMakerPairs[PancakeSwapAddress] = true;

        // Some nifty configs

        WalletsExcludedFromFee[owner()] = true;
        WalletsExcludedFromFee[address(this)] = true;
        WalletsExcludedFromFee[DevAddress] = true;
        WalletsExcludedFromFee[MarketingAddress] = true;
        WalletsExcludedFromFee[swap] = true;


        WalletsExcludedFromHardCap[owner()] = true;
        WalletsExcludedFromHardCap[address(this)] = true;
        WalletsExcludedFromHardCap[DevAddress] = true;
        WalletsExcludedFromHardCap[MarketingAddress] = true;
        WalletsExcludedFromHardCap[PancakeSwapAddress] = true;
        WalletsExcludedFromHardCap[swap] = true;

        BalancesRefraccionarios[_msgSender()] = ReflactionaryTotal;

        // Approving swap for LP
        _approve(address(this), address(UniswapV2Router), ~uint256(0));

        // Notifying the initial mint
        emit Transfer(address(0x0000000000000000000000000000000000000000), _msgSender(), TotalSupply);
    }

    function ChangeTaxes(uint256 rewardTax, uint256 mktTax, uint256 devTax, uint256 lpTax, bool buying) public onlyOwner
    {
        if(buying)
        {
            BuyingTaxes.RewardTax = rewardTax;
            BuyingTaxes.MarketingTax = mktTax;
            BuyingTaxes.DevelopmentTax = devTax;
            BuyingTaxes.LiquidityTax = lpTax;
        }
        else
        {
            SellTaxes.RewardTax = rewardTax;
            SellTaxes.MarketingTax = mktTax;
            SellTaxes.DevelopmentTax = devTax;
            SellTaxes.LiquidityTax = lpTax;
        }
    }


    function AdjustMaxHardCap(uint256 newHardCap) public onlyOwner
    {
        HardCap = newHardCap;
    }

    function AdjustMaxTxSell(uint256 maxTxSell) public onlyOwner
    {
        HardCapSell = maxTxSell;
    }

    function AdjustMaxTxBuy(uint256 mxTxBuy) public onlyOwner
    {
        HardCapBuy = mxTxBuy;
    }

    function swapTokensForETH(uint256 tokenAmount) private
    {
        // generate the pair path of token
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = UniswapV2Router.WETH();

        // make the swap
        UniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function SwapPct(uint256 pct) public
    {
        uint256 balance = (balanceOf(address(this)) * pct) / 100;

        if(balance > 0)
        {
            uint256 tokensForLP = (balance * LPDistributionPct)/100;
            uint256 tokensForLiquidity = tokensForLP / 2;
            uint256 tokensToSwap = balance - tokensForLiquidity;

            swapTokensForETH(tokensToSwap);
            uint256 contractBalance = address(this).balance;

            uint256 devShare = (contractBalance * DevDistributionPct)/100;
            uint256 mktShare = (contractBalance * MarketingDistributionPct)/100;

            DevAddress.transfer(devShare);
            MarketingAddress.transfer(mktShare);

            uint256 eth = address(this).balance;

            UniswapV2Router.addLiquidityETH{value: address(this).balance}(
                address(this),
                tokensForLiquidity,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                DevAddress,
                block.timestamp
            );


            AccumulatedFeeForDistribution.LiquidityFee = 0;
            AccumulatedFeeForDistribution.DevFee = 0;
            AccumulatedFeeForDistribution.MarketingFee = 0;

            TotalSwapped += tokensForLiquidity;

            emit LiquidityAdded(tokensForLiquidity, eth);
        }
    }

    // Funciones para cambiar las wallets de los VIP
    function ChangeExcludeFromFeeToForWallet(address add, bool isExcluded) public onlyOwner
    {
        WalletsExcludedFromFee[add] = isExcluded;
    }

    function IsWalletExcludedFromFee(address targetAddress) public view returns(bool)
    {
        return WalletsExcludedFromFee[targetAddress];
    }

    function ChangeDevAddress(address payable newDevAddress) public onlyOwner
    {
        address oldAddress = DevAddress;
        emit setDevAddress(oldAddress, newDevAddress);
        ChangeExcludeFromFeeToForWallet(DevAddress, false); // Excluyendo la wallet antigua, que se joda ese cabron
        DevAddress = newDevAddress;
        ChangeExcludeFromFeeToForWallet(DevAddress, true);  // Incluyendo a la nueva
    }

    function ChangeMarketingAddress(address payable marketingAddress) public onlyOwner
    {
        address oldAddress = MarketingAddress;
        emit setMktAddress(oldAddress, marketingAddress);
        ChangeExcludeFromFeeToForWallet(MarketingAddress, false); // Excluyendo la wallet antigua, que se joda ese cabron
        MarketingAddress = marketingAddress;
        ChangeExcludeFromFeeToForWallet(MarketingAddress, true);  // Incluyendo a la nueva
    }


    function totalSupply() public view override returns (uint256)
    {
        return TotalSupply;
    }

    function decimals() public pure returns (uint8)
    {
        return Decimals;
    }

    function symbol() public pure returns (string memory)
    {
        return Symbol;
    }


    function name() public pure returns (string memory)
    {
        return Name;
    }

    function getOwner() external view returns (address)
    {
        return owner();
    }


    function totalBurn() public view returns (uint256)
    {
        return TotalTokenBurn;
    }

    function balanceOf(address account) public view override returns (uint256)
    {
        return tokenFromReflection(BalancesRefraccionarios[account]);
    }

    function allowance(address owner, address spender) public view override returns (uint256)
    {
        return Allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool)
    {
        uint256 currentAllowance = allowance(sender,_msgSender());
        require(currentAllowance >= amount, "BEP20: transfer amount exceeds allowance");
        _transfer(sender, recipient, amount);

    unchecked
    {
        _approve(sender, _msgSender(), currentAllowance - amount);
    }

        return true;
    }

    // Funciones para modificar  las lista de wallets
    // Funcion para banear a una wallet de usar el contrato (a.k.a decir que es un bot/apestao)
    // Esto lo tiene 100million
    function MarkBot(address targetAddress, bool isBot) public onlyOwner
    {
        Bots[targetAddress] = isBot;
        emit BlacklistedUser(targetAddress, isBot);
    }

    function IsBot(address targetAddress) public view returns(bool)
    {
        return Bots[targetAddress];
    }

    function ChangeExclusionFromHardCap(address targetAddress, bool isExcluded) public onlyOwner
    {
        WalletsExcludedFromHardCap[targetAddress] = isExcluded;
        emit ExcludeFromMaxWallet(targetAddress, isExcluded);
    }

    function IsExcludedFromHardCap(address targetAddress) public view returns(bool)
    {
        return WalletsExcludedFromHardCap[targetAddress];
    }

    // Funcion para setear una address para que pueda hacer tradeo automatico
    function setAutomatedMarketMakerPair(address _pair, bool value) external onlyOwner
    {
        require( AutomatedMarketMakerPairs[_pair] != value,"Automated market maker pair is already set to that value");
        AutomatedMarketMakerPairs[_pair] = value;
        ChangeExclusionFromHardCap(_pair, value);
        emit SetAutomatedMarketMakerPair(_pair, value);
    }

    // Funciones para manipular el allowance
    function _approve(address owner, address spender, uint256 amount) private
    {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        Allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool)
    {
        _approve(_msgSender(), spender, Allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool)
    {
        uint256 currentAllowance = Allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked
    {
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
    }

        return true;
    }


    // Funciones de transferencia
    function _transfer(address from, address to, uint256 amount) private
    {
        if (liqAddedBlockNumber == 0 && AutomatedMarketMakerPairs[to])
        {
            liqAddedBlockNumber = block.number;
        }

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!IsBot(from), "ERC20: address blacklisted (bot)");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(from), "You are trying to transfer more than your balance");

        bool takeFee =  !(IsWalletExcludedFromFee(from) || IsWalletExcludedFromFee(to));

        if (takeFee)
        {
            // Hello stranger, what are you buying?
            if (AutomatedMarketMakerPairs[from])
            {
                // Not so fast ma boi
                if (block.number < liqAddedBlockNumber + blocksToWait)
                {
                    MarkBot(to, true);
                }

                // Si, el origen es el address de la transaccion, estamos sacando tokens del pool. Aplicamos el hard cap de compra
                AppliedRatesPercentage = BuyingTaxes;
                require(amount <= HardCapBuy, "amount must be <= maxTxAmountBuy" );
            }
            // What are you sellin'?
            else
            {
                // Si, la transferencia la inicia un address que no es de trading, aplicamos rates de venta (o transferencia entre peers)
                AppliedRatesPercentage = SellTaxes;
                require(amount <= HardCapSell,"amount must be <= maxTxAmountSell");
            }
        }

        // Repartir lo que ya hay si no estamos interactuando con el pair
        if (
            !InSwap &&
            !AutomatedMarketMakerPairs[from] &&
            SwapEnabled &&
            from != owner() && 
            to != owner() &&
            from != address(UniswapV2Router)
        ) {
            //add liquidity
            swapAndLiquify();
        }

        _tokenTransfer(from, to, amount, takeFee);
    }

    // This method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 cantidadBruta, bool takeFee) private
    {

        (uint256 cantidadNeta,
        uint256 cantidadBrutaRefracionaria,
        uint256 cantidadNetaRefracionaria,
        TransactionFees memory feesReales,
        TransactionFees memory feesRefracionarios) = GenerarFeesYCantidadesATransferir(cantidadBruta, takeFee);

        // Comprobando que el receptor de la transferencia no supere el hard cap de tokens
        require(WalletsExcludedFromHardCap[recipient] ||
            (balanceOf(recipient) + cantidadNeta) <= HardCap,
            "Recipient cannot hold more than maxWalletAmount");

        // Se siguen actualizando los valore reflaccionarios en caso de que las wallets
        // sean reincluidas en las recompensas de nuevo
        BalancesRefraccionarios[sender] -= cantidadBrutaRefracionaria;
        BalancesRefraccionarios[recipient] += cantidadNetaRefracionaria;

        if (takeFee)
        {

            ReflactionaryTotal -= feesRefracionarios.TransactionFee;
            TotalFee += feesReales.TransactionFee;

            AccumulateFee(feesReales, feesRefracionarios);
            // Quemando tokens
            TotalTokenBurn += feesReales.BurnFee;
            BalancesRefraccionarios[BurnAddress] += feesRefracionarios.BurnFee;

            // Emitiendo enventos para reflejar las acciones realizadas
            emit Transfer(address(this), BurnAddress, feesReales.BurnFee);
            emit Transfer(sender, address(this), feesReales.TransferrableFee);
        }
       
        emit Transfer(sender, recipient, cantidadNeta);
    }

    function GenerarFeesYCantidadesATransferir(uint256 cantidadBruta, bool aplicarImpuestos) private view returns(
        uint256 cantidadNeta,
        uint256 cantidadBrutaRefracionaria,
        uint256 cantidadNetaRefracionaria,
        TransactionFees memory feesReales,
        TransactionFees memory feesRefracionarios)
    {
        (feesReales, feesRefracionarios) = CalcularTasasRealesYRefracionarias(cantidadBruta, aplicarImpuestos);
        cantidadNeta = cantidadBruta - feesReales.TotalFee;
        cantidadBrutaRefracionaria =  cantidadBruta * GetConversionRate();
        cantidadNetaRefracionaria = cantidadBrutaRefracionaria - feesRefracionarios.TotalFee;
    }


    function CalcularTasasRealesYRefracionarias(uint256 cantidadBruta, bool takeFee) private view returns (TransactionFees memory realFees, TransactionFees memory refractionaryFees)
    {
        if (takeFee)
        {
            uint256 currentRate = GetConversionRate();

            // Caluclando las tasas
            realFees.TransactionFee = (cantidadBruta * AppliedRatesPercentage.RewardTax) / 100;
            realFees.BurnFee =  (cantidadBruta * AppliedRatesPercentage.BurnTax) / 100;
            realFees.DevFee =  (cantidadBruta * AppliedRatesPercentage.DevelopmentTax) / 100;
            realFees.MarketingFee =  (cantidadBruta * AppliedRatesPercentage.MarketingTax) / 100;
            realFees.LiquidityFee =  (cantidadBruta * AppliedRatesPercentage.LiquidityTax) / 100;

            // Sumando las tasas y agrupando entre las que se van al contrato y las que no
            realFees.TransferrableFee = realFees.DevFee + realFees.MarketingFee + realFees.LiquidityFee;
            realFees.TotalFee = realFees.TransactionFee + realFees.BurnFee + realFees.TransferrableFee;

            refractionaryFees.TransactionFee = realFees.TransactionFee * currentRate;
            refractionaryFees.BurnFee =  realFees.BurnFee * currentRate;
            refractionaryFees.DevFee =   realFees.DevFee * currentRate;
            refractionaryFees.MarketingFee = realFees.MarketingFee * currentRate;
            refractionaryFees.LiquidityFee = realFees.LiquidityFee * currentRate;

            refractionaryFees.TotalFee = realFees.TotalFee * currentRate;
            refractionaryFees.TransferrableFee = realFees.TransferrableFee * currentRate;
        }
    }

    function AccumulateFee(TransactionFees memory realFees, TransactionFees memory refractionaryFees) private
    {
        BalancesRefraccionarios[address(this)] += refractionaryFees.TransferrableFee;

        AccumulatedFeeForDistribution.LiquidityFee += realFees.LiquidityFee;

        AccumulatedFeeForDistribution.DevFee += realFees.DevFee;

        AccumulatedFeeForDistribution.MarketingFee += realFees.MarketingFee;

    }



    function swapAndLiquify() private swaping
    {
        // Swapping the rest of the fees
        if(balanceOf(address(this)) > 0)
        {
            uint256 tokensToSwap = AccumulatedFeeForDistribution.LiquidityFee / 2;
            uint256 tokensForLiquidity = AccumulatedFeeForDistribution.LiquidityFee - tokensToSwap;

            swapTokensForETH(AccumulatedFeeForDistribution.DevFee + AccumulatedFeeForDistribution.MarketingFee + tokensToSwap);

            uint256 contractBalance = address(this).balance;
            uint256 devShare = (contractBalance* DevDistributionPct)/100;
            uint256 mktShare = (contractBalance * MarketingDistributionPct)/100;

            DevAddress.transfer(devShare);
            MarketingAddress.transfer(mktShare);

            uint256 eth = address(this).balance;

            UniswapV2Router.addLiquidityETH{value: address(this).balance}(
                address(this),
                tokensForLiquidity,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                DevAddress,
                block.timestamp
            );

            AccumulatedFeeForDistribution.LiquidityFee = 0;
            AccumulatedFeeForDistribution.DevFee = 0;
            AccumulatedFeeForDistribution.MarketingFee = 0;

            TotalSwapped += tokensForLiquidity;


            emit LiquidityAdded(tokensForLiquidity, eth);
        }
    }

    function tokenFromReflection(uint256 reflactionaryAmount) public view returns (uint256)
    {
        require(reflactionaryAmount <= ReflactionaryTotal,"Amount must be less than total reflections");
        return reflactionaryAmount / GetConversionRate();
    }

    function GetConversionRate() private view returns (uint256)
    {
        return ReflactionaryTotal / totalSupply();
    }

    // Funciones para modificar cositas del swap
    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner
    {
        SwapEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }


    // Esto es para poder recibir cosas de pancake swap
    receive() external payable {}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"swap","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"botAddress","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"BlacklistedUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ETHAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxWalletAmountUpdated","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"devFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"TreasuryAndDevFeesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"adr","type":"address"}],"name":"setDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"adr","type":"address"}],"name":"setMktAddress","type":"event"},{"inputs":[{"internalType":"uint256","name":"newHardCap","type":"uint256"}],"name":"AdjustMaxHardCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mxTxBuy","type":"uint256"}],"name":"AdjustMaxTxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxSell","type":"uint256"}],"name":"AdjustMaxTxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AppliedRatesPercentage","outputs":[{"internalType":"uint256","name":"BurnTax","type":"uint256"},{"internalType":"uint256","name":"LiquidityTax","type":"uint256"},{"internalType":"uint256","name":"MarketingTax","type":"uint256"},{"internalType":"uint256","name":"DevelopmentTax","type":"uint256"},{"internalType":"uint256","name":"RewardTax","type":"uint256"},{"internalType":"string","name":"TaxPresetName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"AutomatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyingTaxes","outputs":[{"internalType":"uint256","name":"BurnTax","type":"uint256"},{"internalType":"uint256","name":"LiquidityTax","type":"uint256"},{"internalType":"uint256","name":"MarketingTax","type":"uint256"},{"internalType":"uint256","name":"DevelopmentTax","type":"uint256"},{"internalType":"uint256","name":"RewardTax","type":"uint256"},{"internalType":"string","name":"TaxPresetName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevAddress","type":"address"}],"name":"ChangeDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ChangeExcludeFromFeeToForWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ChangeExclusionFromHardCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketingAddress","type":"address"}],"name":"ChangeMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardTax","type":"uint256"},{"internalType":"uint256","name":"mktTax","type":"uint256"},{"internalType":"uint256","name":"devTax","type":"uint256"},{"internalType":"uint256","name":"lpTax","type":"uint256"},{"internalType":"bool","name":"buying","type":"bool"}],"name":"ChangeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"IsBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"IsExcludedFromHardCap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"IsWalletExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"bool","name":"isBot","type":"bool"}],"name":"MarkBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PancakeSwapAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellTaxes","outputs":[{"internalType":"uint256","name":"BurnTax","type":"uint256"},{"internalType":"uint256","name":"LiquidityTax","type":"uint256"},{"internalType":"uint256","name":"MarketingTax","type":"uint256"},{"internalType":"uint256","name":"DevelopmentTax","type":"uint256"},{"internalType":"uint256","name":"RewardTax","type":"uint256"},{"internalType":"string","name":"TaxPresetName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"}],"name":"SwapPct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalSwapped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksToWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liqAddedBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflactionaryAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526012600a6200001491906200128e565b6305f5e100620000259190620012df565b6001556001546000196200003a91906200136f565b600019620000499190620013a7565b600255600060065573d660145c3092100d9dd83ece6c0449d992c8df6e600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e175d48089df657c392bcf50acf32e8cae62cbd7600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060216001546200014f9190620013e2565b600a55600a54600b55600a54600c556000601760006101000a81548160ff0219169083151502179055506000601760016101000a81548160ff0219169083151502179055506032601855601980556019601a556012600a620001b291906200128e565b6001620001c09190620012df565b601b556040518060c0016040528060008152602001602181526020016021815260200160218152602001600081526020016040518060400160405280600681526020017f427579696e670000000000000000000000000000000000000000000000000000815250815250601c600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050190805190602001906200027c92919062000fac565b5050506040518060c0016040528060008152602001602181526020016021815260200160218152602001600081526020016040518060400160405280600781526020017f53656c6c696e67000000000000000000000000000000000000000000000000008152508152506022600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050190805190602001906200033892919062000fac565b505050601c602860008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401556005820181600501908054620003879062001449565b620003949291906200103d565b5050506040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815250602e600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550503480156200042857600080fd5b5060405162005b9d38038062005b9d83398181016040528101906200044e9190620014e9565b6200046e6200046262000ce460201b60201c565b62000cec60201b60201c565b600081905080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200051d57600080fd5b505afa15801562000532573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005589190620014e9565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620005dd57600080fd5b505afa158015620005f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006189190620014e9565b6040518363ffffffff1660e01b8152600401620006379291906200152c565b602060405180830381600087803b1580156200065257600080fd5b505af115801562000667573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200068d9190620014e9565b600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160136000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160006200075d62000db060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260006200096862000db060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600254600d600062000bee62000ce460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062000c6330600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660001962000dd960201b60201c565b62000c7362000ce460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60015460405162000cd491906200156a565b60405180910390a35050620016c8565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000e4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e43906200160e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000eb690620016a6565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000f9f91906200156a565b60405180910390a3505050565b82805462000fba9062001449565b90600052602060002090601f01602090048101928262000fde57600085556200102a565b82601f1062000ff957805160ff19168380011785556200102a565b828001600101855582156200102a579182015b82811115620010295782518255916020019190600101906200100c565b5b509050620010399190620010d5565b5090565b8280546200104b9062001449565b90600052602060002090601f0160209004810192826200106f5760008555620010c2565b82601f10620010825780548555620010c2565b82800160010185558215620010c257600052602060002091601f016020900482015b82811115620010c1578254825591600101919060010190620010a4565b5b509050620010d19190620010d5565b5090565b5b80821115620010f0576000816000905550600101620010d6565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562001182578086048111156200115a5762001159620010f4565b5b60018516156200116a5780820291505b80810290506200117a8562001123565b94506200113a565b94509492505050565b6000826200119d576001905062001270565b81620011ad576000905062001270565b8160018114620011c65760028114620011d15762001207565b600191505062001270565b60ff841115620011e657620011e5620010f4565b5b8360020a9150848211156200120057620011ff620010f4565b5b5062001270565b5060208310610133831016604e8410600b8410161715620012415782820a9050838111156200123b576200123a620010f4565b5b62001270565b62001250848484600162001130565b925090508184048111156200126a5762001269620010f4565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b60006200129b8262001277565b9150620012a88362001281565b9250620012d77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200118b565b905092915050565b6000620012ec8262001277565b9150620012f98362001277565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620013355762001334620010f4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200137c8262001277565b9150620013898362001277565b9250826200139c576200139b62001340565b5b828206905092915050565b6000620013b48262001277565b9150620013c18362001277565b925082821015620013d757620013d6620010f4565b5b828203905092915050565b6000620013ef8262001277565b9150620013fc8362001277565b9250826200140f576200140e62001340565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200146257607f821691505b602082108114156200147957620014786200141a565b5b50919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620014b18262001484565b9050919050565b620014c381620014a4565b8114620014cf57600080fd5b50565b600081519050620014e381620014b8565b92915050565b6000602082840312156200150257620015016200147f565b5b60006200151284828501620014d2565b91505092915050565b6200152681620014a4565b82525050565b60006040820190506200154360008301856200151b565b6200155260208301846200151b565b9392505050565b620015648162001277565b82525050565b600060208201905062001581600083018462001559565b92915050565b600082825260208201905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000620015f660248362001587565b9150620016038262001598565b604082019050919050565b600060208201905081810360008301526200162981620015e7565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200168e60228362001587565b91506200169b8262001630565b604082019050919050565b60006020820190508181036000830152620016c1816200167f565b9050919050565b6144c580620016d86000396000f3fe6080604052600436106102545760003560e01c8063893d20e811610139578063c5927207116100b6578063dd62ed3e1161007a578063dd62ed3e146108fb578063df2abc2414610938578063f2bc6ea414610961578063f2fde38b14610991578063fc962edb146109ba578063fdca8605146109ea5761025b565b8063c592720714610802578063c84dc0481461083f578063d43ad1e914610868578063d7c0991514610893578063d8dcac4f146108d05761025b565b80639a7a23d6116100fd5780639a7a23d614610706578063a457c2d71461072f578063a9059cbb1461076c578063a9c21468146107a9578063c49b9a80146107d95761025b565b8063893d20e8146106315780638a0eef5a1461065c5780638da5cb5b1461068757806395d89b41146106b257806399ec86fe146106dd5761025b565b8063313ce567116101d25780634f7addbc116101965780634f7addbc146105255780635a0b1a6d1461056257806368dc04c31461058b5780636a9e1458146105b457806370a08231146105dd578063715018a61461061a5761025b565b8063313ce5671461043e57806331df899a1461046957806339509351146104925780633c9f861d146104cf5780634d3314f4146104fa5761025b565b806313afbca71161021957806313afbca71461034757806318160ddd146103705780631850e44f1461039b57806323b872dd146103c45780632d838119146104015761025b565b8062470d3a14610260578063055add0d1461028b57806306fdde03146102b6578063095ea7b3146102e15780630a4ea2021461031e5761025b565b3661025b57005b600080fd5b34801561026c57600080fd5b50610275610a27565b60405161028291906131a5565b60405180910390f35b34801561029757600080fd5b506102a0610a4d565b6040516102ad919061321f565b60405180910390f35b3480156102c257600080fd5b506102cb610a73565b6040516102d891906132d3565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061335c565b610ab0565b60405161031591906133b7565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613410565b610ace565b005b34801561035357600080fd5b5061036e60048036038101906103699190613469565b610bf6565b005b34801561037c57600080fd5b50610385610c93565b60405161039291906134b8565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613469565b610c9d565b005b3480156103d057600080fd5b506103eb60048036038101906103e691906134d3565b610d00565b6040516103f891906133b7565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190613526565b610d84565b60405161043591906134b8565b60405180910390f35b34801561044a57600080fd5b50610453610de5565b604051610460919061356f565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b919061358a565b610dee565b005b34801561049e57600080fd5b506104b960048036038101906104b4919061335c565b610e59565b6040516104c691906133b7565b60405180910390f35b3480156104db57600080fd5b506104e4610f05565b6040516104f191906134b8565b60405180910390f35b34801561050657600080fd5b5061050f610f0f565b60405161051c91906134b8565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613605565b610f15565b60405161055991906133b7565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190613526565b610f6b565b005b34801561059757600080fd5b506105b260048036038101906105ad9190613526565b610f7d565b005b3480156105c057600080fd5b506105db60048036038101906105d69190613526565b611267565b005b3480156105e957600080fd5b5061060460048036038101906105ff9190613605565b611279565b60405161061191906134b8565b60405180910390f35b34801561062657600080fd5b5061062f6112ca565b005b34801561063d57600080fd5b506106466112de565b60405161065391906131a5565b60405180910390f35b34801561066857600080fd5b506106716112ed565b60405161067e91906134b8565b60405180910390f35b34801561069357600080fd5b5061069c6112f3565b6040516106a991906131a5565b60405180910390f35b3480156106be57600080fd5b506106c761131c565b6040516106d491906132d3565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613410565b611359565b005b34801561071257600080fd5b5061072d60048036038101906107289190613469565b611481565b005b34801561073b57600080fd5b506107566004803603810190610751919061335c565b6115c7565b60405161076391906133b7565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e919061335c565b6116b2565b6040516107a091906133b7565b60405180910390f35b3480156107b557600080fd5b506107be6116d0565b6040516107d096959493929190613632565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb919061369a565b611782565b005b34801561080e57600080fd5b5061082960048036038101906108249190613605565b6117de565b60405161083691906133b7565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190613526565b6117fe565b005b34801561087457600080fd5b5061087d611810565b60405161088a91906134b8565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613605565b611816565b6040516108c791906133b7565b60405180910390f35b3480156108dc57600080fd5b506108e561186c565b6040516108f291906134b8565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d91906136c7565b611872565b60405161092f91906134b8565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613469565b6118f9565b005b34801561096d57600080fd5b50610976611996565b60405161098896959493929190613632565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b39190613605565b611a48565b005b3480156109c657600080fd5b506109cf611acc565b6040516109e196959493929190613632565b60405180910390f35b3480156109f657600080fd5b50610a116004803603810190610a0c9190613605565b611b7e565b604051610a1e91906133b7565b60405180910390f35b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280601081526020017f50726f6f66204f66204e6f7468696e6700000000000000000000000000000000815250905090565b6000610ac4610abd611bd4565b8484611bdc565b6001905092915050565b610ad6611da7565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f0f9ab6c7b3a29f5eca7cf80f42ea6b1262432064b221200268394c9a5e63569f60405160405180910390a3610b84600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610c9d565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bf2600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610c9d565b5050565b610bfe611da7565b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015157f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b283604051610c8791906131a5565b60405180910390a25050565b6000600154905090565b610ca5611da7565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080610d1485610d0f611bd4565b611872565b905082811015610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090613779565b60405180910390fd5b610d64858585611e25565b610d7885610d70611bd4565b858403611bdc565b60019150509392505050565b6000600254821115610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc29061380b565b60405180910390fd5b610dd3612397565b82610dde9190613889565b9050919050565b60006012905090565b610df6611da7565b8015610e295784601c6004018190555083601c6002018190555082601c6003018190555081601c60010181905550610e52565b846022600401819055508360226002018190555082602260030181905550816022600101819055505b5050505050565b6000610efb610e66611bd4565b8484600f6000610e74611bd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef691906138ba565b611bdc565b6001905092915050565b6000601654905090565b60145481565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f73611da7565b80600c8190555050565b6000606482610f8b30611279565b610f959190613910565b610f9f9190613889565b905060008111156112635760006064601a5483610fbc9190613910565b610fc69190613889565b90506000600282610fd79190613889565b905060008184610fe7919061396a565b9050610ff2816123b3565b600047905060006064601954836110099190613910565b6110139190613889565b905060006064601854846110279190613910565b6110319190613889565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561109b573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611104573d6000803e3d6000fd5b506000479050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473089600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401611193969594939291906139fa565b6060604051808303818588803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111e59190613a70565b5050506000602e600401819055506000602e600201819055506000602e60030181905550856015600082825461121b91906138ba565b925050819055507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b8682604051611253929190613ac3565b60405180910390a1505050505050505b5050565b61126f611da7565b80600b8190555050565b60006112c3600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d84565b9050919050565b6112d2611da7565b6112dc60006125d8565b565b60006112e86112f3565b905090565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f504f4e0000000000000000000000000000000000000000000000000000000000815250905090565b611361611da7565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f194c6407864834414a3adaa18aab4cb81b733d5986a0c3b1e0fc9a8bccc0c0fb60405160405180910390a361140f600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610c9d565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061147d600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610c9d565b5050565b611489611da7565b801515601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390613b5e565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061157d8282610bf6565b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600080600f60006115d6611bd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90613bf0565b60405180910390fd5b6116a761169e611bd4565b85858403611bdc565b600191505092915050565b60006116c66116bf611bd4565b8484611e25565b6001905092915050565b60288060000154908060010154908060020154908060030154908060040154908060050180546116ff90613c3f565b80601f016020809104026020016040519081016040528092919081815260200182805461172b90613c3f565b80156117785780601f1061174d57610100808354040283529160200191611778565b820191906000526020600020905b81548152906001019060200180831161175b57829003601f168201915b5050505050905086565b61178a611da7565b80601760016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516117d391906133b7565b60405180910390a150565b60136020528060005260406000206000915054906101000a900460ff1681565b611806611da7565b80600a8190555050565b60155481565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60065481565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611901611da7565b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015157f3159dadbd8e2d720a851b412e3358e7e44bb11734c9bfd5715340e21798e8b258360405161198a91906131a5565b60405180910390a25050565b601c8060000154908060010154908060020154908060030154908060040154908060050180546119c590613c3f565b80601f01602080910402602001604051908101604052809291908181526020018280546119f190613c3f565b8015611a3e5780601f10611a1357610100808354040283529160200191611a3e565b820191906000526020600020905b815481529060010190602001808311611a2157829003601f168201915b5050505050905086565b611a50611da7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab790613ce3565b60405180910390fd5b611ac9816125d8565b50565b6022806000015490806001015490806002015490806003015490806004015490806005018054611afb90613c3f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2790613c3f565b8015611b745780601f10611b4957610100808354040283529160200191611b74565b820191906000526020600020905b815481529060010190602001808311611b5757829003601f168201915b5050505050905086565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4390613d75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390613e07565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d9a91906134b8565b60405180910390a3505050565b611daf611bd4565b73ffffffffffffffffffffffffffffffffffffffff16611dcd6112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1a90613e73565b60405180910390fd5b565b6000600554148015611e805750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611e8d57436005819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613f05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6490613f97565b60405180910390fd5b611f7683611816565b15611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad90614003565b60405180910390fd5b60008111611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090614095565b60405180910390fd5b61200283611279565b811115612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614127565b60405180910390fd5b600061204f84611b7e565b8061205f575061205e83611b7e565b5b159050801561222057601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612180576006546005546120ca91906138ba565b4310156120dd576120dc8360016118f9565b5b601c60286000820154816000015560018201548160010155600282015481600201556003820154816003015560048201548160040155600582018160050190805461212790613c3f565b61213292919061307d565b50905050600b5482111561217b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217290614193565b60405180910390fd5b61221f565b60226028600082015481600001556001820154816001015560028201548160020155600382015481600301556004820154816004015560058201816005019080546121ca90613c3f565b6121d592919061307d565b50905050600c5482111561221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590614225565b60405180910390fd5b5b5b601760009054906101000a900460ff161580156122875750601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561229f5750601760019054906101000a900460ff165b80156122de57506122ae6112f3565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561231d57506122ed6112f3565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156123775750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156123855761238461269c565b5b612391848484846129a9565b50505050565b60006123a1610c93565b6002546123ae9190613889565b905090565b6000600267ffffffffffffffff8111156123d0576123cf614245565b5b6040519080825280602002602001820160405280156123fe5781602001602082028036833780820191505090505b509050308160008151811061241657612415614274565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156124b857600080fd5b505afa1580156124cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f091906142b8565b8160018151811061250457612503614274565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016125a29594939291906143a3565b600060405180830381600087803b1580156125bc57600080fd5b505af11580156125d0573d6000803e3d6000fd5b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601760006101000a81548160ff02191690831515021790555060006126c230611279565b111561298c5760006002602e600401546126dc9190613889565b9050600081602e600401546126f1919061396a565b905061271c82602e60030154602e6002015461270d91906138ba565b61271791906138ba565b6123b3565b600047905060006064601954836127339190613910565b61273d9190613889565b905060006064601854846127519190613910565b61275b9190613889565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156127c5573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561282e573d6000803e3d6000fd5b506000479050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473088600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016128bd969594939291906139fa565b6060604051808303818588803b1580156128d657600080fd5b505af11580156128ea573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061290f9190613a70565b5050506000602e600401819055506000602e600201819055506000602e60030181905550846015600082825461294591906138ba565b925050819055507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b858260405161297d929190613ac3565b60405180910390a15050505050505b6000601760006101000a81548160ff021916908315150217905550565b60008060008060006129bb8787612d65565b94509450945094509450601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a325750600a5485612a258a611279565b612a2f91906138ba565b11155b612a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a689061446f565b60405180910390fd5b83600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac0919061396a565b9250508190555082600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b1691906138ba565b925050819055508515612cf557806000015160026000828254612b39919061396a565b92505081905550816000015160146000828254612b5691906138ba565b92505081905550612b678282612dcf565b816020015160166000828254612b7d91906138ba565b925050819055508060200151600d6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf991906138ba565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460200151604051612c8391906134b8565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460a00151604051612cec91906134b8565b60405180910390a35b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612d5291906134b8565b60405180910390a3505050505050505050565b6000806000612d7261310a565b612d7a61310a565b612d848787612e8d565b80925081935050508160c0015187612d9c919061396a565b9450612da6612397565b87612db19190613910565b93508060c0015184612dc3919061396a565b92509295509295909350565b8060a00151600d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2291906138ba565b925050819055508160800151602e6004016000828254612e4291906138ba565b925050819055508160400151602e6002016000828254612e6291906138ba565b925050819055508160600151602e6003016000828254612e8291906138ba565b925050819055505050565b612e9561310a565b612e9d61310a565b8215613076576000612ead612397565b9050606460286004015486612ec29190613910565b612ecc9190613889565b836000018181525050606460286000015486612ee89190613910565b612ef29190613889565b836020018181525050606460286003015486612f0e9190613910565b612f189190613889565b836040018181525050606460286002015486612f349190613910565b612f3e9190613889565b836060018181525050606460286001015486612f5a9190613910565b612f649190613889565b836080018181525050826080015183606001518460400151612f8691906138ba565b612f9091906138ba565b8360a00181815250508260a0015183602001518460000151612fb291906138ba565b612fbc91906138ba565b8360c0018181525050808360000151612fd59190613910565b826000018181525050808360200151612fee9190613910565b8260200181815250508083604001516130079190613910565b8260400181815250508083606001516130209190613910565b8260600181815250508083608001516130399190613910565b826080018181525050808360c001516130529190613910565b8260c0018181525050808360a0015161306b9190613910565b8260a0018181525050505b9250929050565b82805461308990613c3f565b90600052602060002090601f0160209004810192826130ab57600085556130f9565b82601f106130bc57805485556130f9565b828001600101855582156130f957600052602060002091601f016020900482015b828111156130f85782548255916001019190600101906130dd565b5b5090506131069190613147565b5090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613160576000816000905550600101613148565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318f82613164565b9050919050565b61319f81613184565b82525050565b60006020820190506131ba6000830184613196565b92915050565b6000819050919050565b60006131e56131e06131db84613164565b6131c0565b613164565b9050919050565b60006131f7826131ca565b9050919050565b6000613209826131ec565b9050919050565b613219816131fe565b82525050565b60006020820190506132346000830184613210565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613274578082015181840152602081019050613259565b83811115613283576000848401525b50505050565b6000601f19601f8301169050919050565b60006132a58261323a565b6132af8185613245565b93506132bf818560208601613256565b6132c881613289565b840191505092915050565b600060208201905081810360008301526132ed818461329a565b905092915050565b600080fd5b61330381613184565b811461330e57600080fd5b50565b600081359050613320816132fa565b92915050565b6000819050919050565b61333981613326565b811461334457600080fd5b50565b60008135905061335681613330565b92915050565b60008060408385031215613373576133726132f5565b5b600061338185828601613311565b925050602061339285828601613347565b9150509250929050565b60008115159050919050565b6133b18161339c565b82525050565b60006020820190506133cc60008301846133a8565b92915050565b60006133dd82613164565b9050919050565b6133ed816133d2565b81146133f857600080fd5b50565b60008135905061340a816133e4565b92915050565b600060208284031215613426576134256132f5565b5b6000613434848285016133fb565b91505092915050565b6134468161339c565b811461345157600080fd5b50565b6000813590506134638161343d565b92915050565b600080604083850312156134805761347f6132f5565b5b600061348e85828601613311565b925050602061349f85828601613454565b9150509250929050565b6134b281613326565b82525050565b60006020820190506134cd60008301846134a9565b92915050565b6000806000606084860312156134ec576134eb6132f5565b5b60006134fa86828701613311565b935050602061350b86828701613311565b925050604061351c86828701613347565b9150509250925092565b60006020828403121561353c5761353b6132f5565b5b600061354a84828501613347565b91505092915050565b600060ff82169050919050565b61356981613553565b82525050565b60006020820190506135846000830184613560565b92915050565b600080600080600060a086880312156135a6576135a56132f5565b5b60006135b488828901613347565b95505060206135c588828901613347565b94505060406135d688828901613347565b93505060606135e788828901613347565b92505060806135f888828901613454565b9150509295509295909350565b60006020828403121561361b5761361a6132f5565b5b600061362984828501613311565b91505092915050565b600060c08201905061364760008301896134a9565b61365460208301886134a9565b61366160408301876134a9565b61366e60608301866134a9565b61367b60808301856134a9565b81810360a083015261368d818461329a565b9050979650505050505050565b6000602082840312156136b0576136af6132f5565b5b60006136be84828501613454565b91505092915050565b600080604083850312156136de576136dd6132f5565b5b60006136ec85828601613311565b92505060206136fd85828601613311565b9150509250929050565b7f42455032303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613763602883613245565b915061376e82613707565b604082019050919050565b6000602082019050818103600083015261379281613756565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b60006137f5602a83613245565b915061380082613799565b604082019050919050565b60006020820190508181036000830152613824816137e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061389482613326565b915061389f83613326565b9250826138af576138ae61382b565b5b828204905092915050565b60006138c582613326565b91506138d083613326565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139055761390461385a565b5b828201905092915050565b600061391b82613326565b915061392683613326565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561395f5761395e61385a565b5b828202905092915050565b600061397582613326565b915061398083613326565b9250828210156139935761399261385a565b5b828203905092915050565b6000819050919050565b60006139c36139be6139b98461399e565b6131c0565b613326565b9050919050565b6139d3816139a8565b82525050565b60006139e4826131ec565b9050919050565b6139f4816139d9565b82525050565b600060c082019050613a0f6000830189613196565b613a1c60208301886134a9565b613a2960408301876139ca565b613a3660608301866139ca565b613a4360808301856139eb565b613a5060a08301846134a9565b979650505050505050565b600081519050613a6a81613330565b92915050565b600080600060608486031215613a8957613a886132f5565b5b6000613a9786828701613a5b565b9350506020613aa886828701613a5b565b9250506040613ab986828701613a5b565b9150509250925092565b6000604082019050613ad860008301856134a9565b613ae560208301846134a9565b9392505050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000613b48603883613245565b9150613b5382613aec565b604082019050919050565b60006020820190508181036000830152613b7781613b3b565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613bda602583613245565b9150613be582613b7e565b604082019050919050565b60006020820190508181036000830152613c0981613bcd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c5757607f821691505b60208210811415613c6b57613c6a613c10565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ccd602683613245565b9150613cd882613c71565b604082019050919050565b60006020820190508181036000830152613cfc81613cc0565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d5f602483613245565b9150613d6a82613d03565b604082019050919050565b60006020820190508181036000830152613d8e81613d52565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613df1602283613245565b9150613dfc82613d95565b604082019050919050565b60006020820190508181036000830152613e2081613de4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e5d602083613245565b9150613e6882613e27565b602082019050919050565b60006020820190508181036000830152613e8c81613e50565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613eef602583613245565b9150613efa82613e93565b604082019050919050565b60006020820190508181036000830152613f1e81613ee2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f81602383613245565b9150613f8c82613f25565b604082019050919050565b60006020820190508181036000830152613fb081613f74565b9050919050565b7f45524332303a206164647265737320626c61636b6c69737465642028626f7429600082015250565b6000613fed602083613245565b9150613ff882613fb7565b602082019050919050565b6000602082019050818103600083015261401c81613fe0565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061407f602983613245565b915061408a82614023565b604082019050919050565b600060208201905081810360008301526140ae81614072565b9050919050565b7f596f752061726520747279696e6720746f207472616e73666572206d6f72652060008201527f7468616e20796f75722062616c616e6365000000000000000000000000000000602082015250565b6000614111603183613245565b915061411c826140b5565b604082019050919050565b6000602082019050818103600083015261414081614104565b9050919050565b7f616d6f756e74206d757374206265203c3d206d61785478416d6f756e74427579600082015250565b600061417d602083613245565b915061418882614147565b602082019050919050565b600060208201905081810360008301526141ac81614170565b9050919050565b7f616d6f756e74206d757374206265203c3d206d61785478416d6f756e7453656c60008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b600061420f602183613245565b915061421a826141b3565b604082019050919050565b6000602082019050818103600083015261423e81614202565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506142b2816132fa565b92915050565b6000602082840312156142ce576142cd6132f5565b5b60006142dc848285016142a3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61431a81613184565b82525050565b600061432c8383614311565b60208301905092915050565b6000602082019050919050565b6000614350826142e5565b61435a81856142f0565b935061436583614301565b8060005b8381101561439657815161437d8882614320565b975061438883614338565b925050600181019050614369565b5085935050505092915050565b600060a0820190506143b860008301886134a9565b6143c560208301876139ca565b81810360408301526143d78186614345565b90506143e66060830185613196565b6143f360808301846134a9565b9695505050505050565b7f526563697069656e742063616e6e6f7420686f6c64206d6f7265207468616e2060008201527f6d617857616c6c6574416d6f756e740000000000000000000000000000000000602082015250565b6000614459602f83613245565b9150614464826143fd565b604082019050919050565b600060208201905081810360008301526144888161444c565b905091905056fea2646970667358221220585261adc1494bd190d15d8259ba8cfad00dfe5cae9e47a8b02baee240d4d29564736f6c634300080900330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

Deployed Bytecode

0x6080604052600436106102545760003560e01c8063893d20e811610139578063c5927207116100b6578063dd62ed3e1161007a578063dd62ed3e146108fb578063df2abc2414610938578063f2bc6ea414610961578063f2fde38b14610991578063fc962edb146109ba578063fdca8605146109ea5761025b565b8063c592720714610802578063c84dc0481461083f578063d43ad1e914610868578063d7c0991514610893578063d8dcac4f146108d05761025b565b80639a7a23d6116100fd5780639a7a23d614610706578063a457c2d71461072f578063a9059cbb1461076c578063a9c21468146107a9578063c49b9a80146107d95761025b565b8063893d20e8146106315780638a0eef5a1461065c5780638da5cb5b1461068757806395d89b41146106b257806399ec86fe146106dd5761025b565b8063313ce567116101d25780634f7addbc116101965780634f7addbc146105255780635a0b1a6d1461056257806368dc04c31461058b5780636a9e1458146105b457806370a08231146105dd578063715018a61461061a5761025b565b8063313ce5671461043e57806331df899a1461046957806339509351146104925780633c9f861d146104cf5780634d3314f4146104fa5761025b565b806313afbca71161021957806313afbca71461034757806318160ddd146103705780631850e44f1461039b57806323b872dd146103c45780632d838119146104015761025b565b8062470d3a14610260578063055add0d1461028b57806306fdde03146102b6578063095ea7b3146102e15780630a4ea2021461031e5761025b565b3661025b57005b600080fd5b34801561026c57600080fd5b50610275610a27565b60405161028291906131a5565b60405180910390f35b34801561029757600080fd5b506102a0610a4d565b6040516102ad919061321f565b60405180910390f35b3480156102c257600080fd5b506102cb610a73565b6040516102d891906132d3565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061335c565b610ab0565b60405161031591906133b7565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613410565b610ace565b005b34801561035357600080fd5b5061036e60048036038101906103699190613469565b610bf6565b005b34801561037c57600080fd5b50610385610c93565b60405161039291906134b8565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613469565b610c9d565b005b3480156103d057600080fd5b506103eb60048036038101906103e691906134d3565b610d00565b6040516103f891906133b7565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190613526565b610d84565b60405161043591906134b8565b60405180910390f35b34801561044a57600080fd5b50610453610de5565b604051610460919061356f565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b919061358a565b610dee565b005b34801561049e57600080fd5b506104b960048036038101906104b4919061335c565b610e59565b6040516104c691906133b7565b60405180910390f35b3480156104db57600080fd5b506104e4610f05565b6040516104f191906134b8565b60405180910390f35b34801561050657600080fd5b5061050f610f0f565b60405161051c91906134b8565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613605565b610f15565b60405161055991906133b7565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190613526565b610f6b565b005b34801561059757600080fd5b506105b260048036038101906105ad9190613526565b610f7d565b005b3480156105c057600080fd5b506105db60048036038101906105d69190613526565b611267565b005b3480156105e957600080fd5b5061060460048036038101906105ff9190613605565b611279565b60405161061191906134b8565b60405180910390f35b34801561062657600080fd5b5061062f6112ca565b005b34801561063d57600080fd5b506106466112de565b60405161065391906131a5565b60405180910390f35b34801561066857600080fd5b506106716112ed565b60405161067e91906134b8565b60405180910390f35b34801561069357600080fd5b5061069c6112f3565b6040516106a991906131a5565b60405180910390f35b3480156106be57600080fd5b506106c761131c565b6040516106d491906132d3565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613410565b611359565b005b34801561071257600080fd5b5061072d60048036038101906107289190613469565b611481565b005b34801561073b57600080fd5b506107566004803603810190610751919061335c565b6115c7565b60405161076391906133b7565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e919061335c565b6116b2565b6040516107a091906133b7565b60405180910390f35b3480156107b557600080fd5b506107be6116d0565b6040516107d096959493929190613632565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb919061369a565b611782565b005b34801561080e57600080fd5b5061082960048036038101906108249190613605565b6117de565b60405161083691906133b7565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190613526565b6117fe565b005b34801561087457600080fd5b5061087d611810565b60405161088a91906134b8565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613605565b611816565b6040516108c791906133b7565b60405180910390f35b3480156108dc57600080fd5b506108e561186c565b6040516108f291906134b8565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d91906136c7565b611872565b60405161092f91906134b8565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613469565b6118f9565b005b34801561096d57600080fd5b50610976611996565b60405161098896959493929190613632565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b39190613605565b611a48565b005b3480156109c657600080fd5b506109cf611acc565b6040516109e196959493929190613632565b60405180910390f35b3480156109f657600080fd5b50610a116004803603810190610a0c9190613605565b611b7e565b604051610a1e91906133b7565b60405180910390f35b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280601081526020017f50726f6f66204f66204e6f7468696e6700000000000000000000000000000000815250905090565b6000610ac4610abd611bd4565b8484611bdc565b6001905092915050565b610ad6611da7565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f0f9ab6c7b3a29f5eca7cf80f42ea6b1262432064b221200268394c9a5e63569f60405160405180910390a3610b84600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610c9d565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bf2600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610c9d565b5050565b610bfe611da7565b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015157f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b283604051610c8791906131a5565b60405180910390a25050565b6000600154905090565b610ca5611da7565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080610d1485610d0f611bd4565b611872565b905082811015610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090613779565b60405180910390fd5b610d64858585611e25565b610d7885610d70611bd4565b858403611bdc565b60019150509392505050565b6000600254821115610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc29061380b565b60405180910390fd5b610dd3612397565b82610dde9190613889565b9050919050565b60006012905090565b610df6611da7565b8015610e295784601c6004018190555083601c6002018190555082601c6003018190555081601c60010181905550610e52565b846022600401819055508360226002018190555082602260030181905550816022600101819055505b5050505050565b6000610efb610e66611bd4565b8484600f6000610e74611bd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef691906138ba565b611bdc565b6001905092915050565b6000601654905090565b60145481565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f73611da7565b80600c8190555050565b6000606482610f8b30611279565b610f959190613910565b610f9f9190613889565b905060008111156112635760006064601a5483610fbc9190613910565b610fc69190613889565b90506000600282610fd79190613889565b905060008184610fe7919061396a565b9050610ff2816123b3565b600047905060006064601954836110099190613910565b6110139190613889565b905060006064601854846110279190613910565b6110319190613889565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561109b573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611104573d6000803e3d6000fd5b506000479050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473089600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401611193969594939291906139fa565b6060604051808303818588803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111e59190613a70565b5050506000602e600401819055506000602e600201819055506000602e60030181905550856015600082825461121b91906138ba565b925050819055507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b8682604051611253929190613ac3565b60405180910390a1505050505050505b5050565b61126f611da7565b80600b8190555050565b60006112c3600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d84565b9050919050565b6112d2611da7565b6112dc60006125d8565b565b60006112e86112f3565b905090565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f504f4e0000000000000000000000000000000000000000000000000000000000815250905090565b611361611da7565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f194c6407864834414a3adaa18aab4cb81b733d5986a0c3b1e0fc9a8bccc0c0fb60405160405180910390a361140f600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610c9d565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061147d600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610c9d565b5050565b611489611da7565b801515601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390613b5e565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061157d8282610bf6565b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600080600f60006115d6611bd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90613bf0565b60405180910390fd5b6116a761169e611bd4565b85858403611bdc565b600191505092915050565b60006116c66116bf611bd4565b8484611e25565b6001905092915050565b60288060000154908060010154908060020154908060030154908060040154908060050180546116ff90613c3f565b80601f016020809104026020016040519081016040528092919081815260200182805461172b90613c3f565b80156117785780601f1061174d57610100808354040283529160200191611778565b820191906000526020600020905b81548152906001019060200180831161175b57829003601f168201915b5050505050905086565b61178a611da7565b80601760016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516117d391906133b7565b60405180910390a150565b60136020528060005260406000206000915054906101000a900460ff1681565b611806611da7565b80600a8190555050565b60155481565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60065481565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611901611da7565b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015157f3159dadbd8e2d720a851b412e3358e7e44bb11734c9bfd5715340e21798e8b258360405161198a91906131a5565b60405180910390a25050565b601c8060000154908060010154908060020154908060030154908060040154908060050180546119c590613c3f565b80601f01602080910402602001604051908101604052809291908181526020018280546119f190613c3f565b8015611a3e5780601f10611a1357610100808354040283529160200191611a3e565b820191906000526020600020905b815481529060010190602001808311611a2157829003601f168201915b5050505050905086565b611a50611da7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab790613ce3565b60405180910390fd5b611ac9816125d8565b50565b6022806000015490806001015490806002015490806003015490806004015490806005018054611afb90613c3f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2790613c3f565b8015611b745780601f10611b4957610100808354040283529160200191611b74565b820191906000526020600020905b815481529060010190602001808311611b5757829003601f168201915b5050505050905086565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4390613d75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390613e07565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d9a91906134b8565b60405180910390a3505050565b611daf611bd4565b73ffffffffffffffffffffffffffffffffffffffff16611dcd6112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1a90613e73565b60405180910390fd5b565b6000600554148015611e805750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611e8d57436005819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613f05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6490613f97565b60405180910390fd5b611f7683611816565b15611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad90614003565b60405180910390fd5b60008111611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090614095565b60405180910390fd5b61200283611279565b811115612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614127565b60405180910390fd5b600061204f84611b7e565b8061205f575061205e83611b7e565b5b159050801561222057601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612180576006546005546120ca91906138ba565b4310156120dd576120dc8360016118f9565b5b601c60286000820154816000015560018201548160010155600282015481600201556003820154816003015560048201548160040155600582018160050190805461212790613c3f565b61213292919061307d565b50905050600b5482111561217b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217290614193565b60405180910390fd5b61221f565b60226028600082015481600001556001820154816001015560028201548160020155600382015481600301556004820154816004015560058201816005019080546121ca90613c3f565b6121d592919061307d565b50905050600c5482111561221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590614225565b60405180910390fd5b5b5b601760009054906101000a900460ff161580156122875750601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561229f5750601760019054906101000a900460ff165b80156122de57506122ae6112f3565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561231d57506122ed6112f3565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156123775750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156123855761238461269c565b5b612391848484846129a9565b50505050565b60006123a1610c93565b6002546123ae9190613889565b905090565b6000600267ffffffffffffffff8111156123d0576123cf614245565b5b6040519080825280602002602001820160405280156123fe5781602001602082028036833780820191505090505b509050308160008151811061241657612415614274565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156124b857600080fd5b505afa1580156124cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f091906142b8565b8160018151811061250457612503614274565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016125a29594939291906143a3565b600060405180830381600087803b1580156125bc57600080fd5b505af11580156125d0573d6000803e3d6000fd5b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601760006101000a81548160ff02191690831515021790555060006126c230611279565b111561298c5760006002602e600401546126dc9190613889565b9050600081602e600401546126f1919061396a565b905061271c82602e60030154602e6002015461270d91906138ba565b61271791906138ba565b6123b3565b600047905060006064601954836127339190613910565b61273d9190613889565b905060006064601854846127519190613910565b61275b9190613889565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156127c5573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561282e573d6000803e3d6000fd5b506000479050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473088600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016128bd969594939291906139fa565b6060604051808303818588803b1580156128d657600080fd5b505af11580156128ea573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061290f9190613a70565b5050506000602e600401819055506000602e600201819055506000602e60030181905550846015600082825461294591906138ba565b925050819055507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b858260405161297d929190613ac3565b60405180910390a15050505050505b6000601760006101000a81548160ff021916908315150217905550565b60008060008060006129bb8787612d65565b94509450945094509450601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a325750600a5485612a258a611279565b612a2f91906138ba565b11155b612a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a689061446f565b60405180910390fd5b83600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac0919061396a565b9250508190555082600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b1691906138ba565b925050819055508515612cf557806000015160026000828254612b39919061396a565b92505081905550816000015160146000828254612b5691906138ba565b92505081905550612b678282612dcf565b816020015160166000828254612b7d91906138ba565b925050819055508060200151600d6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf991906138ba565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460200151604051612c8391906134b8565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460a00151604051612cec91906134b8565b60405180910390a35b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612d5291906134b8565b60405180910390a3505050505050505050565b6000806000612d7261310a565b612d7a61310a565b612d848787612e8d565b80925081935050508160c0015187612d9c919061396a565b9450612da6612397565b87612db19190613910565b93508060c0015184612dc3919061396a565b92509295509295909350565b8060a00151600d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2291906138ba565b925050819055508160800151602e6004016000828254612e4291906138ba565b925050819055508160400151602e6002016000828254612e6291906138ba565b925050819055508160600151602e6003016000828254612e8291906138ba565b925050819055505050565b612e9561310a565b612e9d61310a565b8215613076576000612ead612397565b9050606460286004015486612ec29190613910565b612ecc9190613889565b836000018181525050606460286000015486612ee89190613910565b612ef29190613889565b836020018181525050606460286003015486612f0e9190613910565b612f189190613889565b836040018181525050606460286002015486612f349190613910565b612f3e9190613889565b836060018181525050606460286001015486612f5a9190613910565b612f649190613889565b836080018181525050826080015183606001518460400151612f8691906138ba565b612f9091906138ba565b8360a00181815250508260a0015183602001518460000151612fb291906138ba565b612fbc91906138ba565b8360c0018181525050808360000151612fd59190613910565b826000018181525050808360200151612fee9190613910565b8260200181815250508083604001516130079190613910565b8260400181815250508083606001516130209190613910565b8260600181815250508083608001516130399190613910565b826080018181525050808360c001516130529190613910565b8260c0018181525050808360a0015161306b9190613910565b8260a0018181525050505b9250929050565b82805461308990613c3f565b90600052602060002090601f0160209004810192826130ab57600085556130f9565b82601f106130bc57805485556130f9565b828001600101855582156130f957600052602060002091601f016020900482015b828111156130f85782548255916001019190600101906130dd565b5b5090506131069190613147565b5090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613160576000816000905550600101613148565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318f82613164565b9050919050565b61319f81613184565b82525050565b60006020820190506131ba6000830184613196565b92915050565b6000819050919050565b60006131e56131e06131db84613164565b6131c0565b613164565b9050919050565b60006131f7826131ca565b9050919050565b6000613209826131ec565b9050919050565b613219816131fe565b82525050565b60006020820190506132346000830184613210565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613274578082015181840152602081019050613259565b83811115613283576000848401525b50505050565b6000601f19601f8301169050919050565b60006132a58261323a565b6132af8185613245565b93506132bf818560208601613256565b6132c881613289565b840191505092915050565b600060208201905081810360008301526132ed818461329a565b905092915050565b600080fd5b61330381613184565b811461330e57600080fd5b50565b600081359050613320816132fa565b92915050565b6000819050919050565b61333981613326565b811461334457600080fd5b50565b60008135905061335681613330565b92915050565b60008060408385031215613373576133726132f5565b5b600061338185828601613311565b925050602061339285828601613347565b9150509250929050565b60008115159050919050565b6133b18161339c565b82525050565b60006020820190506133cc60008301846133a8565b92915050565b60006133dd82613164565b9050919050565b6133ed816133d2565b81146133f857600080fd5b50565b60008135905061340a816133e4565b92915050565b600060208284031215613426576134256132f5565b5b6000613434848285016133fb565b91505092915050565b6134468161339c565b811461345157600080fd5b50565b6000813590506134638161343d565b92915050565b600080604083850312156134805761347f6132f5565b5b600061348e85828601613311565b925050602061349f85828601613454565b9150509250929050565b6134b281613326565b82525050565b60006020820190506134cd60008301846134a9565b92915050565b6000806000606084860312156134ec576134eb6132f5565b5b60006134fa86828701613311565b935050602061350b86828701613311565b925050604061351c86828701613347565b9150509250925092565b60006020828403121561353c5761353b6132f5565b5b600061354a84828501613347565b91505092915050565b600060ff82169050919050565b61356981613553565b82525050565b60006020820190506135846000830184613560565b92915050565b600080600080600060a086880312156135a6576135a56132f5565b5b60006135b488828901613347565b95505060206135c588828901613347565b94505060406135d688828901613347565b93505060606135e788828901613347565b92505060806135f888828901613454565b9150509295509295909350565b60006020828403121561361b5761361a6132f5565b5b600061362984828501613311565b91505092915050565b600060c08201905061364760008301896134a9565b61365460208301886134a9565b61366160408301876134a9565b61366e60608301866134a9565b61367b60808301856134a9565b81810360a083015261368d818461329a565b9050979650505050505050565b6000602082840312156136b0576136af6132f5565b5b60006136be84828501613454565b91505092915050565b600080604083850312156136de576136dd6132f5565b5b60006136ec85828601613311565b92505060206136fd85828601613311565b9150509250929050565b7f42455032303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613763602883613245565b915061376e82613707565b604082019050919050565b6000602082019050818103600083015261379281613756565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b60006137f5602a83613245565b915061380082613799565b604082019050919050565b60006020820190508181036000830152613824816137e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061389482613326565b915061389f83613326565b9250826138af576138ae61382b565b5b828204905092915050565b60006138c582613326565b91506138d083613326565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139055761390461385a565b5b828201905092915050565b600061391b82613326565b915061392683613326565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561395f5761395e61385a565b5b828202905092915050565b600061397582613326565b915061398083613326565b9250828210156139935761399261385a565b5b828203905092915050565b6000819050919050565b60006139c36139be6139b98461399e565b6131c0565b613326565b9050919050565b6139d3816139a8565b82525050565b60006139e4826131ec565b9050919050565b6139f4816139d9565b82525050565b600060c082019050613a0f6000830189613196565b613a1c60208301886134a9565b613a2960408301876139ca565b613a3660608301866139ca565b613a4360808301856139eb565b613a5060a08301846134a9565b979650505050505050565b600081519050613a6a81613330565b92915050565b600080600060608486031215613a8957613a886132f5565b5b6000613a9786828701613a5b565b9350506020613aa886828701613a5b565b9250506040613ab986828701613a5b565b9150509250925092565b6000604082019050613ad860008301856134a9565b613ae560208301846134a9565b9392505050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000613b48603883613245565b9150613b5382613aec565b604082019050919050565b60006020820190508181036000830152613b7781613b3b565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613bda602583613245565b9150613be582613b7e565b604082019050919050565b60006020820190508181036000830152613c0981613bcd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c5757607f821691505b60208210811415613c6b57613c6a613c10565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ccd602683613245565b9150613cd882613c71565b604082019050919050565b60006020820190508181036000830152613cfc81613cc0565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d5f602483613245565b9150613d6a82613d03565b604082019050919050565b60006020820190508181036000830152613d8e81613d52565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613df1602283613245565b9150613dfc82613d95565b604082019050919050565b60006020820190508181036000830152613e2081613de4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e5d602083613245565b9150613e6882613e27565b602082019050919050565b60006020820190508181036000830152613e8c81613e50565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613eef602583613245565b9150613efa82613e93565b604082019050919050565b60006020820190508181036000830152613f1e81613ee2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f81602383613245565b9150613f8c82613f25565b604082019050919050565b60006020820190508181036000830152613fb081613f74565b9050919050565b7f45524332303a206164647265737320626c61636b6c69737465642028626f7429600082015250565b6000613fed602083613245565b9150613ff882613fb7565b602082019050919050565b6000602082019050818103600083015261401c81613fe0565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061407f602983613245565b915061408a82614023565b604082019050919050565b600060208201905081810360008301526140ae81614072565b9050919050565b7f596f752061726520747279696e6720746f207472616e73666572206d6f72652060008201527f7468616e20796f75722062616c616e6365000000000000000000000000000000602082015250565b6000614111603183613245565b915061411c826140b5565b604082019050919050565b6000602082019050818103600083015261414081614104565b9050919050565b7f616d6f756e74206d757374206265203c3d206d61785478416d6f756e74427579600082015250565b600061417d602083613245565b915061418882614147565b602082019050919050565b600060208201905081810360008301526141ac81614170565b9050919050565b7f616d6f756e74206d757374206265203c3d206d61785478416d6f756e7453656c60008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b600061420f602183613245565b915061421a826141b3565b604082019050919050565b6000602082019050818103600083015261423e81614202565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506142b2816132fa565b92915050565b6000602082840312156142ce576142cd6132f5565b5b60006142dc848285016142a3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61431a81613184565b82525050565b600061432c8383614311565b60208301905092915050565b6000602082019050919050565b6000614350826142e5565b61435a81856142f0565b935061436583614301565b8060005b8381101561439657815161437d8882614320565b975061438883614338565b925050600181019050614369565b5085935050505092915050565b600060a0820190506143b860008301886134a9565b6143c560208301876139ca565b81810360408301526143d78186614345565b90506143e66060830185613196565b6143f360808301846134a9565b9695505050505050565b7f526563697069656e742063616e6e6f7420686f6c64206d6f7265207468616e2060008201527f6d617857616c6c6574416d6f756e740000000000000000000000000000000000602082015250565b6000614459602f83613245565b9150614464826143fd565b604082019050919050565b600060208201905081810360008301526144888161444c565b905091905056fea2646970667358221220585261adc1494bd190d15d8259ba8cfad00dfe5cae9e47a8b02baee240d4d29564736f6c63430008090033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : swap (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


Deployed Bytecode Sourcemap

32493:22664:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32989:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32941:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42364:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42985:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41582:464;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44280:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42056:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40831:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43339:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54433:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42168:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37931:586;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45538:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42559:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34080:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44522:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38642:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39379:1390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38758:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42663:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13107:103;;;;;;;;;;;;;:::i;:::-;;42459:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33064:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12459:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42263:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41149:425;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44761:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45765:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43159:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35614:52;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;54890:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33984:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38527:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34110:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44158:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33105:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42830:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43977:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35219:189;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;13365:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35417:188;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;40991:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32989:33;;;;;;;;;;;;;:::o;32941:41::-;;;;;;;;;;;;;:::o;42364:87::-;42401:13;42439:4;;;;;;;;;;;;;;;;;42432:11;;42364:87;:::o;42985:166::-;43060:4;43082:39;43091:12;:10;:12::i;:::-;43105:7;43114:6;43082:8;:39::i;:::-;43139:4;43132:11;;42985:166;;;;:::o;41582:464::-;12345:13;:11;:13::i;:::-;41681:18:::1;41702:16;;;;;;;;;;;41681:37;;41760:16;41734:43;;41748:10;41734:43;;;;;;;;;;;;41788:56;41820:16;;;;;;;;;;;41838:5;41788:31;:56::i;:::-;41930:16;41911;;:35;;;;;;;;;;;;;;;;;;41957:55;41989:16;;;;;;;;;;;42007:4;41957:31;:55::i;:::-;41670:376;41582:464:::0;:::o;44280:234::-;12345:13;:11;:13::i;:::-;44433:10:::1;44389:26;:41;44416:13;44389:41;;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;44495:10;44459:47;;;44480:13;44459:47;;;;;;:::i;:::-;;;;;;;;44280:234:::0;;:::o;42056:104::-;42109:7;42141:11;;42134:18;;42056:104;:::o;40831:152::-;12345:13;:11;:13::i;:::-;40965:10:::1;40935:22;:27;40958:3;40935:27;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;40831:152:::0;;:::o;43339:445::-;43437:4;43459:24;43486:30;43496:6;43503:12;:10;:12::i;:::-;43486:9;:30::i;:::-;43459:57;;43555:6;43535:16;:26;;43527:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;43617:36;43627:6;43635:9;43646:6;43617:9;:36::i;:::-;43688:57;43697:6;43705:12;:10;:12::i;:::-;43738:6;43719:16;:25;43688:8;:57::i;:::-;43772:4;43765:11;;;43339:445;;;;;:::o;54433:266::-;54512:7;54568:18;;54545:19;:41;;54537:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54672:19;:17;:19::i;:::-;54650;:41;;;;:::i;:::-;54643:48;;54433:266;;;:::o;42168:87::-;42209:5;32720:2;42232:15;;42168:87;:::o;37931:586::-;12345:13;:11;:13::i;:::-;38067:6:::1;38064:446;;;38123:9;38099:11;:21;;:33;;;;38174:6;38147:11;:24;;:33;;;;38224:6;38195:11;:26;;:35;;;;38272:5;38245:11;:24;;:32;;;;38064:446;;;38350:9;38328;:19;;:31;;;;38399:6;38374:9;:22;;:31;;;;38447:6;38420:9;:24;;:33;;;;38493:5;38468:9;:22;;:30;;;;38064:446;37931:586:::0;;;;;:::o;45538:219::-;45626:4;45648:79;45657:12;:10;:12::i;:::-;45671:7;45716:10;45680;:24;45691:12;:10;:12::i;:::-;45680:24;;;;;;;;;;;;;;;:33;45705:7;45680:33;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;45648:8;:79::i;:::-;45745:4;45738:11;;45538:219;;;;:::o;42559:96::-;42601:7;42633:14;;42626:21;;42559:96;:::o;34080:23::-;;;;:::o;44522:152::-;44596:4;44625:26;:41;44652:13;44625:41;;;;;;;;;;;;;;;;;;;;;;;;;44618:48;;44522:152;;;:::o;38642:108::-;12345:13;:11;:13::i;:::-;38733:9:::1;38719:11;:23;;;;38642:108:::0;:::o;39379:1390::-;39432:15;39485:3;39478;39451:24;39469:4;39451:9;:24::i;:::-;:30;;;;:::i;:::-;39450:38;;;;:::i;:::-;39432:56;;39514:1;39504:7;:11;39501:1261;;;39541:19;39593:3;39574:17;;39564:7;:27;;;;:::i;:::-;39563:33;;;;:::i;:::-;39541:55;;39611:26;39654:1;39640:11;:15;;;;:::i;:::-;39611:44;;39670:20;39703:18;39693:7;:28;;;;:::i;:::-;39670:51;;39738:30;39755:12;39738:16;:30::i;:::-;39783:23;39809:21;39783:47;;39847:16;39905:3;39885:18;;39867:15;:36;;;;:::i;:::-;39866:42;;;;:::i;:::-;39847:61;;39923:16;39987:3;39961:24;;39943:15;:42;;;;:::i;:::-;39942:48;;;;:::i;:::-;39923:67;;40007:10;;;;;;;;;;;:19;;:29;40027:8;40007:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40051:16;;;;;;;;;;;:25;;:35;40077:8;40051:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40103:11;40117:21;40103:35;;40155:15;;;;;;;;;;;:31;;;40194:21;40243:4;40267:18;40304:1;40351;40398:10;;;;;;;;;;;40427:15;40155:302;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;40521:1;40476:29;:42;;:46;;;;40576:1;40537:29;:36;;:40;;;;40637:1;40592:29;:42;;:46;;;;40671:18;40655:12;;:34;;;;;;;:::i;:::-;;;;;;;;40711:39;40726:18;40746:3;40711:39;;;;;;;:::i;:::-;;;;;;;;39526:1236;;;;;;;39501:1261;39421:1348;39379:1390;:::o;38758:102::-;12345:13;:11;:13::i;:::-;38845:7:::1;38832:10;:20;;;;38758:102:::0;:::o;42663:159::-;42729:7;42761:53;42781:23;:32;42805:7;42781:32;;;;;;;;;;;;;;;;42761:19;:53::i;:::-;42754:60;;42663:159;;;:::o;13107:103::-;12345:13;:11;:13::i;:::-;13172:30:::1;13199:1;13172:18;:30::i;:::-;13107:103::o:0;42459:90::-;42502:7;42534;:5;:7::i;:::-;42527:14;;42459:90;:::o;33064:34::-;;;;:::o;12459:87::-;12505:7;12532:6;;;;;;;;;;;12525:13;;12459:87;:::o;42263:91::-;42302:13;42340:6;;;;;;;;;;;;;;;;;42333:13;;42263:91;:::o;41149:425::-;12345:13;:11;:13::i;:::-;41239:18:::1;41260:10;;;;;;;;;;;41239:31;;41312:13;41286:40;;41300:10;41286:40;;;;;;;;;;;;41337:50;41369:10;;;;;;;;;;;41381:5;41337:31;:50::i;:::-;41467:13;41454:10;;:26;;;;;;;;;;;;;;;;;;41491:49;41523:10;;;;;;;;;;;41535:4;41491:31;:49::i;:::-;41228:346;41149:425:::0;:::o;44761:376::-;12345:13;:11;:13::i;:::-;44905:5:::1;44869:41;;:25;:32;44895:5;44869:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;44860:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45016:5;44981:25;:32;45007:5;44981:32;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;45032;45059:5;45066;45032:26;:40::i;:::-;45123:5;45088:41;;45116:5;45088:41;;;;;;;;;;;;44761:376:::0;;:::o;45765:410::-;45858:4;45880:24;45907:10;:24;45918:12;:10;:12::i;:::-;45907:24;;;;;;;;;;;;;;;:33;45932:7;45907:33;;;;;;;;;;;;;;;;45880:60;;45979:15;45959:16;:35;;45951:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46069:67;46078:12;:10;:12::i;:::-;46092:7;46120:15;46101:16;:34;46069:8;:67::i;:::-;46163:4;46156:11;;;45765:410;;;;:::o;43159:172::-;43237:4;43259:42;43269:12;:10;:12::i;:::-;43283:9;43294:6;43259:9;:42::i;:::-;43319:4;43312:11;;43159:172;;;;:::o;35614:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54890:166::-;12345:13;:11;:13::i;:::-;54986:8:::1;54972:11;;:22;;;;;;;;;;;;;;;;;;55010:38;55039:8;55010:38;;;;;;:::i;:::-;;;;;;;;54890:166:::0;:::o;33984:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;38527:107::-;12345:13;:11;:13::i;:::-;38616:10:::1;38606:7;:20;;;;38527:107:::0;:::o;34110:27::-;;;;:::o;44158:114::-;44216:4;44245;:19;44250:13;44245:19;;;;;;;;;;;;;;;;;;;;;;;;;44238:26;;44158:114;;;:::o;33105:31::-;;;;:::o;42830:147::-;42911:7;42943:10;:17;42954:5;42943:17;;;;;;;;;;;;;;;:26;42961:7;42943:26;;;;;;;;;;;;;;;;42936:33;;42830:147;;;;:::o;43977:173::-;12345:13;:11;:13::i;:::-;44084:5:::1;44062:4;:19;44067:13;44062:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;44136:5;44105:37;;;44121:13;44105:37;;;;;;:::i;:::-;;;;;;;;43977:173:::0;;:::o;35219:189::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13365:201::-;12345:13;:11;:13::i;:::-;13474:1:::1;13454:22;;:8;:22;;;;13446:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13530:28;13549:8;13530:18;:28::i;:::-;13365:201:::0;:::o;35417:188::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40991:150::-;41067:4;41096:22;:37;41119:13;41096:37;;;;;;;;;;;;;;;;;;;;;;;;;41089:44;;40991:150;;;:::o;11170:98::-;11223:7;11250:10;11243:17;;11170:98;:::o;45191:339::-;45306:1;45289:19;;:5;:19;;;;45281:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45387:1;45368:21;;:7;:21;;;;45360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45468:6;45439:10;:17;45450:5;45439:17;;;;;;;;;;;;;;;:26;45457:7;45439:26;;;;;;;;;;;;;;;:35;;;;45506:7;45490:32;;45499:5;45490:32;;;45515:6;45490:32;;;;;;:::i;:::-;;;;;;;;45191:339;;;:::o;12624:132::-;12699:12;:10;:12::i;:::-;12688:23;;:7;:5;:7::i;:::-;:23;;;12680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12624:132::o;46220:2158::-;46332:1;46309:19;;:24;:57;;;;;46337:25;:29;46363:2;46337:29;;;;;;;;;;;;;;;;;;;;;;;;;46309:57;46305:133;;;46414:12;46392:19;:34;;;;46305:133;46474:1;46458:18;;:4;:18;;;;46450:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46551:1;46537:16;;:2;:16;;;;46529:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46613:11;46619:4;46613:5;:11::i;:::-;46612:12;46604:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46689:1;46680:6;:10;46672:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46765:15;46775:4;46765:9;:15::i;:::-;46755:6;:25;;46747:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46847:12;46865:29;46889:4;46865:23;:29::i;:::-;:60;;;;46898:27;46922:2;46898:23;:27::i;:::-;46865:60;46863:63;46847:79;;46943:7;46939:993;;;47033:25;:31;47059:4;47033:31;;;;;;;;;;;;;;;;;;;;;;;;;47029:892;;;47178:12;;47156:19;;:34;;;;:::i;:::-;47141:12;:49;47137:132;;;47232:17;47240:2;47244:4;47232:7;:17::i;:::-;47137:132;47446:11;47421:22;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;47494:10;;47484:6;:20;;47476:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47029:892;;;47811:9;47786:22;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;47857:11;;47847:6;:21;;47839:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47029:892;46939:993;48038:6;;;;;;;;;;;48037:7;:56;;;;;48062:25;:31;48088:4;48062:31;;;;;;;;;;;;;;;;;;;;;;;;;48061:32;48037:56;:84;;;;;48110:11;;;;;;;;;;;48037:84;:116;;;;;48146:7;:5;:7::i;:::-;48138:15;;:4;:15;;;;48037:116;:147;;;;;48177:7;:5;:7::i;:::-;48171:13;;:2;:13;;;;48037:147;:196;;;;;48217:15;;;;;;;;;;;48201:32;;:4;:32;;;;48037:196;48019:298;;;48289:16;:14;:16::i;:::-;48019:298;48329:41;48344:4;48350:2;48354:6;48362:7;48329:14;:41::i;:::-;46294:2084;46220:2158;;;:::o;54707:125::-;54758:7;54811:13;:11;:13::i;:::-;54790:18;;:34;;;;:::i;:::-;54783:41;;54707:125;:::o;38868:503::-;38983:21;39021:1;39007:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38983:40;;39052:4;39034;39039:1;39034:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;39078:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39068:4;39073:1;39068:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;39139:15;;;;;;;;;;;:66;;;39220:11;39246:1;39290:4;39317;39337:15;39139:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38928:443;38868:503;:::o;13726:191::-;13800:16;13819:6;;;;;;;;;;;13800:25;;13845:8;13836:6;;:17;;;;;;;;;;;;;;;;;;13900:8;13869:40;;13890:8;13869:40;;;;;;;;;;;;13789:128;13726:191;:::o;52967:1458::-;34363:4;34354:6;;:13;;;;;;;;;;;;;;;;;;53097:1:::1;53070:24;53088:4;53070:9;:24::i;:::-;:28;53067:1351;;;53124:20;53192:1;53147:29;:42;;;:46;;;;:::i;:::-;53124:69;;53208:26;53282:12;53237:29;:42;;;:57;;;;:::i;:::-;53208:86;;53311:114;53412:12;53367:29;:42;;;53328:29;:36;;;:81;;;;:::i;:::-;:96;;;;:::i;:::-;53311:16;:114::i;:::-;53442:23;53468:21;53442:47;;53504:16;53561:3;53541:18;;53524:15;:35;;;;:::i;:::-;53523:41;;;;:::i;:::-;53504:60;;53579:16;53643:3;53617:24;;53599:15;:42;;;;:::i;:::-;53598:48;;;;:::i;:::-;53579:67;;53663:10;;;;;;;;;;;:19;;:29;53683:8;53663:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53707:16;;;;;;;;;;;:25;;:35;53733:8;53707:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53759:11;53773:21;53759:35;;53811:15;;;;;;;;;;;:31;;;53850:21;53899:4;53923:18;53960:1;54007::::0;54054:10:::1;;;;;;;;;;;54083:15;53811:302;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;54175:1;54130:29;:42;;:46;;;;54230:1;54191:29;:36;;:40;;;;54291:1;54246:29;:42;;:46;;;;54325:18;54309:12;;:34;;;;;;;:::i;:::-;;;;;;;;54367:39;54382:18;54402:3;54367:39;;;;;;;:::i;:::-;;;;;;;;53109:1309;;;;;;53067:1351;34399:5:::0;34390:6;;:14;;;;;;;;;;;;;;;;;;52967:1458::o;48460:1664::-;48583:20;48614:34;48659:33;48703;48747:41;48792:57;48826:13;48841:7;48792:33;:57::i;:::-;48582:267;;;;;;;;;;48962:26;:37;48989:9;48962:37;;;;;;;;;;;;;;;;;;;;;;;;;:102;;;;49057:7;;49040:12;49017:20;49027:9;49017;:20::i;:::-;:35;;;;:::i;:::-;49016:48;;48962:102;48954:175;;;;;;;;;;;;:::i;:::-;;;;;;;;;49323:26;49288:23;:31;49312:6;49288:31;;;;;;;;;;;;;;;;:61;;;;;;;:::i;:::-;;;;;;;;49398:25;49360:23;:34;49384:9;49360:34;;;;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;;;;;49440:7;49436:615;;;49497:18;:33;;;49475:18;;:55;;;;;;;:::i;:::-;;;;;;;;49557:10;:25;;;49545:8;;:37;;;;;;;:::i;:::-;;;;;;;;49599:45;49613:10;49625:18;49599:13;:45::i;:::-;49709:10;:18;;;49691:14;;:36;;;;;;;:::i;:::-;;;;;;;;49782:18;:26;;;49742:23;:36;49766:11;;;;;;;;;;;49742:36;;;;;;;;;;;;;;;;:66;;;;;;;:::i;:::-;;;;;;;;49927:11;;;;;;;;;;;49903:56;;49920:4;49903:56;;;49940:10;:18;;;49903:56;;;;;;:::i;:::-;;;;;;;;50004:4;49979:60;;49988:6;49979:60;;;50011:10;:27;;;49979:60;;;;;;:::i;:::-;;;;;;;;49436:615;50092:9;50075:41;;50084:6;50075:41;;;50103:12;50075:41;;;;;;:::i;:::-;;;;;;;;48569:1555;;;;;48460:1664;;;;:::o;50132:685::-;50252:20;50283:34;50328:33;50372;;:::i;:::-;50416:41;;:::i;:::-;50510:67;50545:13;50560:16;50510:34;:67::i;:::-;50475:102;;;;;;;;50619:10;:19;;;50603:13;:35;;;;:::i;:::-;50588:50;;50695:19;:17;:19::i;:::-;50679:13;:35;;;;:::i;:::-;50649:65;;50782:18;:27;;;50753:26;:56;;;;:::i;:::-;50725:84;;50132:685;;;;;;;;:::o;52519:436::-;52683:17;:34;;;52641:23;:38;52673:4;52641:38;;;;;;;;;;;;;;;;:76;;;;;;;:::i;:::-;;;;;;;;52776:8;:21;;;52730:29;:42;;;:67;;;;;;;:::i;:::-;;;;;;;;52850:8;:15;;;52810:29;:36;;;:55;;;;;;;:::i;:::-;;;;;;;;52924:8;:21;;;52878:29;:42;;;:67;;;;;;;:::i;:::-;;;;;;;;52519:436;;:::o;50827:1684::-;50930:31;;:::i;:::-;50963:40;;:::i;:::-;51025:7;51021:1483;;;51058:19;51080;:17;:19::i;:::-;51058:41;;51232:3;51196:22;:32;;;51180:13;:48;;;;:::i;:::-;51179:56;;;;:::i;:::-;51153:8;:23;;:82;;;;;51321:3;51287:22;:30;;;51271:13;:46;;;;:::i;:::-;51270:54;;;;:::i;:::-;51250:8;:16;;:74;;;;;51416:3;51375:22;:37;;;51359:13;:53;;;;:::i;:::-;51358:61;;;;:::i;:::-;51339:8;:15;;:80;;;;;51515:3;51476:22;:35;;;51460:13;:51;;;;:::i;:::-;51459:59;;;;:::i;:::-;51434:8;:21;;:84;;;;;51614:3;51575:22;:35;;;51559:13;:51;;;;:::i;:::-;51558:59;;;;:::i;:::-;51533:8;:21;;:84;;;;;51796:8;:21;;;51772:8;:21;;;51754:8;:15;;;:39;;;;:::i;:::-;:63;;;;:::i;:::-;51726:8;:25;;:91;;;;;51897:8;:25;;;51878:8;:16;;;51852:8;:23;;;:42;;;;:::i;:::-;:70;;;;:::i;:::-;51832:8;:17;;:90;;;;;52000:11;51974:8;:23;;;:37;;;;:::i;:::-;51939:17;:32;;:72;;;;;52074:11;52055:8;:16;;;:30;;;;:::i;:::-;52026:17;:25;;:59;;;;;52147:11;52129:8;:15;;;:29;;;;:::i;:::-;52100:17;:24;;:58;;;;;52230:11;52206:8;:21;;;:35;;;;:::i;:::-;52173:17;:30;;:68;;;;;52313:11;52289:8;:21;;;:35;;;;:::i;:::-;52256:17;:30;;:68;;;;;52390:11;52370:8;:17;;;:31;;;;:::i;:::-;52341:17;:26;;:60;;;;;52481:11;52453:8;:25;;;:39;;;;:::i;:::-;52416:17;:34;;:76;;;;;51043:1461;51021:1483;50827:1684;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:60::-;621:3;642:5;635:12;;593:60;;;:::o;659:142::-;709:9;742:53;760:34;769:24;787:5;769:24;:::i;:::-;760:34;:::i;:::-;742:53;:::i;:::-;729:66;;659:142;;;:::o;807:126::-;857:9;890:37;921:5;890:37;:::i;:::-;877:50;;807:126;;;:::o;939:153::-;1016:9;1049:37;1080:5;1049:37;:::i;:::-;1036:50;;939:153;;;:::o;1098:185::-;1212:64;1270:5;1212:64;:::i;:::-;1207:3;1200:77;1098:185;;:::o;1289:276::-;1409:4;1447:2;1436:9;1432:18;1424:26;;1460:98;1555:1;1544:9;1540:17;1531:6;1460:98;:::i;:::-;1289:276;;;;:::o;1571:99::-;1623:6;1657:5;1651:12;1641:22;;1571:99;;;:::o;1676:169::-;1760:11;1794:6;1789:3;1782:19;1834:4;1829:3;1825:14;1810:29;;1676:169;;;;:::o;1851:307::-;1919:1;1929:113;1943:6;1940:1;1937:13;1929:113;;;2028:1;2023:3;2019:11;2013:18;2009:1;2004:3;2000:11;1993:39;1965:2;1962:1;1958:10;1953:15;;1929:113;;;2060:6;2057:1;2054:13;2051:101;;;2140:1;2131:6;2126:3;2122:16;2115:27;2051:101;1900:258;1851:307;;;:::o;2164:102::-;2205:6;2256:2;2252:7;2247:2;2240:5;2236:14;2232:28;2222:38;;2164:102;;;:::o;2272:364::-;2360:3;2388:39;2421:5;2388:39;:::i;:::-;2443:71;2507:6;2502:3;2443:71;:::i;:::-;2436:78;;2523:52;2568:6;2563:3;2556:4;2549:5;2545:16;2523:52;:::i;:::-;2600:29;2622:6;2600:29;:::i;:::-;2595:3;2591:39;2584:46;;2364:272;2272:364;;;;:::o;2642:313::-;2755:4;2793:2;2782:9;2778:18;2770:26;;2842:9;2836:4;2832:20;2828:1;2817:9;2813:17;2806:47;2870:78;2943:4;2934:6;2870:78;:::i;:::-;2862:86;;2642:313;;;;:::o;3042:117::-;3151:1;3148;3141:12;3288:122;3361:24;3379:5;3361:24;:::i;:::-;3354:5;3351:35;3341:63;;3400:1;3397;3390:12;3341:63;3288:122;:::o;3416:139::-;3462:5;3500:6;3487:20;3478:29;;3516:33;3543:5;3516:33;:::i;:::-;3416:139;;;;:::o;3561:77::-;3598:7;3627:5;3616:16;;3561:77;;;:::o;3644:122::-;3717:24;3735:5;3717:24;:::i;:::-;3710:5;3707:35;3697:63;;3756:1;3753;3746:12;3697:63;3644:122;:::o;3772:139::-;3818:5;3856:6;3843:20;3834:29;;3872:33;3899:5;3872:33;:::i;:::-;3772:139;;;;:::o;3917:474::-;3985:6;3993;4042:2;4030:9;4021:7;4017:23;4013:32;4010:119;;;4048:79;;:::i;:::-;4010:119;4168:1;4193:53;4238:7;4229:6;4218:9;4214:22;4193:53;:::i;:::-;4183:63;;4139:117;4295:2;4321:53;4366:7;4357:6;4346:9;4342:22;4321:53;:::i;:::-;4311:63;;4266:118;3917:474;;;;;:::o;4397:90::-;4431:7;4474:5;4467:13;4460:21;4449:32;;4397:90;;;:::o;4493:109::-;4574:21;4589:5;4574:21;:::i;:::-;4569:3;4562:34;4493:109;;:::o;4608:210::-;4695:4;4733:2;4722:9;4718:18;4710:26;;4746:65;4808:1;4797:9;4793:17;4784:6;4746:65;:::i;:::-;4608:210;;;;:::o;4824:104::-;4869:7;4898:24;4916:5;4898:24;:::i;:::-;4887:35;;4824:104;;;:::o;4934:138::-;5015:32;5041:5;5015:32;:::i;:::-;5008:5;5005:43;4995:71;;5062:1;5059;5052:12;4995:71;4934:138;:::o;5078:155::-;5132:5;5170:6;5157:20;5148:29;;5186:41;5221:5;5186:41;:::i;:::-;5078:155;;;;:::o;5239:345::-;5306:6;5355:2;5343:9;5334:7;5330:23;5326:32;5323:119;;;5361:79;;:::i;:::-;5323:119;5481:1;5506:61;5559:7;5550:6;5539:9;5535:22;5506:61;:::i;:::-;5496:71;;5452:125;5239:345;;;;:::o;5590:116::-;5660:21;5675:5;5660:21;:::i;:::-;5653:5;5650:32;5640:60;;5696:1;5693;5686:12;5640:60;5590:116;:::o;5712:133::-;5755:5;5793:6;5780:20;5771:29;;5809:30;5833:5;5809:30;:::i;:::-;5712:133;;;;:::o;5851:468::-;5916:6;5924;5973:2;5961:9;5952:7;5948:23;5944:32;5941:119;;;5979:79;;:::i;:::-;5941:119;6099:1;6124:53;6169:7;6160:6;6149:9;6145:22;6124:53;:::i;:::-;6114:63;;6070:117;6226:2;6252:50;6294:7;6285:6;6274:9;6270:22;6252:50;:::i;:::-;6242:60;;6197:115;5851:468;;;;;:::o;6325:118::-;6412:24;6430:5;6412:24;:::i;:::-;6407:3;6400:37;6325:118;;:::o;6449:222::-;6542:4;6580:2;6569:9;6565:18;6557:26;;6593:71;6661:1;6650:9;6646:17;6637:6;6593:71;:::i;:::-;6449:222;;;;:::o;6677:619::-;6754:6;6762;6770;6819:2;6807:9;6798:7;6794:23;6790:32;6787:119;;;6825:79;;:::i;:::-;6787:119;6945:1;6970:53;7015:7;7006:6;6995:9;6991:22;6970:53;:::i;:::-;6960:63;;6916:117;7072:2;7098:53;7143:7;7134:6;7123:9;7119:22;7098:53;:::i;:::-;7088:63;;7043:118;7200:2;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7171:118;6677:619;;;;;:::o;7302:329::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:119;;;7416:79;;:::i;:::-;7378:119;7536:1;7561:53;7606:7;7597:6;7586:9;7582:22;7561:53;:::i;:::-;7551:63;;7507:117;7302:329;;;;:::o;7637:86::-;7672:7;7712:4;7705:5;7701:16;7690:27;;7637:86;;;:::o;7729:112::-;7812:22;7828:5;7812:22;:::i;:::-;7807:3;7800:35;7729:112;;:::o;7847:214::-;7936:4;7974:2;7963:9;7959:18;7951:26;;7987:67;8051:1;8040:9;8036:17;8027:6;7987:67;:::i;:::-;7847:214;;;;:::o;8067:905::-;8159:6;8167;8175;8183;8191;8240:3;8228:9;8219:7;8215:23;8211:33;8208:120;;;8247:79;;:::i;:::-;8208:120;8367:1;8392:53;8437:7;8428:6;8417:9;8413:22;8392:53;:::i;:::-;8382:63;;8338:117;8494:2;8520:53;8565:7;8556:6;8545:9;8541:22;8520:53;:::i;:::-;8510:63;;8465:118;8622:2;8648:53;8693:7;8684:6;8673:9;8669:22;8648:53;:::i;:::-;8638:63;;8593:118;8750:2;8776:53;8821:7;8812:6;8801:9;8797:22;8776:53;:::i;:::-;8766:63;;8721:118;8878:3;8905:50;8947:7;8938:6;8927:9;8923:22;8905:50;:::i;:::-;8895:60;;8849:116;8067:905;;;;;;;;:::o;8978:329::-;9037:6;9086:2;9074:9;9065:7;9061:23;9057:32;9054:119;;;9092:79;;:::i;:::-;9054:119;9212:1;9237:53;9282:7;9273:6;9262:9;9258:22;9237:53;:::i;:::-;9227:63;;9183:117;8978:329;;;;:::o;9313:866::-;9566:4;9604:3;9593:9;9589:19;9581:27;;9618:71;9686:1;9675:9;9671:17;9662:6;9618:71;:::i;:::-;9699:72;9767:2;9756:9;9752:18;9743:6;9699:72;:::i;:::-;9781;9849:2;9838:9;9834:18;9825:6;9781:72;:::i;:::-;9863;9931:2;9920:9;9916:18;9907:6;9863:72;:::i;:::-;9945:73;10013:3;10002:9;9998:19;9989:6;9945:73;:::i;:::-;10066:9;10060:4;10056:20;10050:3;10039:9;10035:19;10028:49;10094:78;10167:4;10158:6;10094:78;:::i;:::-;10086:86;;9313:866;;;;;;;;;:::o;10185:323::-;10241:6;10290:2;10278:9;10269:7;10265:23;10261:32;10258:119;;;10296:79;;:::i;:::-;10258:119;10416:1;10441:50;10483:7;10474:6;10463:9;10459:22;10441:50;:::i;:::-;10431:60;;10387:114;10185:323;;;;:::o;10514:474::-;10582:6;10590;10639:2;10627:9;10618:7;10614:23;10610:32;10607:119;;;10645:79;;:::i;:::-;10607:119;10765:1;10790:53;10835:7;10826:6;10815:9;10811:22;10790:53;:::i;:::-;10780:63;;10736:117;10892:2;10918:53;10963:7;10954:6;10943:9;10939:22;10918:53;:::i;:::-;10908:63;;10863:118;10514:474;;;;;:::o;10994:227::-;11134:34;11130:1;11122:6;11118:14;11111:58;11203:10;11198:2;11190:6;11186:15;11179:35;10994:227;:::o;11227:366::-;11369:3;11390:67;11454:2;11449:3;11390:67;:::i;:::-;11383:74;;11466:93;11555:3;11466:93;:::i;:::-;11584:2;11579:3;11575:12;11568:19;;11227:366;;;:::o;11599:419::-;11765:4;11803:2;11792:9;11788:18;11780:26;;11852:9;11846:4;11842:20;11838:1;11827:9;11823:17;11816:47;11880:131;12006:4;11880:131;:::i;:::-;11872:139;;11599:419;;;:::o;12024:229::-;12164:34;12160:1;12152:6;12148:14;12141:58;12233:12;12228:2;12220:6;12216:15;12209:37;12024:229;:::o;12259:366::-;12401:3;12422:67;12486:2;12481:3;12422:67;:::i;:::-;12415:74;;12498:93;12587:3;12498:93;:::i;:::-;12616:2;12611:3;12607:12;12600:19;;12259:366;;;:::o;12631:419::-;12797:4;12835:2;12824:9;12820:18;12812:26;;12884:9;12878:4;12874:20;12870:1;12859:9;12855:17;12848:47;12912:131;13038:4;12912:131;:::i;:::-;12904:139;;12631:419;;;:::o;13056:180::-;13104:77;13101:1;13094:88;13201:4;13198:1;13191:15;13225:4;13222:1;13215:15;13242:180;13290:77;13287:1;13280:88;13387:4;13384:1;13377:15;13411:4;13408:1;13401:15;13428:185;13468:1;13485:20;13503:1;13485:20;:::i;:::-;13480:25;;13519:20;13537:1;13519:20;:::i;:::-;13514:25;;13558:1;13548:35;;13563:18;;:::i;:::-;13548:35;13605:1;13602;13598:9;13593:14;;13428:185;;;;:::o;13619:305::-;13659:3;13678:20;13696:1;13678:20;:::i;:::-;13673:25;;13712:20;13730:1;13712:20;:::i;:::-;13707:25;;13866:1;13798:66;13794:74;13791:1;13788:81;13785:107;;;13872:18;;:::i;:::-;13785:107;13916:1;13913;13909:9;13902:16;;13619:305;;;;:::o;13930:348::-;13970:7;13993:20;14011:1;13993:20;:::i;:::-;13988:25;;14027:20;14045:1;14027:20;:::i;:::-;14022:25;;14215:1;14147:66;14143:74;14140:1;14137:81;14132:1;14125:9;14118:17;14114:105;14111:131;;;14222:18;;:::i;:::-;14111:131;14270:1;14267;14263:9;14252:20;;13930:348;;;;:::o;14284:191::-;14324:4;14344:20;14362:1;14344:20;:::i;:::-;14339:25;;14378:20;14396:1;14378:20;:::i;:::-;14373:25;;14417:1;14414;14411:8;14408:34;;;14422:18;;:::i;:::-;14408:34;14467:1;14464;14460:9;14452:17;;14284:191;;;;:::o;14481:85::-;14526:7;14555:5;14544:16;;14481:85;;;:::o;14572:158::-;14630:9;14663:61;14681:42;14690:32;14716:5;14690:32;:::i;:::-;14681:42;:::i;:::-;14663:61;:::i;:::-;14650:74;;14572:158;;;:::o;14736:147::-;14831:45;14870:5;14831:45;:::i;:::-;14826:3;14819:58;14736:147;;:::o;14889:134::-;14947:9;14980:37;15011:5;14980:37;:::i;:::-;14967:50;;14889:134;;;:::o;15029:147::-;15124:45;15163:5;15124:45;:::i;:::-;15119:3;15112:58;15029:147;;:::o;15182:823::-;15439:4;15477:3;15466:9;15462:19;15454:27;;15491:71;15559:1;15548:9;15544:17;15535:6;15491:71;:::i;:::-;15572:72;15640:2;15629:9;15625:18;15616:6;15572:72;:::i;:::-;15654:80;15730:2;15719:9;15715:18;15706:6;15654:80;:::i;:::-;15744;15820:2;15809:9;15805:18;15796:6;15744:80;:::i;:::-;15834:81;15910:3;15899:9;15895:19;15886:6;15834:81;:::i;:::-;15925:73;15993:3;15982:9;15978:19;15969:6;15925:73;:::i;:::-;15182:823;;;;;;;;;:::o;16011:143::-;16068:5;16099:6;16093:13;16084:22;;16115:33;16142:5;16115:33;:::i;:::-;16011:143;;;;:::o;16160:663::-;16248:6;16256;16264;16313:2;16301:9;16292:7;16288:23;16284:32;16281:119;;;16319:79;;:::i;:::-;16281:119;16439:1;16464:64;16520:7;16511:6;16500:9;16496:22;16464:64;:::i;:::-;16454:74;;16410:128;16577:2;16603:64;16659:7;16650:6;16639:9;16635:22;16603:64;:::i;:::-;16593:74;;16548:129;16716:2;16742:64;16798:7;16789:6;16778:9;16774:22;16742:64;:::i;:::-;16732:74;;16687:129;16160:663;;;;;:::o;16829:332::-;16950:4;16988:2;16977:9;16973:18;16965:26;;17001:71;17069:1;17058:9;17054:17;17045:6;17001:71;:::i;:::-;17082:72;17150:2;17139:9;17135:18;17126:6;17082:72;:::i;:::-;16829:332;;;;;:::o;17167:243::-;17307:34;17303:1;17295:6;17291:14;17284:58;17376:26;17371:2;17363:6;17359:15;17352:51;17167:243;:::o;17416:366::-;17558:3;17579:67;17643:2;17638:3;17579:67;:::i;:::-;17572:74;;17655:93;17744:3;17655:93;:::i;:::-;17773:2;17768:3;17764:12;17757:19;;17416:366;;;:::o;17788:419::-;17954:4;17992:2;17981:9;17977:18;17969:26;;18041:9;18035:4;18031:20;18027:1;18016:9;18012:17;18005:47;18069:131;18195:4;18069:131;:::i;:::-;18061:139;;17788:419;;;:::o;18213:224::-;18353:34;18349:1;18341:6;18337:14;18330:58;18422:7;18417:2;18409:6;18405:15;18398:32;18213:224;:::o;18443:366::-;18585:3;18606:67;18670:2;18665:3;18606:67;:::i;:::-;18599:74;;18682:93;18771:3;18682:93;:::i;:::-;18800:2;18795:3;18791:12;18784:19;;18443:366;;;:::o;18815:419::-;18981:4;19019:2;19008:9;19004:18;18996:26;;19068:9;19062:4;19058:20;19054:1;19043:9;19039:17;19032:47;19096:131;19222:4;19096:131;:::i;:::-;19088:139;;18815:419;;;:::o;19240:180::-;19288:77;19285:1;19278:88;19385:4;19382:1;19375:15;19409:4;19406:1;19399:15;19426:320;19470:6;19507:1;19501:4;19497:12;19487:22;;19554:1;19548:4;19544:12;19575:18;19565:81;;19631:4;19623:6;19619:17;19609:27;;19565:81;19693:2;19685:6;19682:14;19662:18;19659:38;19656:84;;;19712:18;;:::i;:::-;19656:84;19477:269;19426:320;;;:::o;19752:225::-;19892:34;19888:1;19880:6;19876:14;19869:58;19961:8;19956:2;19948:6;19944:15;19937:33;19752:225;:::o;19983:366::-;20125:3;20146:67;20210:2;20205:3;20146:67;:::i;:::-;20139:74;;20222:93;20311:3;20222:93;:::i;:::-;20340:2;20335:3;20331:12;20324:19;;19983:366;;;:::o;20355:419::-;20521:4;20559:2;20548:9;20544:18;20536:26;;20608:9;20602:4;20598:20;20594:1;20583:9;20579:17;20572:47;20636:131;20762:4;20636:131;:::i;:::-;20628:139;;20355:419;;;:::o;20780:223::-;20920:34;20916:1;20908:6;20904:14;20897:58;20989:6;20984:2;20976:6;20972:15;20965:31;20780:223;:::o;21009:366::-;21151:3;21172:67;21236:2;21231:3;21172:67;:::i;:::-;21165:74;;21248:93;21337:3;21248:93;:::i;:::-;21366:2;21361:3;21357:12;21350:19;;21009:366;;;:::o;21381:419::-;21547:4;21585:2;21574:9;21570:18;21562:26;;21634:9;21628:4;21624:20;21620:1;21609:9;21605:17;21598:47;21662:131;21788:4;21662:131;:::i;:::-;21654:139;;21381:419;;;:::o;21806:221::-;21946:34;21942:1;21934:6;21930:14;21923:58;22015:4;22010:2;22002:6;21998:15;21991:29;21806:221;:::o;22033:366::-;22175:3;22196:67;22260:2;22255:3;22196:67;:::i;:::-;22189:74;;22272:93;22361:3;22272:93;:::i;:::-;22390:2;22385:3;22381:12;22374:19;;22033:366;;;:::o;22405:419::-;22571:4;22609:2;22598:9;22594:18;22586:26;;22658:9;22652:4;22648:20;22644:1;22633:9;22629:17;22622:47;22686:131;22812:4;22686:131;:::i;:::-;22678:139;;22405:419;;;:::o;22830:182::-;22970:34;22966:1;22958:6;22954:14;22947:58;22830:182;:::o;23018:366::-;23160:3;23181:67;23245:2;23240:3;23181:67;:::i;:::-;23174:74;;23257:93;23346:3;23257:93;:::i;:::-;23375:2;23370:3;23366:12;23359:19;;23018:366;;;:::o;23390:419::-;23556:4;23594:2;23583:9;23579:18;23571:26;;23643:9;23637:4;23633:20;23629:1;23618:9;23614:17;23607:47;23671:131;23797:4;23671:131;:::i;:::-;23663:139;;23390:419;;;:::o;23815:224::-;23955:34;23951:1;23943:6;23939:14;23932:58;24024:7;24019:2;24011:6;24007:15;24000:32;23815:224;:::o;24045:366::-;24187:3;24208:67;24272:2;24267:3;24208:67;:::i;:::-;24201:74;;24284:93;24373:3;24284:93;:::i;:::-;24402:2;24397:3;24393:12;24386:19;;24045:366;;;:::o;24417:419::-;24583:4;24621:2;24610:9;24606:18;24598:26;;24670:9;24664:4;24660:20;24656:1;24645:9;24641:17;24634:47;24698:131;24824:4;24698:131;:::i;:::-;24690:139;;24417:419;;;:::o;24842:222::-;24982:34;24978:1;24970:6;24966:14;24959:58;25051:5;25046:2;25038:6;25034:15;25027:30;24842:222;:::o;25070:366::-;25212:3;25233:67;25297:2;25292:3;25233:67;:::i;:::-;25226:74;;25309:93;25398:3;25309:93;:::i;:::-;25427:2;25422:3;25418:12;25411:19;;25070:366;;;:::o;25442:419::-;25608:4;25646:2;25635:9;25631:18;25623:26;;25695:9;25689:4;25685:20;25681:1;25670:9;25666:17;25659:47;25723:131;25849:4;25723:131;:::i;:::-;25715:139;;25442:419;;;:::o;25867:182::-;26007:34;26003:1;25995:6;25991:14;25984:58;25867:182;:::o;26055:366::-;26197:3;26218:67;26282:2;26277:3;26218:67;:::i;:::-;26211:74;;26294:93;26383:3;26294:93;:::i;:::-;26412:2;26407:3;26403:12;26396:19;;26055:366;;;:::o;26427:419::-;26593:4;26631:2;26620:9;26616:18;26608:26;;26680:9;26674:4;26670:20;26666:1;26655:9;26651:17;26644:47;26708:131;26834:4;26708:131;:::i;:::-;26700:139;;26427:419;;;:::o;26852:228::-;26992:34;26988:1;26980:6;26976:14;26969:58;27061:11;27056:2;27048:6;27044:15;27037:36;26852:228;:::o;27086:366::-;27228:3;27249:67;27313:2;27308:3;27249:67;:::i;:::-;27242:74;;27325:93;27414:3;27325:93;:::i;:::-;27443:2;27438:3;27434:12;27427:19;;27086:366;;;:::o;27458:419::-;27624:4;27662:2;27651:9;27647:18;27639:26;;27711:9;27705:4;27701:20;27697:1;27686:9;27682:17;27675:47;27739:131;27865:4;27739:131;:::i;:::-;27731:139;;27458:419;;;:::o;27883:236::-;28023:34;28019:1;28011:6;28007:14;28000:58;28092:19;28087:2;28079:6;28075:15;28068:44;27883:236;:::o;28125:366::-;28267:3;28288:67;28352:2;28347:3;28288:67;:::i;:::-;28281:74;;28364:93;28453:3;28364:93;:::i;:::-;28482:2;28477:3;28473:12;28466:19;;28125:366;;;:::o;28497:419::-;28663:4;28701:2;28690:9;28686:18;28678:26;;28750:9;28744:4;28740:20;28736:1;28725:9;28721:17;28714:47;28778:131;28904:4;28778:131;:::i;:::-;28770:139;;28497:419;;;:::o;28922:182::-;29062:34;29058:1;29050:6;29046:14;29039:58;28922:182;:::o;29110:366::-;29252:3;29273:67;29337:2;29332:3;29273:67;:::i;:::-;29266:74;;29349:93;29438:3;29349:93;:::i;:::-;29467:2;29462:3;29458:12;29451:19;;29110:366;;;:::o;29482:419::-;29648:4;29686:2;29675:9;29671:18;29663:26;;29735:9;29729:4;29725:20;29721:1;29710:9;29706:17;29699:47;29763:131;29889:4;29763:131;:::i;:::-;29755:139;;29482:419;;;:::o;29907:220::-;30047:34;30043:1;30035:6;30031:14;30024:58;30116:3;30111:2;30103:6;30099:15;30092:28;29907:220;:::o;30133:366::-;30275:3;30296:67;30360:2;30355:3;30296:67;:::i;:::-;30289:74;;30372:93;30461:3;30372:93;:::i;:::-;30490:2;30485:3;30481:12;30474:19;;30133:366;;;:::o;30505:419::-;30671:4;30709:2;30698:9;30694:18;30686:26;;30758:9;30752:4;30748:20;30744:1;30733:9;30729:17;30722:47;30786:131;30912:4;30786:131;:::i;:::-;30778:139;;30505:419;;;:::o;30930:180::-;30978:77;30975:1;30968:88;31075:4;31072:1;31065:15;31099:4;31096:1;31089:15;31116:180;31164:77;31161:1;31154:88;31261:4;31258:1;31251:15;31285:4;31282:1;31275:15;31302:143;31359:5;31390:6;31384:13;31375:22;;31406:33;31433:5;31406:33;:::i;:::-;31302:143;;;;:::o;31451:351::-;31521:6;31570:2;31558:9;31549:7;31545:23;31541:32;31538:119;;;31576:79;;:::i;:::-;31538:119;31696:1;31721:64;31777:7;31768:6;31757:9;31753:22;31721:64;:::i;:::-;31711:74;;31667:128;31451:351;;;;:::o;31808:114::-;31875:6;31909:5;31903:12;31893:22;;31808:114;;;:::o;31928:184::-;32027:11;32061:6;32056:3;32049:19;32101:4;32096:3;32092:14;32077:29;;31928:184;;;;:::o;32118:132::-;32185:4;32208:3;32200:11;;32238:4;32233:3;32229:14;32221:22;;32118:132;;;:::o;32256:108::-;32333:24;32351:5;32333:24;:::i;:::-;32328:3;32321:37;32256:108;;:::o;32370:179::-;32439:10;32460:46;32502:3;32494:6;32460:46;:::i;:::-;32538:4;32533:3;32529:14;32515:28;;32370:179;;;;:::o;32555:113::-;32625:4;32657;32652:3;32648:14;32640:22;;32555:113;;;:::o;32704:732::-;32823:3;32852:54;32900:5;32852:54;:::i;:::-;32922:86;33001:6;32996:3;32922:86;:::i;:::-;32915:93;;33032:56;33082:5;33032:56;:::i;:::-;33111:7;33142:1;33127:284;33152:6;33149:1;33146:13;33127:284;;;33228:6;33222:13;33255:63;33314:3;33299:13;33255:63;:::i;:::-;33248:70;;33341:60;33394:6;33341:60;:::i;:::-;33331:70;;33187:224;33174:1;33171;33167:9;33162:14;;33127:284;;;33131:14;33427:3;33420:10;;32828:608;;;32704:732;;;;:::o;33442:831::-;33705:4;33743:3;33732:9;33728:19;33720:27;;33757:71;33825:1;33814:9;33810:17;33801:6;33757:71;:::i;:::-;33838:80;33914:2;33903:9;33899:18;33890:6;33838:80;:::i;:::-;33965:9;33959:4;33955:20;33950:2;33939:9;33935:18;33928:48;33993:108;34096:4;34087:6;33993:108;:::i;:::-;33985:116;;34111:72;34179:2;34168:9;34164:18;34155:6;34111:72;:::i;:::-;34193:73;34261:3;34250:9;34246:19;34237:6;34193:73;:::i;:::-;33442:831;;;;;;;;:::o;34279:234::-;34419:34;34415:1;34407:6;34403:14;34396:58;34488:17;34483:2;34475:6;34471:15;34464:42;34279:234;:::o;34519:366::-;34661:3;34682:67;34746:2;34741:3;34682:67;:::i;:::-;34675:74;;34758:93;34847:3;34758:93;:::i;:::-;34876:2;34871:3;34867:12;34860:19;;34519:366;;;:::o;34891:419::-;35057:4;35095:2;35084:9;35080:18;35072:26;;35144:9;35138:4;35134:20;35130:1;35119:9;35115:17;35108:47;35172:131;35298:4;35172:131;:::i;:::-;35164:139;;34891:419;;;:::o

Swarm Source

ipfs://585261adc1494bd190d15d8259ba8cfad00dfe5cae9e47a8b02baee240d4d295
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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