Token Louverture

Overview ERC20

Price
$0.00 @ 0.000000 AVAX
Fully Diluted Market Cap
Total Supply:
1,000,000,000 LVT

Holders:
10,759 addresses

Transfers:
-

Contract:
0xff579d6259dedcc80488c9b89d2820bcb56091600xff579d6259dEDcc80488c9b89d2820bCb5609160

Decimals:
18

Social Profiles:
Not Available, Update ?

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
LVT

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-14
*/

/*
 *        __                                        __                                  ______    _                                      
 *       / /   ____   __  __ _   __  ___    _____  / /_  __  __   _____  ___           / ____/   (_)   ____   ____ _   ____   _____  ___ 
 *      / /   / __ \ / / / /| | / / / _ \  / ___/ / __/ / / / /  / ___/ / _ \         / /_      / /   / __ \ / __ `/  / __ \ / ___/ / _ \
 *     / /___/ /_/ // /_/ / | |/ / /  __/ / /    / /_  / /_/ /  / /    /  __/        / __/     / /   / / / // /_/ /  / / / // /__  /  __/
 *    /_____/\____/ \__,_/  |___/  \___/ /_/     \__/  \__,_/  /_/     \___/        /_/       /_/   /_/ /_/ \__,_/  /_/ /_/ \___/  \___/ 
 *                              
 
 *
 *    Web:      https://www.louverture.finance/
 *    Telegram: https://t.me/louverture_fi
 *    Discord:  https://discord.gg/HKjuqjdN
 *    Twitter:  https://twitter.com/louverture_fi
 *
 *    Created with Love by the DevTheApe.eth Team 
 */


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title SafeMathUint
 * @dev Math operations with safety TKNcks that revert on error
 */
library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0, "toInt256Safe: B LESS THAN ZERO");
        return b;
    }
}

pragma solidity ^0.8.0;

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety TKNcks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(
            c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256),
            "mul: A B C combi values invalid with MIN_INT256"
        );
        require((b == 0) || (c / b == a), "mul: A B C combi values invalid");
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256, "div: b == 1 OR A == MIN_INT256");

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require(
            (b >= 0 && c <= a) || (b < 0 && c > a),
            "sub: A B C combi values invalid"
        );
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require(
            (b >= 0 && c >= a) || (b < 0 && c < a),
            "add: A B C combi values invalid"
        );
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256, "abs: A EQUAL MIN INT256");
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0, "toUint256Safe: A LESS THAN ZERO");
        return uint256(a);
    }
}

pragma solidity ^0.8.0;

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

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is TKNaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouTKNd) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouTKNd) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
    public
    view
    returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
    public
    view
    returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

// OpenZeppelin Contracts v4.3.2 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     */
    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
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
    internal
    returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

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

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

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

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

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

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

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

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

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

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

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

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

interface IJoeRouter01 {
    function factory() external pure returns (address);

    function WAVAX() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
    external
    returns (
        uint256 amountA,
        uint256 amountB,
        uint256 liquidity
    );

    function addLiquidityAVAX(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    )
    external
    payable
    returns (
        uint256 amountToken,
        uint256 amountAVAX,
        uint256 liquidity
    );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityAVAX(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountAVAX);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityAVAXWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountAVAX);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactAVAXForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactAVAX(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForAVAX(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapAVAXForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}


// pragma solidity >=0.6.2;

interface IJoeRouter02 is IJoeRouter01 {
    function removeLiquidityAVAXSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountAVAX);

    function removeLiquidityAVAXWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountAVAX);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactAVAXForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForAVAXSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}


interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
    external
    view
    returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
    external
    view
    returns (
        uint112 reserve0,
        uint112 reserve1,
        uint32 blockTimestampLast
    );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
    external
    returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IJoeFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function migrator() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function setMigrator(address) external;
}


pragma solidity ^0.8.0;

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

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

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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

pragma solidity ^0.8.0;

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
    public
    view
    virtual
    override
    returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
    public
    virtual
    override
    returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
    public
    view
    virtual
    override
    returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
    public
    virtual
    override
    returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
    public
    virtual
    returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.3.2 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(
        IERC20 indexed token,
        address to,
        uint256 amount
    );
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account)
    public
    view
    returns (uint256)
    {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) +
        totalReleased(token);
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(token, account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return
        (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

contract NODERewardManagement {
    using SafeMath for uint256;
    using IterableMapping for IterableMapping.Map;

    struct NodeEntity {
        string name;
        uint256 creationTime;
        uint256 lastClaimTime; 
        uint256 rewardMult;
        uint256 nodeValue;
        uint256 rewardAvailable;
        uint256 addValueCount;
    }

    IterableMapping.Map private nodeOwners;
    mapping(address => NodeEntity[]) private _nodesOfUser;

    uint256 public nodeMinPrice;
    uint256 public rewardPerValue;
    uint256 public claimTime;

    address public gateKeeper;
    address public token;

    bool public autoDistri = true;
    bool public distribution = false;

    uint256 public gasForDistribution = 300000;
    uint256 public lastDistributionCount = 0;
    uint256 public lastIndexProcessed = 0;

    uint256[] public tierLevel = [100000,105000,110000,120000,130000,140000];
    uint256[] public tierSlope = [1000,500,100,50,10,0];

    uint256 public totalNodesCreated = 0;
    uint256 public totalRewardStaked = 0;

    constructor(
        uint256 _nodeMinPrice,
        uint256 _rewardPerValue,
        uint256 _claimTime
    ) {
        nodeMinPrice = _nodeMinPrice;
        rewardPerValue = _rewardPerValue;
        claimTime = _claimTime;
        gateKeeper = msg.sender;
    }

    modifier onlySentry() {
        require(msg.sender == token || msg.sender == gateKeeper, "Fuck off");
        _;
    }

    function setToken (address token_) external onlySentry {
        token = token_;
    }


    function distributeRewards(uint256 gas, uint256 rewardValue)
    private
    returns (
        uint256,
        uint256,
        uint256
    )
    {
        distribution = true;
        uint256 numberOfnodeOwners = nodeOwners.keys.length;
        require(numberOfnodeOwners > 0, "DISTRI REWARDS: NO NODE OWNERS");
        if (numberOfnodeOwners == 0) {
            return (0, 0, lastIndexProcessed);
        }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 newGasLeft;
        uint256 localLastIndex = lastIndexProcessed;
        uint256 iterations = 0;
        uint256 newClaimTime = block.timestamp;
        uint256 nodesCount;
        uint256 claims = 0;
        NodeEntity[] storage nodes;
        NodeEntity storage _node;

        while (gasUsed < gas && iterations < numberOfnodeOwners) {
            localLastIndex++;
            if (localLastIndex >= nodeOwners.keys.length) {
                localLastIndex = 0;
            }
            nodes = _nodesOfUser[nodeOwners.keys[localLastIndex]];
            nodesCount = nodes.length;
            for (uint256 i = 0; i < nodesCount; i++) {
                _node = nodes[i];
                if (claimable(_node)) {
                    _node.rewardAvailable += rewardValue;
                    _node.lastClaimTime = newClaimTime;
                    totalRewardStaked += rewardValue;
                    claims++;
                }
            }
            iterations++;

            newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }
        lastIndexProcessed = localLastIndex;
        distribution = false;
        return (iterations, claims, lastIndexProcessed);
    }


    function createNode(address account, string memory nodeName, uint256  _nodeInitialValue) external onlySentry {
        require(
            isNameAvailable(account, nodeName),
            "CREATE NODE: Name not available"
        );
        _nodesOfUser[account].push(
            NodeEntity({
                name: nodeName,
                creationTime: block.timestamp,
                lastClaimTime: block.timestamp,
                rewardMult: 100000,
                nodeValue: _nodeInitialValue,
                addValueCount: 0,
                rewardAvailable: rewardPerValue
        })
        );
        nodeOwners.set(account, _nodesOfUser[account].length);
        totalNodesCreated++;
        if (autoDistri && !distribution) {
            distributeRewards(gasForDistribution, rewardPerValue);
        }
    }

    function isNameAvailable(address account, string memory nodeName)
    private
    view
    returns (bool)
    {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        for (uint256 i = 0; i < nodes.length; i++) {
            if (keccak256(bytes(nodes[i].name)) == keccak256(bytes(nodeName))) {
                return false;
            }
        }
        return true;
    }

    function _burn(uint256 index) internal {
        require(index < nodeOwners.size());
        nodeOwners.remove(nodeOwners.getKeyAtIndex(index));
    }

    function _getNodeWithCreatime(
        NodeEntity[] storage nodes,
        uint256 _creationTime
    ) private view returns (NodeEntity storage) {
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        bool found = false;
        int256 index = binary_search(nodes, 0, numberOfNodes, _creationTime);
        uint256 validIndex;
        if (index >= 0) {
            found = true;
            validIndex = uint256(index);
        }
        require(found, "NODE SEARCH: No NODE Found with this blocktime");
        return nodes[validIndex];
    }

    function binary_search(
        NodeEntity[] memory arr,
        uint256 low,
        uint256 high,
        uint256 x
    ) private view returns (int256) {
        if (high >= low) {
            uint256 mid = (high + low).div(2);
            if (arr[mid].creationTime == x) {
                return int256(mid);
            } else if (arr[mid].creationTime > x) {
                return binary_search(arr, low, mid - 1, x);
            } else {
                return binary_search(arr, mid + 1, high, x);
            }
        } else {
            return -1;
        }
    }

    function _cashoutNodeReward(address account, uint256 _creationTime)
    external onlySentry
    returns (uint256)
    {
        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime);
        uint256 rewardNode = node.rewardAvailable.mul(node.rewardMult).mul(node.nodeValue).div(100000).div(1e18);
        node.rewardAvailable = 0;
        node.rewardMult = 100000;
        node.addValueCount = 0;
        return rewardNode;
    }

    function _cashoutAllNodesReward(address account)
    external onlySentry
    returns (uint256)
    {
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        require(nodesCount > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity storage _node;
        uint256 rewardsTotal = 0;
        for (uint256 i = 0; i < nodesCount; i++) {
            _node = nodes[i];
            rewardsTotal += _node.rewardAvailable.mul(_node.rewardMult).mul(_node.nodeValue).div(100000).div(1e18);
            _node.rewardAvailable = 0;
            _node.rewardMult = 100000;
            _node.addValueCount = 0;
        }
        return rewardsTotal;
    }

    function _addNodeValue(address account, uint256 _creationTime)
    external onlySentry
    returns (uint256)
    {
        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime);
        uint256 rewardNode = node.rewardAvailable.mul(node.rewardMult).mul(node.nodeValue).div(100000).div(1e18);
        node.nodeValue += rewardNode;
        uint256 prevMult = node.rewardMult;
        if (rewardNode > 0) {
            if (prevMult >= tierLevel[5]) {
                node.rewardMult += tierSlope[5];
            } else if (prevMult >= tierLevel[4]) {
                node.rewardMult += tierSlope[4];
            } else if (prevMult >= tierLevel[3]) {
                node.rewardMult += tierSlope[2];
            } else if (prevMult >= tierLevel[2]) {
                node.rewardMult += tierSlope[2];
            } else if (prevMult >= tierLevel[1]) {
                node.rewardMult += tierSlope[1]; 
            } else {
                node.rewardMult += tierSlope[0];
            }

            node.rewardAvailable = 0;
            node.addValueCount += 1;
        }
        return rewardNode;
    }

    function _addAllNodeValue(address account)
    external onlySentry
    returns (uint256)
    {
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        require(nodesCount > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity storage _node;
        uint256 rewardsTotal = 0;
        for (uint256 i = 0; i < nodesCount; i++) {
            _node = nodes[i];
            rewardsTotal += _node.rewardAvailable.mul(_node.rewardMult).mul(_node.nodeValue).div(100000).div(1e18);
            _node.nodeValue += _node.rewardAvailable.mul(_node.rewardMult).mul(_node.nodeValue).div(100000).div(1e18);
            uint256 prevMult = _node.rewardMult;
            if ( _node.rewardAvailable > 0) {
                if (prevMult >= tierLevel[5]) {
                    _node.rewardMult += tierSlope[5];
                } else if (prevMult >= tierLevel[4]) {
                    _node.rewardMult += tierSlope[4];
                } else if (prevMult >= tierLevel[3]) {
                    _node.rewardMult += tierSlope[2]; 
                } else if (prevMult >= tierLevel[2]) {
                    _node.rewardMult += tierSlope[2];
                } else if (prevMult >= tierLevel[1]) {
                    _node.rewardMult += tierSlope[1];
                } else {
                    _node.rewardMult += tierSlope[0];
                }
                _node.rewardAvailable = 0;
                _node.addValueCount += 1; 
            }
        }
        return rewardsTotal;
    }

    function claimable(NodeEntity memory node) private view returns (bool) {
        return node.lastClaimTime + claimTime <= block.timestamp;
    }


    function _getNodeValueOf(address account)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");
        uint256 nodesCount;
        uint256 valueCount = 0;

        NodeEntity[] storage nodes = _nodesOfUser[account];
        nodesCount = nodes.length;

        for (uint256 i = 0; i < nodesCount; i++) {
            valueCount += nodes[i].nodeValue;
        }

        return valueCount;
    }


    function _getNodeValueOf(address account, uint256 _creationTime)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");

        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime);
        uint256 valueNode = node.nodeValue;
        return valueNode;
    }


    function _getNodeValueAmountOf(address account, uint256 creationTime)
    external
    view
    returns (uint256)
    {
        return
        _getNodeWithCreatime(_nodesOfUser[account], creationTime)
        .nodeValue;
    }

    function _getAddValueCountOf(address account, uint256 _creationTime)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");

        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime);
        uint256 valueNode = node.addValueCount;
        return valueNode;
    }

    function _getRewardMultOf(address account)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");
        uint256 nodesCount;
        uint256 valueCount = 0;
        uint256 totalCount = 0;
        uint256 rewardMult;

        NodeEntity[] storage nodes = _nodesOfUser[account];
        nodesCount = nodes.length;

        for (uint256 i = 0; i < nodesCount; i++) {
            totalCount += nodes[i].nodeValue.mul(nodes[i].rewardMult);
            valueCount += nodes[i].nodeValue;
        }

        rewardMult = totalCount.div(valueCount);

        return rewardMult;
    }


    function _getRewardMultOf(address account, uint256 _creationTime)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");

        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime);
        uint256 valueNode = node.rewardMult;
        return valueNode;
    }

    function _getRewardMultAmountOf(address account, uint256 creationTime)
    external
    view
    returns (uint256)
    {
        return
        _getNodeWithCreatime(_nodesOfUser[account], creationTime)
        .rewardMult;
    }


    function _getRewardAmountOf(address account)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");
        uint256 nodesCount;
        uint256 rewardCount = 0;

        NodeEntity[] storage nodes = _nodesOfUser[account];
        nodesCount = nodes.length;

        for (uint256 i = 0; i < nodesCount; i++) {
            rewardCount += nodes[i].rewardAvailable.mul(nodes[i].rewardMult).mul(nodes[i].nodeValue).div(100000).div(1e18);
        }

        return rewardCount;
    }


    function _getRewardAmountOf(address account, uint256 _creationTime)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");

        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime);
        uint256 rewardNode = node.rewardAvailable.mul(node.rewardMult).mul(node.nodeValue).div(100000).div(1e18);
        return rewardNode;
    }

    function _getNodeRewardAmountOf(address account, uint256 creationTime)
    external
    view
    returns (uint256)
    {
        return
        _getNodeWithCreatime(_nodesOfUser[account], creationTime)
        .rewardAvailable.mul(_getNodeWithCreatime(_nodesOfUser[account], creationTime).rewardMult).mul(_getNodeWithCreatime(_nodesOfUser[account], creationTime).nodeValue).div(100000).div(1e18);
    }

    function _getNodesNames(address account)
    external
    view
    returns (string memory)
    {
        require(isNodeOwner(account), "GET NAMES: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory names = nodes[0].name;
        string memory separator = "#";
        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];
            names = string(abi.encodePacked(names, separator, _node.name));
        }
        return names;
    }

    function _getNodesCreationTime(address account)
    external
    view
    returns (string memory)
    {
        require(isNodeOwner(account), "GET CREATIME: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _creationTimes = uint2str(nodes[0].creationTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _creationTimes = string(
                abi.encodePacked(
                    _creationTimes,
                    separator,
                    uint2str(_node.creationTime)
                )
            );
        }
        return _creationTimes;
    }

    function _getNodesRewardAvailable(address account)
    external
    view
    returns (string memory)
    {
        require(isNodeOwner(account), "GET REWARD: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _rewardsAvailable = uint2str(nodes[0].rewardAvailable.mul(nodes[0].rewardMult).mul(nodes[0].nodeValue).div(100000).div(1e18));
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];
            uint256 _totalReward = _node.rewardAvailable.mul(_node.rewardMult).mul(_node.nodeValue).div(100000).div(1e18);
            _rewardsAvailable = string(
                abi.encodePacked(
                    _rewardsAvailable,
                    separator,
                    uint2str(_totalReward)
                )
            );
        }
        return _rewardsAvailable;
    }

    function _getNodesLastClaimTime(address account)
    external
    view
    returns (string memory)
    {
        require(isNodeOwner(account), "LAST CLAIME TIME: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _lastClaimTimes = uint2str(nodes[0].lastClaimTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _lastClaimTimes = string(
                abi.encodePacked(
                    _lastClaimTimes,
                    separator,
                    uint2str(_node.lastClaimTime)
                )
            );
        }
        return _lastClaimTimes;
    }

    function uint2str(uint256 _i)
    internal
    pure
    returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    function _changeNodeMinPrice(uint256 newNodeMinPrice) external onlySentry {
        nodeMinPrice = newNodeMinPrice;
    }

    function _changeRewardPerValue(uint256 newPrice) external onlySentry {
        rewardPerValue = newPrice;
    }

    function _changeClaimTime(uint256 newTime) external onlySentry {
        claimTime = newTime;
    }

    function _changeAutoDistri(bool newMode) external onlySentry {
        autoDistri = newMode;
    }

    function _changeTierSystem(uint256[] memory newTierLevel, uint256[] memory newTierSlope) external onlySentry {
        tierLevel = newTierLevel;
        tierSlope = newTierSlope;
    }

    function _changeGasDistri(uint256 newGasDistri) external onlySentry {
        gasForDistribution = newGasDistri;
    }

    function _getNodeNumberOf(address account) public view returns (uint256) {
        return nodeOwners.get(account);
    }

    function isNodeOwner(address account) private view returns (bool) {
        return nodeOwners.get(account) > 0;
    }

    function _isNodeOwner(address account) external view returns (bool) {
        return isNodeOwner(account);
    }

    function _distributeRewards()
    external  onlySentry
    returns (
        uint256,
        uint256,
        uint256
    )
    {
        return distributeRewards(gasForDistribution, rewardPerValue);
    }
}

pragma solidity ^0.8.0;

contract LVT is ERC20, Ownable, PaymentSplitter {
    using SafeMath for uint256;

    NODERewardManagement public nodeRewardManager;

    IJoeRouter02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public futurUsePool;
    address public distributionPool;
    address public devPool;

    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    uint256 public rewardsFee;
    uint256 public liquidityPoolFee;
    uint256 public futurFee;
    uint256 public totalFees;

    uint256 public cashoutFee;

    uint256 private rwSwap;
    uint256 private devShare;
    bool private swapping = false;
    bool private swapLiquify = true;
    uint256 public swapTokensAmount;

    bool private tradingOpen = false;
    uint256 private snipeBlockAmt;
    uint256 private _openTradingBlock = 0;
    uint256 private maxTx = 1;

    mapping(address => bool) public _isBlacklisted;
    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );


    constructor(
        address[] memory payees,
        uint256[] memory shares,
        address[] memory addresses,
        uint256[] memory balances,
        address uniV2Router,
        uint256 snipeBlkAmt
    ) ERC20("Louverture", "LVT") PaymentSplitter(payees, shares) {

        futurUsePool = addresses[4];
        distributionPool = addresses[5];
        devPool = addresses[6];
        snipeBlockAmt = snipeBlkAmt;

        require(futurUsePool != address(0) && distributionPool != address(0) && devPool != address(0), "FUTUR, DEV & REWARD ADDRESS CANNOT BE ZERO");

        require(uniV2Router != address(0), "ROUTER CANNOT BE ZERO");
        IJoeRouter02 _uniswapV2Router = IJoeRouter02(uniV2Router);

        address _uniswapV2Pair = IJoeFactory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WAVAX());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        futurFee = 20;
        rewardsFee = 70;
        liquidityPoolFee = 10;
        cashoutFee = 10;
        rwSwap = 20;
        devShare = 50;

        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);

        require(addresses.length > 0 && balances.length > 0, "CONSTR: addresses array length must be greater than zero");
        require(addresses.length == balances.length, "CONSTR: addresses arrays length mismatch");

        for (uint256 i = 0; i < addresses.length; i++) {
            _mint(addresses[i], balances[i] * (10**18));
        }
        require(totalSupply() == 1000000000e18, "CONSTR: totalSupply must equal 1 billion");
        swapTokensAmount = 500 * (10**18);
    }

    function setNodeManagement(address nodeManagement) external onlyOwner {
        nodeRewardManager = NODERewardManagement(nodeManagement);
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "TKN: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IJoeRouter02(newAddress);
        address _uniswapV2Pair = IJoeFactory(uniswapV2Router.factory())
        .createPair(address(this), uniswapV2Router.WAVAX());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function updateSwapTokensAmount(uint256 newVal) external onlyOwner {
        swapTokensAmount = newVal;
    }

    function updateFuturWall(address payable wall) external onlyOwner {
        futurUsePool = wall;
    }

    function updateDevWall(address payable wall) external onlyOwner {
        devPool = wall;
    }

    function updateRewardsWall(address payable wall) external onlyOwner {
        distributionPool = wall;
    }

    function updateRewardsFee(uint256 value) external onlyOwner {
        rewardsFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateLiquiditFee(uint256 value) external onlyOwner {
        liquidityPoolFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateFuturFee(uint256 value) external onlyOwner {
        futurFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateCashoutFee(uint256 value) external onlyOwner {
        cashoutFee = value;
    }

    function updateRwSwapFee(uint256 value) external onlyOwner {
        rwSwap = value;
    }

    function updateDevShare(uint256 value) external onlyOwner {
        devShare = value;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
    public
    onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "TKN: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function blacklistMalicious(address account, bool value)
    external
    onlyOwner
    {
        _isBlacklisted[account] = value;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "TKN: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(
            !_isBlacklisted[from] && !_isBlacklisted[to],
            "Blacklisted address"
        );
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        if (from != owner() && to != uniswapV2Pair && to != address(uniswapV2Router) && to != address(this) && from != address(this)) {
            require(tradingOpen, "Trading not yet enabled.");

            // anti whale
            if (to != futurUsePool && to != distributionPool && to != devPool && from != futurUsePool && from != distributionPool && from != devPool) {
                uint256 totalSupply = totalSupply();
                uint256 walletBalance = balanceOf(address(to));
                require(
                    amount.add(walletBalance) <= totalSupply.mul(maxTx).div(10000), 
                    "STOP TRYING TO BECOME A WHALE. WE KNOW WHO YOU ARE.")
                ;
            }
        }
        super._transfer(from, to, amount);
    }

    function swapAndSendToFee(address destination, uint256 tokens) private {
        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(tokens);
        uint256 newBalance = (address(this).balance).sub(initialETHBalance);
        payable(destination).transfer(newBalance);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        uint256 initialBalance = address(this).balance;

        swapTokensForEth(half);

        uint256 newBalance = address(this).balance.sub(initialBalance);

        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WAVAX();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForAVAXSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityAVAX{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0),
            block.timestamp
        );
    }

    function createNodeWithTokens(string memory name, uint256  _initValue) public {
        require(
            bytes(name).length > 3 && bytes(name).length < 32,
            "NODE CREATION: NAME SIZE INVALID"
        );
        address sender = _msgSender();
        require(
            sender != address(0),
            "NODE CREATION:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "NODE CREATION: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool && sender != devPool,
            "NODE CREATION: futur, dev and rewardsPool cannot create node"
        );
    
        uint256 nodeMinPrice = nodeRewardManager.nodeMinPrice();
        uint256 nodePrice = _initValue;
        require(
            nodePrice >= nodeMinPrice,
            "NODE CREATION: Node Value set below nodeMinPrice"
        );
        require(
            balanceOf(sender) >= nodePrice.mul(1e18),
            "NODE CREATION: Balance too low for creation. Use lower initValue"
        );
        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapAmountOk = contractTokenBalance >= swapTokensAmount;
        if (
            swapAmountOk &&
            swapLiquify &&
            !swapping &&
            sender != owner() &&
            !automatedMarketMakerPairs[sender]
        ) {
            swapping = true;

            uint256 fdTokens = contractTokenBalance.mul(futurFee).div(100);
            uint256 devTokens = fdTokens.mul(devShare).div(100);
            uint256 futurTokens = fdTokens.sub(devTokens);

            swapAndSendToFee(devPool, devTokens);
            swapAndSendToFee(futurUsePool, futurTokens);

            uint256 rewardsPoolTokens = contractTokenBalance
            .mul(rewardsFee)
            .div(100);

            uint256 rewardsTokenstoSwap = rewardsPoolTokens.mul(rwSwap).div(
                100
            );

            swapAndSendToFee(distributionPool, rewardsTokenstoSwap);
            super._transfer(
                address(this),
                distributionPool,
                rewardsPoolTokens.sub(rewardsTokenstoSwap)
            );

            uint256 swapTokens = contractTokenBalance.mul(liquidityPoolFee).div(
                100
            );

            swapAndLiquify(swapTokens);

            swapTokensForEth(balanceOf(address(this)));

            swapping = false;
        }
        super._transfer(sender, address(this), nodePrice.mul(1e18));
        nodeRewardManager.createNode(sender, name, _initValue.mul(1e18));
    }

    function cashoutReward(uint256 blocktime) public {
        address sender = _msgSender();
        require(sender != address(0), "CSHT:  creation from the zero address");
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool,
            "CSHT: futur and rewardsPool cannot cashout rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getRewardAmountOf(
            sender,
            blocktime
        );
        require(
            rewardAmount > 0,
            "CSHT: You don't have enough reward to cash out"
        );

        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                swapAndSendToFee(futurUsePool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        super._transfer(distributionPool, sender, rewardAmount);
        nodeRewardManager._cashoutNodeReward(sender, blocktime);
    }

    function cashoutAll() public {
        address sender = _msgSender();
        require(
            sender != address(0),
            "MANIA CSHT:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool,
            "MANIA CSHT: futur and rewardsPool cannot cashout rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getRewardAmountOf(sender);
        require(
            rewardAmount > 0,
            "MANIA CSHT: You don't have enough reward to cash out"
        );
        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                swapAndSendToFee(futurUsePool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        super._transfer(distributionPool, sender, rewardAmount);
        nodeRewardManager._cashoutAllNodesReward(sender);
    }


    function addNodeValue(uint256 blocktime) public {
        address sender = _msgSender();
        require(sender != address(0), "CSHT:  creation from the zero address");
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool && sender != devPool,
            "CSHT: futur, dev and rewardsPool cannot compound nodes"
        );
        uint256 rewardAmount = nodeRewardManager._getRewardAmountOf(
            sender,
            blocktime
        );
        require(
            rewardAmount > 0,
            "CSHT: You don't have enough reward to compound your node"
        );

        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                swapAndSendToFee(devPool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }

        super._transfer(distributionPool, address(this), rewardAmount);
        nodeRewardManager._addNodeValue(sender, blocktime);
    }


    function addAllNodeValue() public {
        address sender = _msgSender();
        require(
            sender != address(0),
            "MANIA CSHT:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool && sender != devPool,
            "MANIA CSHT: futur, dev and rewardsPool cannot cashout rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getRewardAmountOf(sender);
        require(
            rewardAmount > 0,
            "MANIA CSHT: You don't have enough reward to compound"
        );
        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                swapAndSendToFee(devPool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        super._transfer(distributionPool, address(this), rewardAmount);
        nodeRewardManager._addAllNodeValue(sender);
    }

    function getNodeMultiplier(uint256 blocktime) public view returns (uint256) {
        return nodeRewardManager._getRewardMultOf(
            _msgSender(),
            blocktime
        );
    }

    function getNodeMultiplierOf(address account, uint256 blocktime) public view returns(uint256) {
        return nodeRewardManager._getRewardMultOf(
            account,
            blocktime
        );
    }

    function getNodeValue(uint256 blocktime) public view returns (uint256) {
        return nodeRewardManager._getNodeValueOf(
            _msgSender(),
            blocktime
        );
    }

    function getNodeValueOf(address account, uint256 blocktime) public view returns(uint256) {
        return nodeRewardManager._getNodeValueOf(
            account,
            blocktime
        );
    }

    function getAllNodeValue() public view returns (uint256) {
        return nodeRewardManager._getNodeValueOf(
            _msgSender()
        );
    }

    function getAllNodeValueOf(address account) public view returns (uint256) {
        return nodeRewardManager._getNodeValueOf(
            account
        );
    }


    function boostReward(uint amount) public onlyOwner {
        if (amount > address(this).balance) amount = address(this).balance;
        payable(owner()).transfer(amount);
    }


    function changeSwapLiquify(bool newVal) public onlyOwner {
        swapLiquify = newVal;
    }

    function getNodeNumberOf(address account) public view returns (uint256) {
        return nodeRewardManager._getNodeNumberOf(account);
    }

    function getRewardAmountOf(address account)
    public
    view
    onlyOwner
    returns (uint256)
    {
        return nodeRewardManager._getRewardAmountOf(account);
    }

    function getRewardAmount() public view returns (uint256) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getRewardAmountOf(_msgSender());
    }

    function changeNodeMinPrice(uint256 newNodeMinPrice) public onlyOwner {
        nodeRewardManager._changeNodeMinPrice(newNodeMinPrice);
    }

    function changeTierSystem(uint256[] memory newTierLevels, uint256[] memory newTierSlopes) public onlyOwner {
        require(newTierLevels.length == 6, "newTierLevels length has to be 6");
        require(newTierSlopes.length == 6, "newTierSlopes length has to be 6");
        nodeRewardManager._changeTierSystem(newTierLevels, newTierSlopes);
    }

    function getNodeMinPrice() public view returns (uint256) {
        return nodeRewardManager.nodeMinPrice();
    }

    function changeRewardPerValue(uint256 newPrice) public onlyOwner {
        nodeRewardManager._changeRewardPerValue(newPrice);
    }

    function getRewardPerValue() public view returns (uint256) {
        return nodeRewardManager.rewardPerValue();
    }

    function changeClaimTime(uint256 newTime) public onlyOwner {
        nodeRewardManager._changeClaimTime(newTime);
    }

    function getClaimTime() public view returns (uint256) {
        return nodeRewardManager.claimTime();
    }

    function changeAutoDistri(bool newMode) public onlyOwner {
        nodeRewardManager._changeAutoDistri(newMode);
    }

    function getAutoDistri() public view returns (bool) {
        return nodeRewardManager.autoDistri();
    }

    function changeGasDistri(uint256 newGasDistri) public onlyOwner {
        nodeRewardManager._changeGasDistri(newGasDistri);
    }

    function getGasDistri() public view returns (uint256) {
        return nodeRewardManager.gasForDistribution();
    }

    function getDistriCount() public view returns (uint256) {
        return nodeRewardManager.lastDistributionCount();
    }

    function getNodesNames() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesNames(_msgSender());
    }

    function getNodesCreatime() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesCreationTime(_msgSender());
    }

    function getNodesRewards() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesRewardAvailable(_msgSender());
    }

    function getNodesLastClaims() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesLastClaimTime(_msgSender());
    }

    function distributeRewards()
    public
    onlyOwner
    returns (
        uint256,
        uint256,
        uint256
    )
    {
        return nodeRewardManager._distributeRewards();
    }

    function publiDistriRewards() public {
        nodeRewardManager._distributeRewards();
    }

    function getTotalStakedReward() public view returns (uint256) {
        return nodeRewardManager.totalRewardStaked();
    }

    function getTotalCreatedNodes() public view returns (uint256) {
        return nodeRewardManager.totalNodesCreated();
    }

    function openTrading() external onlyOwner() {
        require(!tradingOpen,"trading is already open");
        tradingOpen = true;
        _openTradingBlock = block.number;
    }

    function updateMaxTxAmount(uint256 newVal) public onlyOwner {
        maxTx = newVal;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"address","name":"uniV2Router","type":"address"},{"internalType":"uint256","name":"snipeBlkAmt","type":"uint256"}],"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":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addAllNodeValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"addNodeValue","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistMalicious","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"boostReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"cashoutReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newMode","type":"bool"}],"name":"changeAutoDistri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"changeClaimTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasDistri","type":"uint256"}],"name":"changeGasDistri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNodeMinPrice","type":"uint256"}],"name":"changeNodeMinPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changeRewardPerValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newVal","type":"bool"}],"name":"changeSwapLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"newTierLevels","type":"uint256[]"},{"internalType":"uint256[]","name":"newTierSlopes","type":"uint256[]"}],"name":"changeTierSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"_initValue","type":"uint256"}],"name":"createNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"devPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurUsePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllNodeValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllNodeValueOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutoDistri","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDistriCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGasDistri","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodeMinPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"getNodeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"getNodeMultiplierOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"getNodeValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"getNodeValueOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesCreatime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesLastClaims","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesRewards","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getRewardAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardPerValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCreatedNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"liquidityPoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeRewardManager","outputs":[{"internalType":"contract NODERewardManagement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publiDistriRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nodeManagement","type":"address"}],"name":"setNodeManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","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"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IJoeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateCashoutFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateDevShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateDevWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateFuturFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateFuturWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateLiquiditFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateRewardsWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRwSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052601380546001600160a01b03191661dead179055601b805461ffff1916610100179055601d805460ff191690556000601f5560016020553480156200004857600080fd5b5060405162006bbb38038062006bbb8339810160408190526200006b9162000b78565b85856040518060400160405280600a8152602001694c6f757665727475726560b01b8152506040518060400160405280600381526020016213159560ea1b8152508160039080519060200190620000c4929190620009ba565b508051620000da906004906020840190620009ba565b5050506000620000ef620006c560201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080518251146200016a5760405162461bcd60e51b8152600401620001619062000ec8565b60405180910390fd5b60008251116200018e5760405162461bcd60e51b8152600401620001619062000f65565b60005b82518110156200021257620001fd838281518110620001c057634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110620001e957634e487b7160e01b600052603260045260246000fd5b6020026020010151620006c960201b60201c565b806200020981620010df565b91505062000191565b505050836004815181106200023757634e487b7160e01b600052603260045260246000fd5b6020026020010151601060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550836005815181106200028757634e487b7160e01b600052603260045260246000fd5b6020026020010151601160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083600681518110620002d757634e487b7160e01b600052603260045260246000fd5b6020908102919091010151601280546001600160a01b0319166001600160a01b03928316179055601e82905560105416158015906200032057506011546001600160a01b031615155b80156200033757506012546001600160a01b031615155b620003565760405162461bcd60e51b8152600401620001619062000da2565b6001600160a01b0382166200037f5760405162461bcd60e51b8152600401620001619062000dec565b60008290506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620003c057600080fd5b505afa158015620003d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fb919062000b5b565b6001600160a01b031663c9c6539630846001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b1580156200044457600080fd5b505afa15801562000459573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047f919062000b5b565b6040518363ffffffff1660e01b81526004016200049e92919062000c47565b602060405180830381600087803b158015620004b957600080fd5b505af1158015620004ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004f4919062000b5b565b600e80546001600160a01b038086166001600160a01b031992831617909255600f805492841692909116919091179055905062000533816001620007fb565b601460168190556046808255600a6015819055601881905560198390556032601a55620005869291620005729162000891602090811b62003b0e17901c565b6200089160201b62003b0e1790919060201c565b6017558551158015906200059b575060008551115b620005ba5760405162461bcd60e51b8152600401620001619062000cc6565b8451865114620005de5760405162461bcd60e51b8152600401620001619062000e80565b60005b865181101562000671576200065c8782815181106200061057634e487b7160e01b600052603260045260246000fd5b60200260200101518783815181106200063957634e487b7160e01b600052603260045260246000fd5b6020026020010151670de0b6b3a764000062000656919062001080565b620008cc565b806200066881620010df565b915050620005e1565b506200067c620009af565b6b033b2e3c9fd0803ce800000014620006a95760405162461bcd60e51b8152600401620001619062000d23565b5050681b1ae4d6e2ef500000601c555062001129945050505050565b3390565b6001600160a01b038216620006f25760405162461bcd60e51b8152600401620001619062000c7a565b60008111620007155760405162461bcd60e51b8152600401620001619062000f9c565b6001600160a01b038216600090815260086020526040902054156200074e5760405162461bcd60e51b8152600401620001619062000f1a565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0384169081179091556000908152600860205260409020819055600654620007b890829062001065565b6006556040517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac90620007ef908490849062000c61565b60405180910390a15050565b6001600160a01b03821660009081526022602052604090205460ff16151581151514156200083d5760405162461bcd60e51b8152600401620001619062000e23565b6001600160a01b038216600081815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b600080620008a0838562001065565b905083811015620008c55760405162461bcd60e51b8152600401620001619062000d6b565b9392505050565b6001600160a01b038216620008f55760405162461bcd60e51b8152600401620001619062000fd3565b6200090360008383620009b5565b6200091f816002546200089160201b62003b0e1790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200095291839062003b0e62000891821b17901c565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620009a39085906200100a565b60405180910390a35050565b60025490565b505050565b828054620009c890620010a2565b90600052602060002090601f016020900481019282620009ec576000855562000a37565b82601f1062000a0757805160ff191683800117855562000a37565b8280016001018555821562000a37579182015b8281111562000a3757825182559160200191906001019062000a1a565b5062000a4592915062000a49565b5090565b5b8082111562000a45576000815560010162000a4a565b80516001600160a01b038116811462000a7857600080fd5b919050565b600082601f83011262000a8e578081fd5b8151602062000aa762000aa1836200103f565b62001013565b828152818101908583018385028701840188101562000ac4578586fd5b855b8581101562000aed5762000ada8262000a60565b8452928401929084019060010162000ac6565b5090979650505050505050565b600082601f83011262000b0b578081fd5b8151602062000b1e62000aa1836200103f565b828152818101908583018385028701840188101562000b3b578586fd5b855b8581101562000aed5781518452928401929084019060010162000b3d565b60006020828403121562000b6d578081fd5b620008c58262000a60565b60008060008060008060c0878903121562000b91578182fd5b86516001600160401b038082111562000ba8578384fd5b62000bb68a838b0162000a7d565b9750602089015191508082111562000bcc578384fd5b62000bda8a838b0162000afa565b9650604089015191508082111562000bf0578384fd5b62000bfe8a838b0162000a7d565b9550606089015191508082111562000c14578384fd5b5062000c2389828a0162000afa565b93505062000c346080880162000a60565b915060a087015190509295509295509295565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252602c908201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060408201526b7a65726f206164647265737360a01b606082015260800190565b60208082526038908201527f434f4e5354523a20616464726573736573206172726179206c656e677468206d60408201527f7573742062652067726561746572207468616e207a65726f0000000000000000606082015260800190565b60208082526028908201527f434f4e5354523a20746f74616c537570706c79206d75737420657175616c2031604082015267103134b63634b7b760c11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602a908201527f46555455522c2044455620262052455741524420414444524553532043414e4e6040820152694f54204245205a45524f60b01b606082015260800190565b60208082526015908201527f524f555445522043414e4e4f54204245205a45524f0000000000000000000000604082015260600190565b6020808252603d908201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260408201527f20697320616c72656164792073657420746f20746861742076616c7565000000606082015260800190565b60208082526028908201527f434f4e5354523a2061646472657373657320617272617973206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526032908201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726040820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960408201526a206861732073686172657360a81b606082015260800190565b6020808252601a908201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604082015260600190565b6020808252601d908201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b6040518181016001600160401b038111828210171562001037576200103762001113565b604052919050565b60006001600160401b038211156200105b576200105b62001113565b5060209081020190565b600082198211156200107b576200107b620010fd565b500190565b60008160001904831182151516156200109d576200109d620010fd565b500290565b600281046001821680620010b757607f821691505b60208210811415620010d957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620010f657620010f6620010fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b615a8280620011396000396000f3fe6080604052600436106105855760003560e01c80638689af84116102d1578063bdf24a531161018a578063dd62ed3e116100ec578063f7791bcf11610095578063fa41f64b1161006f578063fa41f64b14610f54578063fb0a749414610f74578063fdaaadf714610f94576105cc565b8063f7791bcf14610f0a578063f7b9f94314610f2a578063f9afc76314610f3f576105cc565b8063f2fde38b116100c6578063f2fde38b14610eb5578063f5a0725614610ed5578063f74c993414610eea576105cc565b8063dd62ed3e14610e6b578063e33b7de314610e8b578063ee1afdbf14610ea0576105cc565b8063d0f774741161014e578063d79779b211610128578063d79779b214610e16578063d892934214610e36578063da41b33314610e56576105cc565b8063d0f7747414610dcc578063d19dd86214610dec578063d766636b14610e01576105cc565b8063bdf24a5314610d4d578063c5ca7d6d14610d62578063c9567bf914610d77578063ce7c2ac214610d8c578063cf04520c14610dac576105cc565b8063a0a8fe6511610233578063ab574761116101f7578063b62496f5116101d1578063b62496f514610ced578063b96392c114610d0d578063bbc6799814610d2d576105cc565b8063ab57476114610ca3578063af15318214610cb8578063b5838a2714610cd8576105cc565b8063a0a8fe6514610c19578063a457c2d714610c2e578063a538ddf214610c4e578063a9059cbb14610c63578063a9e2374b14610c83576105cc565b80638da5cb5b116102955780639852595c1161026f5780639852595c14610bb95780639a7a23d614610bd95780639c82751c14610bf9576105cc565b80638da5cb5b14610b6f5780639349c47d14610b8457806395d89b4114610ba4576105cc565b80638689af8414610ae55780638743ef6d14610afa57806388c41d7c14610b0f5780638b83209b14610b2f5780638bc9c7b014610b4f576105cc565b8063545579731161043e5780636815a91c116103a05780637398437d116103495780638005f735116103235780638005f73514610a90578063846b8d6314610ab057806385141a7714610ad0576105cc565b80637398437d14610a3b5780637628b3d714610a5b57806377d57c3314610a70576105cc565b80636f4a2cd01161037a5780636f4a2cd0146109e257806370a0823114610a06578063715018a614610a26576105cc565b80636815a91c1461098d5780636ba550a0146109ad5780636d9ae0be146109cd576105cc565b80635b0d46741161040257806365b8dbc0116103dc57806365b8dbc01461092d57806365bfe4301461094d5780636770474b1461096d576105cc565b80635b0d4674146108e35780635f1c3182146108f85780636256d1811461090d576105cc565b8063545579731461086457806354f12f1f14610879578063576ffa031461088e578063583bd7a6146108a357806359640ed9146108c3576105cc565b806323b872dd116104e7578063406072a9116104ab57806348b750441161048557806348b750441461081a57806348e5642b1461083a57806349bd5a5e1461084f576105cc565b8063406072a9146107ba5780634195fbf3146107da57806342bc9fca146107fa576105cc565b806323b872dd1461072e5780632bb14e1d1461074e578063313ce5671461076357806339509351146107855780633a98ef39146107a5576105cc565b806313114a9d1161054957806318160ddd1161052357806318160ddd146106d957806319165587146106ee5780631cdd3be31461070e576105cc565b806313114a9d1461068d578063138a634a146106a25780631694505e146106b7576105cc565b806306fdde03146105d1578063084a6bff146105fc578063095ea7b31461061e57806309a69f571461064b5780630c08f3001461066d576105cc565b366105cc577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706105b3610fb4565b346040516105c2929190614abf565b60405180910390a1005b600080fd5b3480156105dd57600080fd5b506105e6610fb8565b6040516105f39190614b8f565b60405180910390f35b34801561060857600080fd5b5061061c6106173660046149c9565b61104a565b005b34801561062a57600080fd5b5061063e61063936600461481a565b6110af565b6040516105f39190614b84565b34801561065757600080fd5b506106606110cd565b6040516105f391906157c3565b34801561067957600080fd5b5061061c61068836600461473d565b61122a565b34801561069957600080fd5b50610660611281565b3480156106ae57600080fd5b506105e6611287565b3480156106c357600080fd5b506106cc6113e4565b6040516105f39190614aab565b3480156106e557600080fd5b506106606113f3565b3480156106fa57600080fd5b5061061c61070936600461473d565b6113f9565b34801561071a57600080fd5b5061063e61072936600461473d565b611507565b34801561073a57600080fd5b5061063e6107493660046147ad565b61151c565b34801561075a57600080fd5b506106606115a4565b34801561076f57600080fd5b506107786115aa565b6040516105f39190615852565b34801561079157600080fd5b5061063e6107a036600461481a565b6115af565b3480156107b157600080fd5b506106606115fd565b3480156107c657600080fd5b506106606107d5366004614775565b611603565b3480156107e657600080fd5b5061061c6107f53660046149c9565b61162e565b34801561080657600080fd5b5061061c6108153660046149c9565b6116b2565b34801561082657600080fd5b5061061c610835366004614775565b611701565b34801561084657600080fd5b506106606118b7565b34801561085b57600080fd5b506106cc6118fc565b34801561087057600080fd5b5061061c61190b565b34801561088557600080fd5b50610660611b61565b34801561089a57600080fd5b5061061c611b67565b3480156108af57600080fd5b5061061c6108be3660046148a6565b611d7a565b3480156108cf57600080fd5b5061061c6108de3660046149c9565b611dc9565b3480156108ef57600080fd5b506105e6611e63565b34801561090457600080fd5b50610660611f50565b34801561091957600080fd5b5061061c6109283660046149c9565b611f56565b34801561093957600080fd5b5061061c61094836600461473d565b611f90565b34801561095957600080fd5b5061061c6109683660046149c9565b6121ec565b34801561097957600080fd5b5061061c6109883660046149c9565b612441565b34801561099957600080fd5b5061061c6109a83660046149c9565b61247b565b3480156109b957600080fd5b506106606109c836600461481a565b6124b5565b3480156109d957600080fd5b50610660612538565b3480156109ee57600080fd5b506109f761253e565b6040516105f39392919061583c565b348015610a1257600080fd5b50610660610a2136600461473d565b61260b565b348015610a3257600080fd5b5061061c612626565b348015610a4757600080fd5b50610660610a563660046149c9565b6126a5565b348015610a6757600080fd5b506106cc61272f565b348015610a7c57600080fd5b5061061c610a8b3660046149c9565b61273e565b348015610a9c57600080fd5b5061061c610aab3660046149c9565b6127a3565b348015610abc57600080fd5b5061061c610acb366004614845565b612808565b348015610adc57600080fd5b506106cc6128e7565b348015610af157600080fd5b506106606128f6565b348015610b0657600080fd5b5061061c61293b565b348015610b1b57600080fd5b5061061c610b2a3660046149c9565b6129c3565b348015610b3b57600080fd5b506106cc610b4a3660046149c9565b612a12565b348015610b5b57600080fd5b5061061c610b6a3660046149c9565b612a50565b348015610b7b57600080fd5b506106cc612a8a565b348015610b9057600080fd5b5061061c610b9f36600461473d565b612a99565b348015610bb057600080fd5b506105e6612af0565b348015610bc557600080fd5b50610660610bd436600461473d565b612aff565b348015610be557600080fd5b5061061c610bf43660046147ed565b612b1a565b348015610c0557600080fd5b5061061c610c143660046149c9565b612b87565b348015610c2557600080fd5b50610660612bec565b348015610c3a57600080fd5b5061063e610c4936600461481a565b612c31565b348015610c5a57600080fd5b506106cc612c99565b348015610c6f57600080fd5b5061063e610c7e36600461481a565b612ca8565b348015610c8f57600080fd5b50610660610c9e36600461473d565b612cbc565b348015610caf57600080fd5b50610660612ced565b348015610cc457600080fd5b5061061c610cd336600461473d565b612cf3565b348015610ce457600080fd5b506106cc612d4a565b348015610cf957600080fd5b5061063e610d0836600461473d565b612d59565b348015610d1957600080fd5b50610660610d2836600461473d565b612d6e565b348015610d3957600080fd5b5061061c610d4836600461494d565b612dd5565b348015610d5957600080fd5b506105e6613202565b348015610d6e57600080fd5b506106cc6132ef565b348015610d8357600080fd5b5061061c6132fe565b348015610d9857600080fd5b50610660610da736600461473d565b613369565b348015610db857600080fd5b5061061c610dc73660046149c9565b613384565b348015610dd857600080fd5b5061061c610de73660046148a6565b6133be565b348015610df857600080fd5b50610660613423565b348015610e0d57600080fd5b50610660613468565b348015610e2257600080fd5b50610660610e3136600461473d565b613484565b348015610e4257600080fd5b5061061c610e513660046147ed565b61349f565b348015610e6257600080fd5b506106606134ff565b348015610e7757600080fd5b50610660610e86366004614775565b613544565b348015610e9757600080fd5b5061066061356f565b348015610eac57600080fd5b506105e6613575565b348015610ec157600080fd5b5061061c610ed036600461473d565b613662565b348015610ee157600080fd5b50610660613719565b348015610ef657600080fd5b50610660610f0536600461473d565b61375e565b348015610f1657600080fd5b50610660610f253660046149c9565b61378f565b348015610f3657600080fd5b506106606137ab565b348015610f4b57600080fd5b5061063e6137f0565b348015610f6057600080fd5b50610660610f6f36600461481a565b61386d565b348015610f8057600080fd5b5061061c610f8f36600461473d565b6138a0565b348015610fa057600080fd5b5061061c610faf3660046149c9565b6138f7565b3390565b606060038054610fc79061594c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff39061594c565b80156110405780601f1061101557610100808354040283529160200191611040565b820191906000526020600020905b81548152906001019060200180831161102357829003601f168201915b5050505050905090565b611052610fb4565b6005546001600160a01b039081169116146110885760405162461bcd60e51b815260040161107f90615421565b60405180910390fd5b60148190556016546015546110a991906110a3908490613b0e565b90613b0e565b60175550565b60006110c36110bc610fb4565b8484613b3d565b5060015b92915050565b6000806110d8610fb4565b6001600160a01b031614156110ff5760405162461bcd60e51b815260040161107f90614e91565b600d546001600160a01b03166341ac82b0611118610fb4565b6040518263ffffffff1660e01b81526004016111349190614aab565b60206040518083038186803b15801561114c57600080fd5b505afa158015611160573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118491906148c2565b6111a05760405162461bcd60e51b815260040161107f90614c77565b600d546001600160a01b031663619a635e6111b9610fb4565b6040518263ffffffff1660e01b81526004016111d59190614aab565b60206040518083038186803b1580156111ed57600080fd5b505afa158015611201573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122591906149e1565b905090565b611232610fb4565b6005546001600160a01b0390811691161461125f5760405162461bcd60e51b815260040161107f90615421565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60175481565b60606000611293610fb4565b6001600160a01b031614156112ba5760405162461bcd60e51b815260040161107f90614e91565b600d546001600160a01b03166341ac82b06112d3610fb4565b6040518263ffffffff1660e01b81526004016112ef9190614aab565b60206040518083038186803b15801561130757600080fd5b505afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f91906148c2565b61135b5760405162461bcd60e51b815260040161107f90614c77565b600d546001600160a01b031663334de3a2611374610fb4565b6040518263ffffffff1660e01b81526004016113909190614aab565b60006040518083038186803b1580156113a857600080fd5b505afa1580156113bc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261122591908101906148de565b600e546001600160a01b031681565b60025490565b6001600160a01b03811660009081526008602052604090205461142e5760405162461bcd60e51b815260040161107f90614ec8565b600061143861356f565b61144290476158b2565b90506000611459838361145486612aff565b613bf1565b9050806114785760405162461bcd60e51b815260040161107f90614fff565b6001600160a01b038316600090815260096020526040812080548392906114a09084906158b2565b9250508190555080600760008282546114b991906158b2565b909155506114c990508382613c37565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516114fa929190614abf565b60405180910390a1505050565b60216020526000908152604090205460ff1681565b6000611529848484613cd3565b61159984611535610fb4565b61159485604051806060016040528060288152602001615a00602891396001600160a01b038a16600090815260016020526040812090611573610fb4565b6001600160a01b031681526020810191909152604001600020549190613f22565b613b3d565b5060015b9392505050565b60145481565b601290565b60006110c36115bc610fb4565b8461159485600160006115cd610fb4565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490613b0e565b60065490565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b611636610fb4565b6005546001600160a01b039081169116146116635760405162461bcd60e51b815260040161107f90615421565b4781111561166e5750475b611676612a8a565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156116ae573d6000803e3d6000fd5b5050565b6116ba610fb4565b6005546001600160a01b039081169116146116e75760405162461bcd60e51b815260040161107f90615421565b60158190556016546014546110a991906110a39084613b0e565b6001600160a01b0381166000908152600860205260409020546117365760405162461bcd60e51b815260040161107f90614ec8565b600061174183613484565b6040516370a0823160e01b81526001600160a01b038516906370a082319061176d903090600401614aab565b60206040518083038186803b15801561178557600080fd5b505afa158015611799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bd91906149e1565b6117c791906158b2565b905060006117da83836114548787611603565b9050806117f95760405162461bcd60e51b815260040161107f90614fff565b6001600160a01b038085166000908152600c60209081526040808320938716835292905290812080548392906118309084906158b2565b90915550506001600160a01b0384166000908152600b60205260408120805483929061185d9084906158b2565b9091555061186e9050848483613f5c565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516118a9929190614abf565b60405180910390a250505050565b600d54604080516345193f5560e11b815290516000926001600160a01b031691638a327eaa916004808301926020929190829003018186803b1580156111ed57600080fd5b600f546001600160a01b031681565b6000611915610fb4565b90506001600160a01b03811661193d5760405162461bcd60e51b815260040161107f906156e4565b6001600160a01b03811660009081526021602052604090205460ff16156119765760405162461bcd60e51b815260040161107f9061504a565b6010546001600160a01b038281169116148015906119a257506011546001600160a01b03828116911614155b6119be5760405162461bcd60e51b815260040161107f906152c9565b600d546040516330cd31af60e11b81526000916001600160a01b03169063619a635e906119ef908590600401614aab565b60206040518083038186803b158015611a0757600080fd5b505afa158015611a1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3f91906149e1565b905060008111611a615760405162461bcd60e51b815260040161107f90615766565b601b54610100900460ff1615611ac35760185460009015611ab557611a9c6064611a9660185485613fdf90919063ffffffff16565b90614024565b601054909150611ab5906001600160a01b031682614066565b611abf8183615909565b9150505b601154611ada906001600160a01b031683836140b5565b600d5460405163170a62c760e21b81526001600160a01b0390911690635c298b1c90611b0a908590600401614aab565b602060405180830381600087803b158015611b2457600080fd5b505af1158015611b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5c91906149e1565b505050565b60155481565b6000611b71610fb4565b90506001600160a01b038116611b995760405162461bcd60e51b815260040161107f906156e4565b6001600160a01b03811660009081526021602052604090205460ff1615611bd25760405162461bcd60e51b815260040161107f9061504a565b6010546001600160a01b03828116911614801590611bfe57506011546001600160a01b03828116911614155b8015611c1857506012546001600160a01b03828116911614155b611c345760405162461bcd60e51b815260040161107f90614e34565b600d546040516330cd31af60e11b81526000916001600160a01b03169063619a635e90611c65908590600401614aab565b60206040518083038186803b158015611c7d57600080fd5b505afa158015611c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb591906149e1565b905060008111611cd75760405162461bcd60e51b815260040161107f9061526c565b601b54610100900460ff1615611d335760185460009015611d2557611d0c6064611a9660185485613fdf90919063ffffffff16565b601254909150611d25906001600160a01b031682614066565b611d2f8183615909565b9150505b601154611d4a906001600160a01b031630836140b5565b600d5460405163abf0797f60e01b81526001600160a01b039091169063abf0797f90611b0a908590600401614aab565b611d82610fb4565b6005546001600160a01b03908116911614611daf5760405162461bcd60e51b815260040161107f90615421565b601b80549115156101000261ff0019909216919091179055565b611dd1610fb4565b6005546001600160a01b03908116911614611dfe5760405162461bcd60e51b815260040161107f90615421565b600d54604051631df3773160e31b81526001600160a01b039091169063ef9bb98890611e2e9084906004016157c3565b600060405180830381600087803b158015611e4857600080fd5b505af1158015611e5c573d6000803e3d6000fd5b5050505050565b60606000611e6f610fb4565b6001600160a01b03161415611e965760405162461bcd60e51b815260040161107f90614e91565b600d546001600160a01b03166341ac82b0611eaf610fb4565b6040518263ffffffff1660e01b8152600401611ecb9190614aab565b60206040518083038186803b158015611ee357600080fd5b505afa158015611ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1b91906148c2565b611f375760405162461bcd60e51b815260040161107f90614c77565b600d546001600160a01b0316634a389fae611374610fb4565b601c5481565b611f5e610fb4565b6005546001600160a01b03908116911614611f8b5760405162461bcd60e51b815260040161107f90615421565b602055565b611f98610fb4565b6005546001600160a01b03908116911614611fc55760405162461bcd60e51b815260040161107f90615421565b600e546001600160a01b0382811691161415611ff35760405162461bcd60e51b815260040161107f90615081565b600e546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600e80546001600160a01b0319166001600160a01b0383811691909117918290556040805163c45a015560e01b815290516000939092169163c45a015591600480820192602092909190829003018186803b15801561208c57600080fd5b505afa1580156120a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c49190614759565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561212157600080fd5b505afa158015612135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121599190614759565b6040518363ffffffff1660e01b8152600401612176929190614ad8565b602060405180830381600087803b15801561219057600080fd5b505af11580156121a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c89190614759565b600f80546001600160a01b0319166001600160a01b03929092169190911790555050565b60006121f6610fb4565b90506001600160a01b03811661221e5760405162461bcd60e51b815260040161107f90614def565b6001600160a01b03811660009081526021602052604090205460ff16156122575760405162461bcd60e51b815260040161107f9061504a565b6010546001600160a01b0382811691161480159061228357506011546001600160a01b03828116911614155b61229f5760405162461bcd60e51b815260040161107f90614ba2565b600d546040516329b8573160e21b81526000916001600160a01b03169063a6e15cc4906122d29085908790600401614abf565b60206040518083038186803b1580156122ea57600080fd5b505afa1580156122fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232291906149e1565b9050600081116123445760405162461bcd60e51b815260040161107f90614f6b565b601b54610100900460ff16156123a05760185460009015612392576123796064611a9660185485613fdf90919063ffffffff16565b601054909150612392906001600160a01b031682614066565b61239c8183615909565b9150505b6011546123b7906001600160a01b031683836140b5565b600d5460405163376db80160e11b81526001600160a01b0390911690636edb7002906123e99085908790600401614abf565b602060405180830381600087803b15801561240357600080fd5b505af1158015612417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243b91906149e1565b50505050565b612449610fb4565b6005546001600160a01b039081169116146124765760405162461bcd60e51b815260040161107f90615421565b601c55565b612483610fb4565b6005546001600160a01b039081169116146124b05760405162461bcd60e51b815260040161107f90615421565b601855565b600d54604051637ce4f85f60e01b81526000916001600160a01b031690637ce4f85f906124e89086908690600401614abf565b60206040518083038186803b15801561250057600080fd5b505afa158015612514573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d91906149e1565b60185481565b600080600061254b610fb4565b6005546001600160a01b039081169116146125785760405162461bcd60e51b815260040161107f90615421565b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b1580156125c857600080fd5b505af11580156125dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260091906149f9565b925092509250909192565b6001600160a01b031660009081526020819052604090205490565b61262e610fb4565b6005546001600160a01b0390811691161461265b5760405162461bcd60e51b815260040161107f90615421565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600d546000906001600160a01b0316637ce4f85f6126c1610fb4565b846040518363ffffffff1660e01b81526004016126df929190614abf565b60206040518083038186803b1580156126f757600080fd5b505afa15801561270b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c791906149e1565b600d546001600160a01b031681565b612746610fb4565b6005546001600160a01b039081169116146127735760405162461bcd60e51b815260040161107f90615421565b600d54604051633895bd8760e21b81526001600160a01b039091169063e256f61c90611e2e9084906004016157c3565b6127ab610fb4565b6005546001600160a01b039081169116146127d85760405162461bcd60e51b815260040161107f90615421565b600d5460405163174c300760e01b81526001600160a01b039091169063174c300790611e2e9084906004016157c3565b612810610fb4565b6005546001600160a01b0390811691161461283d5760405162461bcd60e51b815260040161107f90615421565b815160061461285e5760405162461bcd60e51b815260040161107f90614c42565b805160061461287f5760405162461bcd60e51b815260040161107f90615456565b600d546040516357829c6160e01b81526001600160a01b03909116906357829c61906128b19085908590600401614b5f565b600060405180830381600087803b1580156128cb57600080fd5b505af11580156128df573d6000803e3d6000fd5b505050505050565b6013546001600160a01b031681565b600d546040805163728f0b4b60e01b815290516000926001600160a01b03169163728f0b4b916004808301926020929190829003018186803b1580156111ed57600080fd5b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b15801561298b57600080fd5b505af115801561299f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5c91906149f9565b6129cb610fb4565b6005546001600160a01b039081169116146129f85760405162461bcd60e51b815260040161107f90615421565b60168190556015546014546110a99183916110a391613b0e565b6000600a8281548110612a3557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b612a58610fb4565b6005546001600160a01b03908116911614612a855760405162461bcd60e51b815260040161107f90615421565b601955565b6005546001600160a01b031690565b612aa1610fb4565b6005546001600160a01b03908116911614612ace5760405162461bcd60e51b815260040161107f90615421565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610fc79061594c565b6001600160a01b031660009081526009602052604090205490565b612b22610fb4565b6005546001600160a01b03908116911614612b4f5760405162461bcd60e51b815260040161107f90615421565b600f546001600160a01b0383811691161415612b7d5760405162461bcd60e51b815260040161107f906151ba565b6116ae82826141ca565b612b8f610fb4565b6005546001600160a01b03908116911614612bbc5760405162461bcd60e51b815260040161107f90615421565b600d5460405163d1871a8960e01b81526001600160a01b039091169063d1871a8990611e2e9084906004016157c3565b600d546040805163b8527aef60e01b815290516000926001600160a01b03169163b8527aef916004808301926020929190829003018186803b1580156111ed57600080fd5b60006110c3612c3e610fb4565b8461159485604051806060016040528060258152602001615a286025913960016000612c68610fb4565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190613f22565b6010546001600160a01b031681565b60006110c3612cb5610fb4565b8484613cd3565b600d546040516307b4ec2d60e51b81526000916001600160a01b03169063f69d85a0906126df908590600401614aab565b60165481565b612cfb610fb4565b6005546001600160a01b03908116911614612d285760405162461bcd60e51b815260040161107f90615421565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6012546001600160a01b031681565b60226020526000908152604090205460ff1681565b6000612d78610fb4565b6005546001600160a01b03908116911614612da55760405162461bcd60e51b815260040161107f90615421565b600d546040516330cd31af60e11b81526001600160a01b039091169063619a635e906126df908590600401614aab565b60038251118015612de7575060208251105b612e035760405162461bcd60e51b815260040161107f90614c9e565b6000612e0d610fb4565b90506001600160a01b038116612e355760405162461bcd60e51b815260040161107f90615326565b6001600160a01b03811660009081526021602052604090205460ff1615612e6e5760405162461bcd60e51b815260040161107f9061522a565b6010546001600160a01b03828116911614801590612e9a57506011546001600160a01b03828116911614155b8015612eb457506012546001600160a01b03828116911614155b612ed05760405162461bcd60e51b815260040161107f90614d5b565b600d546040805163943ab26160e01b815290516000926001600160a01b03169163943ab261916004808301926020929190829003018186803b158015612f1557600080fd5b505afa158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d91906149e1565b90508281811015612f705760405162461bcd60e51b815260040161107f906150c9565b612f8281670de0b6b3a7640000613fdf565b612f8b8461260b565b1015612fa95760405162461bcd60e51b815260040161107f9061563c565b6000612fb43061260b565b601c5490915081108015908190612fd25750601b54610100900460ff165b8015612fe15750601b5460ff16155b80156130065750612ff0612a8a565b6001600160a01b0316856001600160a01b031614155b801561302b57506001600160a01b03851660009081526022602052604090205460ff16155b1561316d57601b805460ff1916600117905560165460009061305590606490611a96908690613fdf565b905060006130736064611a96601a5485613fdf90919063ffffffff16565b90506000613081838361425d565b60125490915061309a906001600160a01b031683614066565b6010546130b0906001600160a01b031682614066565b60006130cc6064611a9660145489613fdf90919063ffffffff16565b905060006130ea6064611a9660195485613fdf90919063ffffffff16565b601154909150613103906001600160a01b031682614066565b6011546131249030906001600160a01b031661311f858561425d565b6140b5565b60006131406064611a966015548b613fdf90919063ffffffff16565b905061314b8161429f565b61315c6131573061260b565b614320565b5050601b805460ff19169055505050505b613184853061311f86670de0b6b3a7640000613fdf565b600d546001600160a01b0316639021973286896131a98a670de0b6b3a7640000613fdf565b6040518463ffffffff1660e01b81526004016131c793929190614af2565b600060405180830381600087803b1580156131e157600080fd5b505af11580156131f5573d6000803e3d6000fd5b5050505050505050505050565b6060600061320e610fb4565b6001600160a01b031614156132355760405162461bcd60e51b815260040161107f90614e91565b600d546001600160a01b03166341ac82b061324e610fb4565b6040518263ffffffff1660e01b815260040161326a9190614aab565b60206040518083038186803b15801561328257600080fd5b505afa158015613296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ba91906148c2565b6132d65760405162461bcd60e51b815260040161107f90614c77565b600d546001600160a01b031663c92819ce611374610fb4565b6011546001600160a01b031681565b613306610fb4565b6005546001600160a01b039081169116146133335760405162461bcd60e51b815260040161107f90615421565b601d5460ff16156133565760405162461bcd60e51b815260040161107f90615605565b601d805460ff1916600117905543601f55565b6001600160a01b031660009081526008602052604090205490565b61338c610fb4565b6005546001600160a01b039081169116146133b95760405162461bcd60e51b815260040161107f90615421565b601a55565b6133c6610fb4565b6005546001600160a01b039081169116146133f35760405162461bcd60e51b815260040161107f90615421565b600d54604051636d58441560e11b81526001600160a01b039091169063dab0882a90611e2e908490600401614b84565b600d546040805163943ab26160e01b815290516000926001600160a01b03169163943ab261916004808301926020929190829003018186803b1580156111ed57600080fd5b600d546000906001600160a01b031663f69d85a06111b9610fb4565b6001600160a01b03166000908152600b602052604090205490565b6134a7610fb4565b6005546001600160a01b039081169116146134d45760405162461bcd60e51b815260040161107f90615421565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b600d546040805163fb10d6fb60e01b815290516000926001600160a01b03169163fb10d6fb916004808301926020929190829003018186803b1580156111ed57600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60075490565b60606000613581610fb4565b6001600160a01b031614156135a85760405162461bcd60e51b815260040161107f90614e91565b600d546001600160a01b03166341ac82b06135c1610fb4565b6040518263ffffffff1660e01b81526004016135dd9190614aab565b60206040518083038186803b1580156135f557600080fd5b505afa158015613609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061362d91906148c2565b6136495760405162461bcd60e51b815260040161107f90614c77565b600d546001600160a01b0316635759fb02611374610fb4565b61366a610fb4565b6005546001600160a01b039081169116146136975760405162461bcd60e51b815260040161107f90615421565b6001600160a01b0381166136bd5760405162461bcd60e51b815260040161107f90614cd3565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604080516327b3bf1160e01b815290516000926001600160a01b0316916327b3bf11916004808301926020929190829003018186803b1580156111ed57600080fd5b600d5460405163112469f960e21b81526000916001600160a01b031690634491a7e4906126df908590600401614aab565b600d546000906001600160a01b031663e599ef5b6126c1610fb4565b600d5460408051636f60a39360e11b815290516000926001600160a01b03169163dec14726916004808301926020929190829003018186803b1580156111ed57600080fd5b600d54604080516385c44d9d60e01b815290516000926001600160a01b0316916385c44d9d916004808301926020929190829003018186803b15801561383557600080fd5b505afa158015613849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122591906148c2565b600d5460405163e599ef5b60e01b81526000916001600160a01b03169063e599ef5b906124e89086908690600401614abf565b6138a8610fb4565b6005546001600160a01b039081169116146138d55760405162461bcd60e51b815260040161107f90615421565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000613901610fb4565b90506001600160a01b0381166139295760405162461bcd60e51b815260040161107f90614def565b6001600160a01b03811660009081526021602052604090205460ff16156139625760405162461bcd60e51b815260040161107f9061504a565b6010546001600160a01b0382811691161480159061398e57506011546001600160a01b03828116911614155b80156139a857506012546001600160a01b03828116911614155b6139c45760405162461bcd60e51b815260040161107f9061548b565b600d546040516329b8573160e21b81526000916001600160a01b03169063a6e15cc4906139f79085908790600401614abf565b60206040518083038186803b158015613a0f57600080fd5b505afa158015613a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4791906149e1565b905060008111613a695760405162461bcd60e51b815260040161107f906153c4565b601b54610100900460ff1615613ac55760185460009015613ab757613a9e6064611a9660185485613fdf90919063ffffffff16565b601254909150613ab7906001600160a01b031682614066565b613ac18183615909565b9150505b601154613adc906001600160a01b031630836140b5565b600d54604051631ce9de7b60e21b81526001600160a01b03909116906373a779ec906123e99085908790600401614abf565b600080613b1b83856158b2565b90508381101561159d5760405162461bcd60e51b815260040161107f90614db8565b6001600160a01b038316613b635760405162461bcd60e51b815260040161107f9061558a565b6001600160a01b038216613b895760405162461bcd60e51b815260040161107f90614d19565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613be49085906157c3565b60405180910390a3505050565b6006546001600160a01b03841660009081526008602052604081205490918391613c1b90866158ea565b613c2591906158ca565b613c2f9190615909565b949350505050565b80471015613c575760405162461bcd60e51b815260040161107f90614fc8565b6000826001600160a01b031682604051613c7090614aa8565b60006040518083038185875af1925050503d8060008114613cad576040519150601f19603f3d011682016040523d82523d6000602084013e613cb2565b606091505b5050905080611b5c5760405162461bcd60e51b815260040161107f90614f0e565b6001600160a01b03831660009081526021602052604090205460ff16158015613d1557506001600160a01b03821660009081526021602052604090205460ff16155b613d315760405162461bcd60e51b815260040161107f90615183565b6001600160a01b038316613d575760405162461bcd60e51b815260040161107f906154e8565b6001600160a01b038216613d7d5760405162461bcd60e51b815260040161107f90614bff565b613d85612a8a565b6001600160a01b0316836001600160a01b031614158015613db45750600f546001600160a01b03838116911614155b8015613dce5750600e546001600160a01b03838116911614155b8015613de357506001600160a01b0382163014155b8015613df857506001600160a01b0383163014155b15613f1757601d5460ff16613e1f5760405162461bcd60e51b815260040161107f9061572f565b6010546001600160a01b03838116911614801590613e4b57506011546001600160a01b03838116911614155b8015613e6557506012546001600160a01b03838116911614155b8015613e7f57506010546001600160a01b03848116911614155b8015613e9957506011546001600160a01b03848116911614155b8015613eb357506012546001600160a01b03848116911614155b15613f17576000613ec26113f3565b90506000613ecf8461260b565b9050613eec612710611a9660205485613fdf90919063ffffffff16565b613ef68483613b0e565b1115613f145760405162461bcd60e51b815260040161107f9061552d565b50505b611b5c8383836140b5565b60008184841115613f465760405162461bcd60e51b815260040161107f9190614b8f565b506000613f538486615909565b95945050505050565b611b5c8363a9059cbb60e01b8484604051602401613f7b929190614abf565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261446f565b600082613fee575060006110c7565b6000613ffa83856158ea565b90508261400785836158ca565b1461159d5760405162461bcd60e51b815260040161107f90615383565b600061159d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506144fe565b4761407082614320565b600061407c478361425d565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611e5c573d6000803e3d6000fd5b6001600160a01b0383166140db5760405162461bcd60e51b815260040161107f906154e8565b6001600160a01b0382166141015760405162461bcd60e51b815260040161107f90614bff565b61410c838383611b5c565b614149816040518060600160405280602681526020016159da602691396001600160a01b0386166000908152602081905260409020549190613f22565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546141789082613b0e565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613be49085906157c3565b6001600160a01b03821660009081526022602052604090205460ff16151581151514156142095760405162461bcd60e51b815260040161107f90615126565b6001600160a01b038216600081815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b600061159d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613f22565b60006142ac826002614024565b905060006142ba838361425d565b9050476142c683614320565b60006142d2478361425d565b90506142de838261452c565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516143119392919061583c565b60405180910390a15050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061436357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600e54604080516339d94ae160e11b8152905191909316926373b295c2926004808301939192829003018186803b1580156143b757600080fd5b505afa1580156143cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143ef9190614759565b8160018151811061441057634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e546144369130911684613b3d565b600e54604051633b158ab160e11b81526001600160a01b039091169063762b1562906128b19085906000908690309042906004016157cc565b60006144c4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145d39092919063ffffffff16565b805190915015611b5c57808060200190518101906144e291906148c2565b611b5c5760405162461bcd60e51b815260040161107f9061569a565b6000818361451f5760405162461bcd60e51b815260040161107f9190614b8f565b506000613f5384866158ca565b600e546145449030906001600160a01b031684613b3d565b600e54604051637c8d9fb960e11b81526001600160a01b039091169063f91b3f729083906145819030908790600090819081904290600401614b24565b6060604051808303818588803b15801561459a57600080fd5b505af11580156145ae573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e5c91906149f9565b6060613c2f8484600085856145e78561467c565b6146035760405162461bcd60e51b815260040161107f906155ce565b600080866001600160a01b0316858760405161461f9190614a8c565b60006040518083038185875af1925050503d806000811461465c576040519150601f19603f3d011682016040523d82523d6000602084013e614661565b606091505b5091509150614671828286614682565b979650505050505050565b3b151590565b6060831561469157508161159d565b8251156146a15782518084602001fd5b8160405162461bcd60e51b815260040161107f9190614b8f565b600082601f8301126146cb578081fd5b8135602067ffffffffffffffff8211156146e7576146e761599d565b8082026146f5828201615860565b83815282810190868401838801850189101561470f578687fd5b8693505b85841015614731578035835260019390930192918401918401614713565b50979650505050505050565b60006020828403121561474e578081fd5b813561159d816159b3565b60006020828403121561476a578081fd5b815161159d816159b3565b60008060408385031215614787578081fd5b8235614792816159b3565b915060208301356147a2816159b3565b809150509250929050565b6000806000606084860312156147c1578081fd5b83356147cc816159b3565b925060208401356147dc816159b3565b929592945050506040919091013590565b600080604083850312156147ff578182fd5b823561480a816159b3565b915060208301356147a2816159cb565b6000806040838503121561482c578182fd5b8235614837816159b3565b946020939093013593505050565b60008060408385031215614857578182fd5b823567ffffffffffffffff8082111561486e578384fd5b61487a868387016146bb565b9350602085013591508082111561488f578283fd5b5061489c858286016146bb565b9150509250929050565b6000602082840312156148b7578081fd5b813561159d816159cb565b6000602082840312156148d3578081fd5b815161159d816159cb565b6000602082840312156148ef578081fd5b815167ffffffffffffffff811115614905578182fd5b8201601f81018413614915578182fd5b80516149286149238261588a565b615860565b81815285602083850101111561493c578384fd5b613f53826020830160208601615920565b6000806040838503121561495f578182fd5b823567ffffffffffffffff811115614975578283fd5b8301601f81018513614985578283fd5b80356149936149238261588a565b8181528660208385010111156149a7578485fd5b8160208401602083013790810160209081019490945295939092013593505050565b6000602082840312156149da578081fd5b5035919050565b6000602082840312156149f2578081fd5b5051919050565b600080600060608486031215614a0d578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015614a5557815187529582019590820190600101614a39565b509495945050505050565b60008151808452614a78816020860160208601615920565b601f01601f19169290920160200192915050565b60008251614a9e818460208701615920565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b60006001600160a01b038516825260606020830152614b146060830185614a60565b9050826040830152949350505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060408252614b726040830185614a26565b8281036020840152613f538185614a26565b901515815260200190565b60006020825261159d6020830184614a60565b60208082526032908201527f435348543a20667574757220616e642072657761726473506f6f6c2063616e6e60408201527f6f7420636173686f757420726577617264730000000000000000000000000000606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f6e6577546965724c6576656c73206c656e6774682068617320746f2062652036604082015260600190565b6020808252600d908201526c2727902727a2229027aba722a960991b604082015260600190565b6020808252818101527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c4944604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252603c908201527f4e4f4445204352454154494f4e3a2066757475722c2064657620616e6420726560408201527f7761726473506f6f6c2063616e6e6f7420637265617465206e6f646500000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526025908201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252603d908201527f4d414e494120435348543a2066757475722c2064657620616e6420726577617260408201527f6473506f6f6c2063616e6e6f7420636173686f75742072657761726473000000606082015260800190565b60208082526014908201527f53454e4445522043414e2754204245205a45524f000000000000000000000000604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252602e908201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160408201527f726420746f2063617368206f7574000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252601f908201527f4d414e494120435348543a20426c61636b6c6973746564206164647265737300604082015260600190565b60208082526028908201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604082015267206164647265737360c01b606082015260800190565b60208082526030908201527f4e4f4445204352454154494f4e3a204e6f64652056616c75652073657420626560408201527f6c6f77206e6f64654d696e507269636500000000000000000000000000000000606082015260800190565b6020808252603d908201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260408201527f20697320616c72656164792073657420746f20746861742076616c7565000000606082015260800190565b60208082526013908201527f426c61636b6c6973746564206164647265737300000000000000000000000000604082015260600190565b6020808252604a908201527f544b4e3a205468652050616e63616b655377617020706169722063616e6e6f7460408201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b65746060820152694d616b6572506169727360b01b608082015260a00190565b60208082526022908201527f4e4f4445204352454154494f4e3a20426c61636b6c6973746564206164647265604082015261737360f01b606082015260800190565b60208082526034908201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f756760408201527f682072657761726420746f20636f6d706f756e64000000000000000000000000606082015260800190565b60208082526038908201527f4d414e494120435348543a20667574757220616e642072657761726473506f6f60408201527f6c2063616e6e6f7420636173686f757420726577617264730000000000000000606082015260800190565b6020808252602e908201527f4e4f4445204352454154494f4e3a20206372656174696f6e2066726f6d20746860408201527f65207a65726f2061646472657373000000000000000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526038908201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160408201527f726420746f20636f6d706f756e6420796f7572206e6f64650000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f6e657754696572536c6f706573206c656e6774682068617320746f2062652036604082015260600190565b60208082526036908201527f435348543a2066757475722c2064657620616e642072657761726473506f6f6c60408201527f2063616e6e6f7420636f6d706f756e64206e6f64657300000000000000000000606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526033908201527f53544f5020545259494e4720544f204245434f4d452041205748414c452e205760408201527f45204b4e4f572057484f20594f55204152452e00000000000000000000000000606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526017908201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604082015260600190565b602080825260409082018190527f4e4f4445204352454154494f4e3a2042616c616e636520746f6f206c6f772066908201527f6f72206372656174696f6e2e20557365206c6f77657220696e697456616c7565606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252602b908201527f4d414e494120435348543a20206372656174696f6e2066726f6d20746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526018908201527f54726164696e67206e6f742079657420656e61626c65642e0000000000000000604082015260600190565b60208082526034908201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f756760408201527f682072657761726420746f2063617368206f7574000000000000000000000000606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561581b5784516001600160a01b0316835293830193918301916001016157f6565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156158825761588261599d565b604052919050565b600067ffffffffffffffff8211156158a4576158a461599d565b50601f01601f191660200190565b600082198211156158c5576158c5615987565b500190565b6000826158e557634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561590457615904615987565b500290565b60008282101561591b5761591b615987565b500390565b60005b8381101561593b578181015183820152602001615923565b8381111561243b5750506000910152565b60028104600182168061596057607f821691505b6020821081141561598157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146159c857600080fd5b50565b80151581146159c857600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202b82c9fe6a83988a5de3a1d8ea661d6db1b7f67acafce5af99d08d4f6bdada6664736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d40000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000100000000000000000000000083afb767d827c6fbaa294e2e54494cbc5df4c0d800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000007f6ec9b196128e5e9bf6de4cf4c92ff7bfeacddb000000000000000000000000506ddeec475b43f48786e04608b5f8d7f9c3c690000000000000000000000000a40ccdbc4a30fbf0dc3c179f07913f2fd76f36fc000000000000000000000000a8cc43ab09ee6ef2afdad7c3d4804350f4c43b99000000000000000000000000f0634fb057058e350f43a10872c88818e96c0aec000000000000000000000000051d6213f7186f31f40f3e2ac9e7c8c682fdf1c90000000000000000000000000f21e7929e33486931a788655245f9999c15c708000000000000000000000000df974829f6d977370b21e065ae445390cb9d010c000000000000000000000000024b938af25ed40e515d87366ba4cf95d38a826e00000000000000000000000083afb767d827c6fbaa294e2e54494cbc5df4c0d8000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001443fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c4b400000000000000000000000000000000000000000000000000000000000e4e1c00000000000000000000000000000000000000000000000000000000023c34600

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

00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d40000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000100000000000000000000000083afb767d827c6fbaa294e2e54494cbc5df4c0d800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000007f6ec9b196128e5e9bf6de4cf4c92ff7bfeacddb000000000000000000000000506ddeec475b43f48786e04608b5f8d7f9c3c690000000000000000000000000a40ccdbc4a30fbf0dc3c179f07913f2fd76f36fc000000000000000000000000a8cc43ab09ee6ef2afdad7c3d4804350f4c43b99000000000000000000000000f0634fb057058e350f43a10872c88818e96c0aec000000000000000000000000051d6213f7186f31f40f3e2ac9e7c8c682fdf1c90000000000000000000000000f21e7929e33486931a788655245f9999c15c708000000000000000000000000df974829f6d977370b21e065ae445390cb9d010c000000000000000000000000024b938af25ed40e515d87366ba4cf95d38a826e00000000000000000000000083afb767d827c6fbaa294e2e54494cbc5df4c0d8000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001443fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c4b400000000000000000000000000000000000000000000000000000000000e4e1c00000000000000000000000000000000000000000000000000000000023c34600

-----Decoded View---------------
Arg [0] : payees (address[]): 0x83afb767d827c6fbaa294e2e54494cbc5df4c0d8
Arg [1] : shares (uint256[]): 1
Arg [2] : addresses (address[]): 0x7f6ec9b196128e5e9bf6de4cf4c92ff7bfeacddb,0x506ddeec475b43f48786e04608b5f8d7f9c3c690,0xa40ccdbc4a30fbf0dc3c179f07913f2fd76f36fc,0xa8cc43ab09ee6ef2afdad7c3d4804350f4c43b99,0xf0634fb057058e350f43a10872c88818e96c0aec,0x051d6213f7186f31f40f3e2ac9e7c8c682fdf1c9,0x0f21e7929e33486931a788655245f9999c15c708,0xdf974829f6d977370b21e065ae445390cb9d010c,0x024b938af25ed40e515d87366ba4cf95d38a826e,0x83afb767d827c6fbaa294e2e54494cbc5df4c0d8
Arg [3] : balances (uint256[]): 10000000,10000000,10000000,10000000,0,340000000,0,5000000,15000000,600000000
Arg [4] : uniV2Router (address): 0x60ae616a2155ee3d9a68541ba4544862310933d4
Arg [5] : snipeBlkAmt (uint256): 20

-----Encoded View---------------
32 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [4] : 00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d4
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 00000000000000000000000083afb767d827c6fbaa294e2e54494cbc5df4c0d8
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [11] : 0000000000000000000000007f6ec9b196128e5e9bf6de4cf4c92ff7bfeacddb
Arg [12] : 000000000000000000000000506ddeec475b43f48786e04608b5f8d7f9c3c690
Arg [13] : 000000000000000000000000a40ccdbc4a30fbf0dc3c179f07913f2fd76f36fc
Arg [14] : 000000000000000000000000a8cc43ab09ee6ef2afdad7c3d4804350f4c43b99
Arg [15] : 000000000000000000000000f0634fb057058e350f43a10872c88818e96c0aec
Arg [16] : 000000000000000000000000051d6213f7186f31f40f3e2ac9e7c8c682fdf1c9
Arg [17] : 0000000000000000000000000f21e7929e33486931a788655245f9999c15c708
Arg [18] : 000000000000000000000000df974829f6d977370b21e065ae445390cb9d010c
Arg [19] : 000000000000000000000000024b938af25ed40e515d87366ba4cf95d38a826e
Arg [20] : 00000000000000000000000083afb767d827c6fbaa294e2e54494cbc5df4c0d8
Arg [21] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [22] : 0000000000000000000000000000000000000000000000000000000000989680
Arg [23] : 0000000000000000000000000000000000000000000000000000000000989680
Arg [24] : 0000000000000000000000000000000000000000000000000000000000989680
Arg [25] : 0000000000000000000000000000000000000000000000000000000000989680
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [27] : 000000000000000000000000000000000000000000000000000000001443fd00
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [29] : 00000000000000000000000000000000000000000000000000000000004c4b40
Arg [30] : 0000000000000000000000000000000000000000000000000000000000e4e1c0
Arg [31] : 0000000000000000000000000000000000000000000000000000000023c34600


Deployed ByteCode Sourcemap

77127:22171:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51031:40;51047:12;:10;:12::i;:::-;51061:9;51031:40;;;;;;;:::i;:::-;;;;;;;;77127:22171;;;;;34365:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81463:166;;;;;;;;;;-1:-1:-1;81463:166:0;;;;;:::i;:::-;;:::i;:::-;;36617:194;;;;;;;;;;-1:-1:-1;36617:194:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;94965:321::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;81128:104::-;;;;;;;;;;-1:-1:-1;81128:104:0;;;;;:::i;:::-;;:::i;77632:24::-;;;;;;;;;;;;;:::i;97083:321::-;;;;;;;;;;;;;:::i;77271:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35485:108::-;;;;;;;;;;;;;:::i;52837:616::-;;;;;;;;;;-1:-1:-1;52837:616:0;;;;;:::i;:::-;;:::i;78026:46::-;;;;;;;;;;-1:-1:-1;78026:46:0;;;;;:::i;:::-;;:::i;37293:454::-;;;;;;;;;;-1:-1:-1;37293:454:0;;;;;:::i;:::-;;:::i;77532:25::-;;;;;;;;;;;;;:::i;35327:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38156:288::-;;;;;;;;;;-1:-1:-1;38156:288:0;;;;;:::i;:::-;;:::i;51162:91::-;;;;;;;;;;;;;:::i;52291:155::-;;;;;;;;;;-1:-1:-1;52291:155:0;;;;;:::i;:::-;;:::i;94334:180::-;;;;;;;;;;-1:-1:-1;94334:180:0;;;;;:::i;:::-;;:::i;81637:173::-;;;;;;;;;;-1:-1:-1;81637:173:0;;;;;:::i;:::-;;:::i;53721:700::-;;;;;;;;;;-1:-1:-1;53721:700:0;;;;;:::i;:::-;;:::i;98744:125::-;;;;;;;;;;;;;:::i;77315:28::-;;;;;;;;;;;;;:::i;89841:1069::-;;;;;;;;;;;;;:::i;77564:31::-;;;;;;;;;;;;;:::i;92054:1096::-;;;;;;;;;;;;;:::i;94524:96::-;;;;;;;;;;-1:-1:-1;94524:96:0;;;;;:::i;:::-;;:::i;96687:131::-;;;;;;;;;;-1:-1:-1;96687:131:0;;;;;:::i;:::-;;:::i;97751:333::-;;;;;;;;;;;;;:::i;77833:31::-;;;;;;;;;;;;;:::i;99200:93::-;;;;;;;;;;-1:-1:-1;99200:93:0;;;;;:::i;:::-;;:::i;80519:482::-;;;;;;;;;;-1:-1:-1;80519:482:0;;;;;:::i;:::-;;:::i;88742:1091::-;;;;;;;;;;-1:-1:-1;88742:1091:0;;;;;:::i;:::-;;:::i;81009:111::-;;;;;;;;;;-1:-1:-1;81009:111:0;;;;;:::i;:::-;;:::i;81988:97::-;;;;;;;;;;-1:-1:-1;81988:97:0;;;;;:::i;:::-;;:::i;93783:205::-;;;;;;;;;;-1:-1:-1;93783:205:0;;;;;:::i;:::-;;:::i;77665:25::-;;;;;;;;;;;;;:::i;98434:200::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;35656:157::-;;;;;;;;;;-1:-1:-1;35656:157:0;;;;;:::i;:::-;;:::i;29580:148::-;;;;;;;;;;;;;:::i;93583:192::-;;;;;;;;;;-1:-1:-1;93583:192:0;;;;;:::i;:::-;;:::i;77217:45::-;;;;;;;;;;;;;:::i;95929:133::-;;;;;;;;;;-1:-1:-1;95929:133:0;;;;;:::i;:::-;;:::i;95294:143::-;;;;;;;;;;-1:-1:-1;95294:143:0;;;;;:::i;:::-;;:::i;95445:353::-;;;;;;;;;;-1:-1:-1;95445:353:0;;;;;:::i;:::-;;:::i;77453:70::-;;;;;;;;;;;;;:::i;96070:119::-;;;;;;;;;;;;;:::i;98642:94::-;;;;;;;;;;;;;:::i;81818:162::-;;;;;;;;;;-1:-1:-1;81818:162:0;;;;;:::i;:::-;;:::i;52537:100::-;;;;;;;;;;-1:-1:-1;52537:100:0;;;;;:::i;:::-;;:::i;82093:92::-;;;;;;;;;;-1:-1:-1;82093:92:0;;;;;:::i;:::-;;:::i;28938:79::-;;;;;;;;;;;;;:::i;81345:110::-;;;;;;;;;;-1:-1:-1;81345:110:0;;;;;:::i;:::-;;:::i;34584:104::-;;;;;;;;;;;;;:::i;52013:109::-;;;;;;;;;;-1:-1:-1;52013:109:0;;;;;:::i;:::-;;:::i;82294:313::-;;;;;;;;;;-1:-1:-1;82294:313:0;;;;;:::i;:::-;;:::i;96197:121::-;;;;;;;;;;-1:-1:-1;96197:121:0;;;;;:::i;:::-;;:::i;98877:125::-;;;;;;;;;;;;;:::i;38947:388::-;;;;;;;;;;-1:-1:-1;38947:388:0;;;;;:::i;:::-;;:::i;77350:27::-;;;;;;;;;;;;;:::i;36026:200::-;;;;;;;;;;-1:-1:-1;36026:200:0;;;;;:::i;:::-;;:::i;94158:166::-;;;;;;;;;;-1:-1:-1;94158:166:0;;;;;:::i;:::-;;:::i;77602:23::-;;;;;;;;;;;;;:::i;81240:97::-;;;;;;;;;;-1:-1:-1;81240:97:0;;;;;:::i;:::-;;:::i;77422:22::-;;;;;;;;;;;;;:::i;78079:57::-;;;;;;;;;;-1:-1:-1;78079:57:0;;;;;:::i;:::-;;:::i;94777:180::-;;;;;;;;;;-1:-1:-1;94777:180:0;;;;;:::i;:::-;;:::i;86085:2649::-;;;;;;;;;;-1:-1:-1;86085:2649:0;;;;;:::i;:::-;;:::i;97412:331::-;;;;;;;;;;;;;:::i;77384:31::-;;;;;;;;;;;;;:::i;99010:182::-;;;;;;;;;;;;;:::i;51809:105::-;;;;;;;;;;-1:-1:-1;51809:105:0;;;;;:::i;:::-;;:::i;82193:93::-;;;;;;;;;;-1:-1:-1;82193:93:0;;;;;:::i;:::-;;:::i;96443:120::-;;;;;;;;;;-1:-1:-1;96443:120:0;;;;;:::i;:::-;;:::i;95806:115::-;;;;;;;;;;;;;:::i;93996:154::-;;;;;;;;;;;;;:::i;51599:119::-;;;;;;;;;;-1:-1:-1;51599:119:0;;;;;:::i;:::-;;:::i;82615:141::-;;;;;;;;;;-1:-1:-1;82615:141:0;;;;;:::i;:::-;;:::i;96952:123::-;;;;;;;;;;;;;:::i;36289:181::-;;;;;;;;;;-1:-1:-1;36289:181:0;;;;;:::i;:::-;;:::i;51347:95::-;;;;;;;;;;;;;:::i;98092:334::-;;;;;;;;;;;;;:::i;29883:281::-;;;;;;;;;;-1:-1:-1;29883:281:0;;;;;:::i;:::-;;:::i;96326:109::-;;;;;;;;;;;;;:::i;94628:141::-;;;;;;;;;;-1:-1:-1;94628:141:0;;;;;:::i;:::-;;:::i;93158:198::-;;;;;;;;;;-1:-1:-1;93158:198:0;;;;;:::i;:::-;;:::i;96826:118::-;;;;;;;;;;;;;:::i;96571:108::-;;;;;;;;;;;;;:::i;93364:211::-;;;;;;;;;;-1:-1:-1;93364:211:0;;;;;:::i;:::-;;:::i;80366:145::-;;;;;;;;;;-1:-1:-1;80366:145:0;;;;;:::i;:::-;;:::i;90920:1124::-;;;;;;;;;;-1:-1:-1;90920:1124:0;;;;;:::i;:::-;;:::i;28195:98::-;28275:10;28195:98;:::o;34365:100::-;34419:13;34452:5;34445:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34365:100;:::o;81463:166::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;;;;;;;;;81534:10:::1;:18:::0;;;81612:8:::1;::::0;81590:16:::1;::::0;81575:46:::1;::::0;81612:8;81575:32:::1;::::0;81547:5;;81575:14:::1;:32::i;:::-;:36:::0;::::1;:46::i;:::-;81563:9;:58:::0;-1:-1:-1;81463:166:0:o;36617:194::-;36720:4;36742:39;36751:12;:10;:12::i;:::-;36765:7;36774:6;36742:8;:39::i;:::-;-1:-1:-1;36799:4:0;36617:194;;;;;:::o;94965:321::-;95013:7;;95041:12;:10;:12::i;:::-;-1:-1:-1;;;;;95041:26:0;;;95033:59;;;;-1:-1:-1;;;95033:59:0;;;;;;;:::i;:::-;95125:17;;-1:-1:-1;;;;;95125:17:0;:30;95156:12;:10;:12::i;:::-;95125:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95103:107;;;;-1:-1:-1;;;95103:107:0;;;;;;;:::i;:::-;95228:17;;-1:-1:-1;;;;;95228:17:0;:36;95265:12;:10;:12::i;:::-;95228:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95221:57;;94965:321;:::o;81128:104::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;81205:12:::1;:19:::0;;-1:-1:-1;;;;;;81205:19:0::1;-1:-1:-1::0;;;;;81205:19:0;;;::::1;::::0;;;::::1;::::0;;81128:104::o;77632:24::-;;;;:::o;97083:321::-;97129:13;97187:1;97163:12;:10;:12::i;:::-;-1:-1:-1;;;;;97163:26:0;;;97155:59;;;;-1:-1:-1;;;97155:59:0;;;;;;;:::i;:::-;97247:17;;-1:-1:-1;;;;;97247:17:0;:30;97278:12;:10;:12::i;:::-;97247:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97225:107;;;;-1:-1:-1;;;97225:107:0;;;;;;;:::i;:::-;97350:17;;-1:-1:-1;;;;;97350:17:0;:32;97383:12;:10;:12::i;:::-;97350:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;97350:46:0;;;;;;;;;;;;:::i;77271:35::-;;;-1:-1:-1;;;;;77271:35:0;;:::o;35485:108::-;35573:12;;35485:108;:::o;52837:616::-;-1:-1:-1;;;;;52913:16:0;;52932:1;52913:16;;;:7;:16;;;;;;52905:71;;;;-1:-1:-1;;;52905:71:0;;;;;;;:::i;:::-;52989:21;53037:15;:13;:15::i;:::-;53013:39;;:21;:39;:::i;:::-;52989:63;;53063:15;53081:108;53111:7;53133:13;53161:17;53170:7;53161:8;:17::i;:::-;53081:15;:108::i;:::-;53063:126;-1:-1:-1;53210:12:0;53202:68;;;;-1:-1:-1;;;53202:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53283:18:0;;;;;;:9;:18;;;;;:29;;53305:7;;53283:18;:29;;53305:7;;53283:29;:::i;:::-;;;;;;;;53341:7;53323:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;53361:35:0;;-1:-1:-1;53379:7:0;53388;53361:17;:35::i;:::-;53412:33;53428:7;53437;53412:33;;;;;;;:::i;:::-;;;;;;;;52837:616;;;:::o;78026:46::-;;;;;;;;;;;;;;;:::o;37293:454::-;37433:4;37450:36;37460:6;37468:9;37479:6;37450:9;:36::i;:::-;37497:220;37520:6;37541:12;:10;:12::i;:::-;37568:138;37624:6;37568:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37568:19:0;;;;;;:11;:19;;;;;;37588:12;:10;:12::i;:::-;-1:-1:-1;;;;;37568:33:0;;;;;;;;;;;;-1:-1:-1;37568:33:0;;;:138;:37;:138::i;:::-;37497:8;:220::i;:::-;-1:-1:-1;37735:4:0;37293:454;;;;;;:::o;77532:25::-;;;;:::o;35327:93::-;35410:2;35327:93;:::o;38156:288::-;38259:4;38281:133;38304:12;:10;:12::i;:::-;38331:7;38353:50;38392:10;38353:11;:25;38365:12;:10;:12::i;:::-;-1:-1:-1;;;;;38353:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;38353:25:0;;;:34;;;;;;;;;;;:38;:50::i;51162:91::-;51233:12;;51162:91;:::o;52291:155::-;-1:-1:-1;;;;;52408:21:0;;;52376:7;52408:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;52291:155::o;94334:180::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;94409:21:::1;94400:6;:30;94396:66;;;-1:-1:-1::0;94441:21:0::1;94396:66;94481:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;94473:25:0::1;:33;94499:6;94473:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;94334:180:::0;:::o;81637:173::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;81709:16:::1;:24:::0;;;81793:8:::1;::::0;81756:10:::1;::::0;:46:::1;::::0;81793:8;81756:32:::1;::::0;81728:5;81756:14:::1;:32::i;53721:700::-:0;-1:-1:-1;;;;;53803:16:0;;53822:1;53803:16;;;:7;:16;;;;;;53795:71;;;;-1:-1:-1;;;53795:71:0;;;;;;;:::i;:::-;53879:21;53945:20;53959:5;53945:13;:20::i;:::-;53903:30;;-1:-1:-1;;;53903:30:0;;-1:-1:-1;;;;;53903:15:0;;;;;:30;;53927:4;;53903:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;53879:86;;53976:15;53994:115;54024:7;54046:13;54074:24;54083:5;54090:7;54074:8;:24::i;53994:115::-;53976:133;-1:-1:-1;54130:12:0;54122:68;;;;-1:-1:-1;;;54122:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54203:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;54237:7;;54203:21;:41;;54237:7;;54203:41;:::i;:::-;;;;-1:-1:-1;;;;;;;54255:26:0;;;;;;:19;:26;;;;;:37;;54285:7;;54255:26;:37;;54285:7;;54255:37;:::i;:::-;;;;-1:-1:-1;54305:47:0;;-1:-1:-1;54328:5:0;54335:7;54344;54305:22;:47::i;:::-;54389:5;-1:-1:-1;;;;;54368:45:0;;54396:7;54405;54368:45;;;;;;;:::i;:::-;;;;;;;;53721:700;;;;:::o;98744:125::-;98824:17;;:37;;;-1:-1:-1;;;98824:37:0;;;;98797:7;;-1:-1:-1;;;;;98824:17:0;;:35;;:37;;;;;;;;;;;;;;:17;:37;;;;;;;;;;77315:28;;;-1:-1:-1;;;;;77315:28:0;;:::o;89841:1069::-;89881:14;89898:12;:10;:12::i;:::-;89881:29;-1:-1:-1;;;;;;89943:20:0;;89921:113;;;;-1:-1:-1;;;89921:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;90054:22:0;;;;;;:14;:22;;;;;;;;90053:23;90045:67;;;;-1:-1:-1;;;90045:67:0;;;;;;;:::i;:::-;90155:12;;-1:-1:-1;;;;;90145:22:0;;;90155:12;;90145:22;;;;:52;;-1:-1:-1;90181:16:0;;-1:-1:-1;;;;;90171:26:0;;;90181:16;;90171:26;;90145:52;90123:158;;;;-1:-1:-1;;;90123:158:0;;;;;;;:::i;:::-;90315:17;;:44;;-1:-1:-1;;;90315:44:0;;90292:20;;-1:-1:-1;;;;;90315:17:0;;:36;;:44;;90352:6;;90315:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90292:67;;90407:1;90392:12;:16;90370:118;;;;-1:-1:-1;;;90370:118:0;;;;;;;:::i;:::-;90503:11;;;;;;;90499:279;;;90567:10;;90531:17;;90567:14;90563:164;;90614:37;90647:3;90614:28;90631:10;;90614:12;:16;;:28;;;;:::i;:::-;:32;;:37::i;:::-;90687:12;;90602:49;;-1:-1:-1;90670:41:0;;-1:-1:-1;;;;;90687:12:0;90602:49;90670:16;:41::i;:::-;90741:25;90757:9;90741:25;;:::i;:::-;;;90499:279;;90804:16;;90788:55;;-1:-1:-1;;;;;90804:16:0;90822:6;90830:12;90788:15;:55::i;:::-;90854:17;;:48;;-1:-1:-1;;;90854:48:0;;-1:-1:-1;;;;;90854:17:0;;;;:40;;:48;;90895:6;;90854:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;89841:1069;;:::o;77564:31::-;;;;:::o;92054:1096::-;92099:14;92116:12;:10;:12::i;:::-;92099:29;-1:-1:-1;;;;;;92161:20:0;;92139:113;;;;-1:-1:-1;;;92139:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;92272:22:0;;;;;;:14;:22;;;;;;;;92271:23;92263:67;;;;-1:-1:-1;;;92263:67:0;;;;;;;:::i;:::-;92373:12;;-1:-1:-1;;;;;92363:22:0;;;92373:12;;92363:22;;;;:52;;-1:-1:-1;92399:16:0;;-1:-1:-1;;;;;92389:26:0;;;92399:16;;92389:26;;92363:52;:73;;;;-1:-1:-1;92429:7:0;;-1:-1:-1;;;;;92419:17:0;;;92429:7;;92419:17;;92363:73;92341:184;;;;-1:-1:-1;;;92341:184:0;;;;;;;:::i;:::-;92559:17;;:44;;-1:-1:-1;;;92559:44:0;;92536:20;;-1:-1:-1;;;;;92559:17:0;;:36;;:44;;92596:6;;92559:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;92536:67;;92651:1;92636:12;:16;92614:118;;;;-1:-1:-1;;;92614:118:0;;;;;;;:::i;:::-;92747:11;;;;;;;92743:274;;;92811:10;;92775:17;;92811:14;92807:159;;92858:37;92891:3;92858:28;92875:10;;92858:12;:16;;:28;;;;:::i;:37::-;92931:7;;92846:49;;-1:-1:-1;92914:36:0;;-1:-1:-1;;;;;92931:7:0;92846:49;92914:16;:36::i;:::-;92980:25;92996:9;92980:25;;:::i;:::-;;;92743:274;;93043:16;;93027:62;;-1:-1:-1;;;;;93043:16:0;93069:4;93076:12;93027:15;:62::i;:::-;93100:17;;:42;;-1:-1:-1;;;93100:42:0;;-1:-1:-1;;;;;93100:17:0;;;;:34;;:42;;93135:6;;93100:42;;;:::i;94524:96::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;94592:11:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;94592:20:0;;::::1;::::0;;;::::1;::::0;;94524:96::o;96687:131::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;96762:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;96762:48:0;;-1:-1:-1;;;;;96762:17:0;;::::1;::::0;:34:::1;::::0;:48:::1;::::0;96797:12;;96762:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;96687:131:::0;:::o;97751:333::-;97799:13;97857:1;97833:12;:10;:12::i;:::-;-1:-1:-1;;;;;97833:26:0;;;97825:59;;;;-1:-1:-1;;;97825:59:0;;;;;;;:::i;:::-;97917:17;;-1:-1:-1;;;;;97917:17:0;:30;97948:12;:10;:12::i;:::-;97917:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97895:107;;;;-1:-1:-1;;;97895:107:0;;;;;;;:::i;:::-;98020:17;;-1:-1:-1;;;;;98020:17:0;:42;98063:12;:10;:12::i;77833:31::-;;;;:::o;99200:93::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;99271:5:::1;:14:::0;99200:93::o;80519:482::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;80628:15:::1;::::0;-1:-1:-1;;;;;80606:38:0;;::::1;80628:15:::0;::::1;80606:38;;80598:91;;;;-1:-1:-1::0;;;80598:91:0::1;;;;;;;:::i;:::-;80747:15;::::0;80705:59:::1;::::0;-1:-1:-1;;;;;80747:15:0;;::::1;::::0;80705:59;::::1;::::0;::::1;::::0;80747:15:::1;::::0;80705:59:::1;80775:15;:42:::0;;-1:-1:-1;;;;;;80775:42:0::1;-1:-1:-1::0;;;;;80775:42:0;;::::1;::::0;;;::::1;::::0;;;;80865:25:::1;::::0;;-1:-1:-1;;;80865:25:0;;;;-1:-1:-1;;80865:15:0;;::::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:15;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;80853:59:0::1;;80921:4;80928:15;;;;;;;;;-1:-1:-1::0;;;;;80928:15:0::1;-1:-1:-1::0;;;;;80928:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80853:99;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80963:13;:30:::0;;-1:-1:-1;;;;;;80963:30:0::1;-1:-1:-1::0;;;;;80963:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;80519:482:0:o;88742:1091::-;88802:14;88819:12;:10;:12::i;:::-;88802:29;-1:-1:-1;;;;;;88850:20:0;;88842:70;;;;-1:-1:-1;;;88842:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;88932:22:0;;;;;;:14;:22;;;;;;;;88931:23;88923:67;;;;-1:-1:-1;;;88923:67:0;;;;;;;:::i;:::-;89033:12;;-1:-1:-1;;;;;89023:22:0;;;89033:12;;89023:22;;;;:52;;-1:-1:-1;89059:16:0;;-1:-1:-1;;;;;89049:26:0;;;89059:16;;89049:26;;89023:52;89001:152;;;;-1:-1:-1;;;89001:152:0;;;;;;;:::i;:::-;89187:17;;:92;;-1:-1:-1;;;89187:92:0;;89164:20;;-1:-1:-1;;;;;89187:17:0;;:36;;:92;;89238:6;;89259:9;;89187:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89164:115;;89327:1;89312:12;:16;89290:112;;;;-1:-1:-1;;;89290:112:0;;;;;;;:::i;:::-;89419:11;;;;;;;89415:279;;;89483:10;;89447:17;;89483:14;89479:164;;89530:37;89563:3;89530:28;89547:10;;89530:12;:16;;:28;;;;:::i;:37::-;89603:12;;89518:49;;-1:-1:-1;89586:41:0;;-1:-1:-1;;;;;89603:12:0;89518:49;89586:16;:41::i;:::-;89657:25;89673:9;89657:25;;:::i;:::-;;;89415:279;;89720:16;;89704:55;;-1:-1:-1;;;;;89720:16:0;89738:6;89746:12;89704:15;:55::i;:::-;89770:17;;:55;;-1:-1:-1;;;89770:55:0;;-1:-1:-1;;;;;89770:17:0;;;;:36;;:55;;89807:6;;89815:9;;89770:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;88742:1091;;;:::o;81009:111::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;81087:16:::1;:25:::0;81009:111::o;81988:97::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;82059:10:::1;:18:::0;81988:97::o;93783:205::-;93890:17;;:90;;-1:-1:-1;;;93890:90:0;;93863:7;;-1:-1:-1;;;;;93890:17:0;;:33;;:90;;93938:7;;93960:9;;93890:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;77665:25::-;;;;:::o;98434:200::-;98514:7;98532;98550;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;98588:17:::1;;;;;;;;;-1:-1:-1::0;;;;;98588:17:0::1;-1:-1:-1::0;;;;;98588:36:0::1;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98581:45;;;;;;98434:200:::0;;;:::o;35656:157::-;-1:-1:-1;;;;;35787:18:0;35755:7;35787:18;;;;;;;;;;;;35656:157::o;29580:148::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;29671:6:::1;::::0;29650:40:::1;::::0;29687:1:::1;::::0;-1:-1:-1;;;;;29671:6:0::1;::::0;29650:40:::1;::::0;29687:1;;29650:40:::1;29701:6;:19:::0;;-1:-1:-1;;;;;;29701:19:0::1;::::0;;29580:148::o;93583:192::-;93672:17;;93645:7;;-1:-1:-1;;;;;93672:17:0;:33;93720:12;:10;:12::i;:::-;93747:9;93672:95;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;77217:45::-;;;-1:-1:-1;;;;;77217:45:0;;:::o;95929:133::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;96005:17:::1;::::0;:49:::1;::::0;-1:-1:-1;;;96005:49:0;;-1:-1:-1;;;;;96005:17:0;;::::1;::::0;:39:::1;::::0;:49:::1;::::0;96045:8;;96005:49:::1;;;:::i;95294:143::-:0;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;95375:17:::1;::::0;:54:::1;::::0;-1:-1:-1;;;95375:54:0;;-1:-1:-1;;;;;95375:17:0;;::::1;::::0;:37:::1;::::0;:54:::1;::::0;95413:15;;95375:54:::1;;;:::i;95445:353::-:0;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;95571:13:::1;:20;95595:1;95571:25;95563:70;;;;-1:-1:-1::0;;;95563:70:0::1;;;;;;;:::i;:::-;95652:13;:20;95676:1;95652:25;95644:70;;;;-1:-1:-1::0;;;95644:70:0::1;;;;;;;:::i;:::-;95725:17;::::0;:65:::1;::::0;-1:-1:-1;;;95725:65:0;;-1:-1:-1;;;;;95725:17:0;;::::1;::::0;:35:::1;::::0;:65:::1;::::0;95761:13;;95776;;95725:65:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;95445:353:::0;;:::o;77453:70::-;;;-1:-1:-1;;;;;77453:70:0;;:::o;96070:119::-;96147:17;;:34;;;-1:-1:-1;;;96147:34:0;;;;96120:7;;-1:-1:-1;;;;;96147:17:0;;:32;;:34;;;;;;;;;;;;;;:17;:34;;;;;;;;;;98642:94;98690:17;;;;;;;;;-1:-1:-1;;;;;98690:17:0;-1:-1:-1;;;;;98690:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;81818:162::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;81887:8:::1;:16:::0;;;81941::::1;::::0;81926:10:::1;::::0;:46:::1;::::0;81898:5;;81926:32:::1;::::0;:14:::1;:32::i;52537:100::-:0;52588:7;52615;52623:5;52615:14;;;;;;-1:-1:-1;;;52615:14:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52615:14:0;;52537:100;-1:-1:-1;;52537:100:0:o;82093:92::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;82163:6:::1;:14:::0;82093:92::o;28938:79::-;29003:6;;-1:-1:-1;;;;;29003:6:0;28938:79;:::o;81345:110::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;81424:16:::1;:23:::0;;-1:-1:-1;;;;;;81424:23:0::1;-1:-1:-1::0;;;;;81424:23:0;;;::::1;::::0;;;::::1;::::0;;81345:110::o;34584:104::-;34640:13;34673:7;34666:14;;;;;:::i;52013:109::-;-1:-1:-1;;;;;52096:18:0;52069:7;52096:18;;;:9;:18;;;;;;;52013:109::o;82294:313::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;82430:13:::1;::::0;-1:-1:-1;;;;;82422:21:0;;::::1;82430:13:::0;::::1;82422:21;;82400:145;;;;-1:-1:-1::0;;;82400:145:0::1;;;;;;;:::i;:::-;82558:41;82587:4;82593:5;82558:28;:41::i;96197:121::-:0;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;96267:17:::1;::::0;:43:::1;::::0;-1:-1:-1;;;96267:43:0;;-1:-1:-1;;;;;96267:17:0;;::::1;::::0;:34:::1;::::0;:43:::1;::::0;96302:7;;96267:43:::1;;;:::i;98877:125::-:0;98957:17;;:37;;;-1:-1:-1;;;98957:37:0;;;;98930:7;;-1:-1:-1;;;;;98957:17:0;;:35;;:37;;;;;;;;;;;;;;:17;:37;;;;;;;;;;38947:388;39055:4;39077:228;39100:12;:10;:12::i;:::-;39127:7;39149:145;39206:15;39149:145;;;;;;;;;;;;;;;;;:11;:25;39161:12;:10;:12::i;:::-;-1:-1:-1;;;;;39149:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;39149:25:0;;;:34;;;;;;;;;;;:145;:38;:145::i;77350:27::-;;;-1:-1:-1;;;;;77350:27:0;;:::o;36026:200::-;36132:4;36154:42;36164:12;:10;:12::i;:::-;36178:9;36189:6;36154:9;:42::i;94158:166::-;94250:17;;:66;;-1:-1:-1;;;94250:66:0;;94223:7;;-1:-1:-1;;;;;94250:17:0;;:33;;:66;;94298:7;;94250:66;;;:::i;77602:23::-;;;;:::o;81240:97::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;81315:7:::1;:14:::0;;-1:-1:-1;;;;;;81315:14:0::1;-1:-1:-1::0;;;;;81315:14:0;;;::::1;::::0;;;::::1;::::0;;81240:97::o;77422:22::-;;;-1:-1:-1;;;;;77422:22:0;;:::o;78079:57::-;;;;;;;;;;;;;;;:::o;94777:180::-;94872:7;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;94904:17:::1;::::0;:45:::1;::::0;-1:-1:-1;;;94904:45:0;;-1:-1:-1;;;;;94904:17:0;;::::1;::::0;:36:::1;::::0;:45:::1;::::0;94941:7;;94904:45:::1;;;:::i;86085:2649::-:0;86217:1;86202:4;86196:18;:22;:49;;;;;86243:2;86228:4;86222:18;:23;86196:49;86174:131;;;;-1:-1:-1;;;86174:131:0;;;;;;;:::i;:::-;86316:14;86333:12;:10;:12::i;:::-;86316:29;-1:-1:-1;;;;;;86378:20:0;;86356:116;;;;-1:-1:-1;;;86356:116:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;86492:22:0;;;;;;:14;:22;;;;;;;;86491:23;86483:70;;;;-1:-1:-1;;;86483:70:0;;;;;;;:::i;:::-;86596:12;;-1:-1:-1;;;;;86586:22:0;;;86596:12;;86586:22;;;;:52;;-1:-1:-1;86622:16:0;;-1:-1:-1;;;;;86612:26:0;;;86622:16;;86612:26;;86586:52;:73;;;;-1:-1:-1;86652:7:0;;-1:-1:-1;;;;;86642:17:0;;;86652:7;;86642:17;;86586:73;86564:183;;;;-1:-1:-1;;;86564:183:0;;;;;;;:::i;:::-;86787:17;;:32;;;-1:-1:-1;;;86787:32:0;;;;86764:20;;-1:-1:-1;;;;;86787:17:0;;:30;;:32;;;;;;;;;;;;;;:17;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86764:55;-1:-1:-1;86850:10:0;86893:25;;;;86871:123;;;;-1:-1:-1;;;86871:123:0;;;;;;;:::i;:::-;87048:19;:9;87062:4;87048:13;:19::i;:::-;87027:17;87037:6;87027:9;:17::i;:::-;:40;;87005:154;;;;-1:-1:-1;;;87005:154:0;;;;;;;:::i;:::-;87170:28;87201:24;87219:4;87201:9;:24::i;:::-;87280:16;;87170:55;;-1:-1:-1;87256:40:0;;;;;;;87325;;-1:-1:-1;87354:11:0;;;;;;;87325:40;:66;;;;-1:-1:-1;87383:8:0;;;;87382:9;87325:66;:100;;;;;87418:7;:5;:7::i;:::-;-1:-1:-1;;;;;87408:17:0;:6;-1:-1:-1;;;;;87408:17:0;;;87325:100;:151;;;;-1:-1:-1;;;;;;87443:33:0;;;;;;:25;:33;;;;;;;;87442:34;87325:151;87307:1275;;;87503:8;:15;;-1:-1:-1;;87503:15:0;87514:4;87503:15;;;87579:8;;87503;;87554:43;;87593:3;;87554:34;;:20;;:24;:34::i;:43::-;87535:62;;87612:17;87632:31;87659:3;87632:22;87645:8;;87632;:12;;:22;;;;:::i;:31::-;87612:51;-1:-1:-1;87678:19:0;87700:23;:8;87612:51;87700:12;:23::i;:::-;87757:7;;87678:45;;-1:-1:-1;87740:36:0;;-1:-1:-1;;;;;87757:7:0;87766:9;87740:16;:36::i;:::-;87808:12;;87791:43;;-1:-1:-1;;;;;87808:12:0;87822:11;87791:16;:43::i;:::-;87851:25;87879:73;87948:3;87879:50;87918:10;;87879:20;:38;;:50;;;;:::i;:73::-;87851:101;;87969:27;87999:70;88051:3;87999:29;88021:6;;87999:17;:21;;:29;;;;:::i;:70::-;88103:16;;87969:100;;-1:-1:-1;88086:55:0;;-1:-1:-1;;;;;88103:16:0;87969:100;88086:16;:55::i;:::-;88222:16;;88156:158;;88198:4;;-1:-1:-1;;;;;88222:16:0;88257:42;:17;88279:19;88257:21;:42::i;:::-;88156:15;:158::i;:::-;88331:18;88352:83;88417:3;88352:42;88377:16;;88352:20;:24;;:42;;;;:::i;:83::-;88331:104;;88452:26;88467:10;88452:14;:26::i;:::-;88495:42;88512:24;88530:4;88512:9;:24::i;:::-;88495:16;:42::i;:::-;-1:-1:-1;;88554:8:0;:16;;-1:-1:-1;;88554:16:0;;;-1:-1:-1;;;;87307:1275:0;88592:59;88608:6;88624:4;88631:19;:9;88645:4;88631:13;:19::i;88592:59::-;88662:17;;-1:-1:-1;;;;;88662:17:0;:28;88691:6;88699:4;88705:20;:10;88720:4;88705:14;:20::i;:::-;88662:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86085:2649;;;;;;;:::o;97412:331::-;97461:13;97519:1;97495:12;:10;:12::i;:::-;-1:-1:-1;;;;;97495:26:0;;;97487:59;;;;-1:-1:-1;;;97487:59:0;;;;;;;:::i;:::-;97579:17;;-1:-1:-1;;;;;97579:17:0;:30;97610:12;:10;:12::i;:::-;97579:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97557:107;;;;-1:-1:-1;;;97557:107:0;;;;;;;:::i;:::-;97682:17;;-1:-1:-1;;;;;97682:17:0;:39;97722:12;:10;:12::i;77384:31::-;;;-1:-1:-1;;;;;77384:31:0;;:::o;99010:182::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;99074:11:::1;::::0;::::1;;99073:12;99065:47;;;;-1:-1:-1::0;;;99065:47:0::1;;;;;;;:::i;:::-;99123:11;:18:::0;;-1:-1:-1;;99123:18:0::1;99137:4;99123:18;::::0;;99172:12:::1;99152:17;:32:::0;99010:182::o;51809:105::-;-1:-1:-1;;;;;51890:16:0;51863:7;51890:16;;;:7;:16;;;;;;;51809:105::o;82193:93::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;82262:8:::1;:16:::0;82193:93::o;96443:120::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;96511:17:::1;::::0;:44:::1;::::0;-1:-1:-1;;;96511:44:0;;-1:-1:-1;;;;;96511:17:0;;::::1;::::0;:35:::1;::::0;:44:::1;::::0;96547:7;;96511:44:::1;;;:::i;95806:115::-:0;95881:17;;:32;;;-1:-1:-1;;;95881:32:0;;;;95854:7;;-1:-1:-1;;;;;95881:17:0;;:30;;:32;;;;;;;;;;;;;;:17;:32;;;;;;;;;;93996:154;94071:17;;94044:7;;-1:-1:-1;;;;;94071:17:0;:33;94119:12;:10;:12::i;51599:119::-;-1:-1:-1;;;;;51684:26:0;51657:7;51684:26;;;:19;:26;;;;;;;51599:119::o;82615:141::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;82717:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;82717:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;82615:141::o;96952:123::-;97026:17;;:41;;;-1:-1:-1;;;97026:41:0;;;;96999:7;;-1:-1:-1;;;;;97026:17:0;;:39;;:41;;;;;;;;;;;;;;:17;:41;;;;;;;;;;36289:181;-1:-1:-1;;;;;36435:18:0;;;36403:7;36435:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;36289:181::o;51347:95::-;51420:14;;51347:95;:::o;98092:334::-;98143:13;98201:1;98177:12;:10;:12::i;:::-;-1:-1:-1;;;;;98177:26:0;;;98169:59;;;;-1:-1:-1;;;98169:59:0;;;;;;;:::i;:::-;98261:17;;-1:-1:-1;;;;;98261:17:0;:30;98292:12;:10;:12::i;:::-;98261:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98239:107;;;;-1:-1:-1;;;98239:107:0;;;;;;;:::i;:::-;98364:17;;-1:-1:-1;;;;;98364:17:0;:40;98405:12;:10;:12::i;29883:281::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29986:22:0;::::1;29964:110;;;;-1:-1:-1::0;;;29964:110:0::1;;;;;;;:::i;:::-;30111:6;::::0;30090:38:::1;::::0;-1:-1:-1;;;;;30090:38:0;;::::1;::::0;30111:6:::1;::::0;30090:38:::1;::::0;30111:6:::1;::::0;30090:38:::1;30139:6;:17:::0;;-1:-1:-1;;;;;;30139:17:0::1;-1:-1:-1::0;;;;;30139:17:0;;;::::1;::::0;;;::::1;::::0;;29883:281::o;96326:109::-;96398:17;;:29;;;-1:-1:-1;;;96398:29:0;;;;96371:7;;-1:-1:-1;;;;;96398:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;94628:141;94718:17;;:43;;-1:-1:-1;;;94718:43:0;;94691:7;;-1:-1:-1;;;;;94718:17:0;;:34;;:43;;94753:7;;94718:43;;;:::i;93158:198::-;93252:17;;93225:7;;-1:-1:-1;;;;;93252:17:0;:34;93301:12;:10;:12::i;96826:118::-;96898:17;;:38;;;-1:-1:-1;;;96898:38:0;;;;96871:7;;-1:-1:-1;;;;;96898:17:0;;:36;;:38;;;;;;;;;;;;;;:17;:38;;;;;;;;;;96571:108;96641:17;;:30;;;-1:-1:-1;;;96641:30:0;;;;96617:4;;-1:-1:-1;;;;;96641:17:0;;:28;;:30;;;;;;;;;;;;;;:17;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;93364:211::-;93476:17;;:91;;-1:-1:-1;;;93476:91:0;;93449:7;;-1:-1:-1;;;;;93476:17:0;;:34;;:91;;93525:7;;93547:9;;93476:91;;;:::i;80366:145::-;29160:12;:10;:12::i;:::-;29150:6;;-1:-1:-1;;;;;29150:6:0;;;:22;;;29142:67;;;;-1:-1:-1;;;29142:67:0;;;;;;;:::i;:::-;80447:17:::1;:56:::0;;-1:-1:-1;;;;;;80447:56:0::1;-1:-1:-1::0;;;;;80447:56:0;;;::::1;::::0;;;::::1;::::0;;80366:145::o;90920:1124::-;90979:14;90996:12;:10;:12::i;:::-;90979:29;-1:-1:-1;;;;;;91027:20:0;;91019:70;;;;-1:-1:-1;;;91019:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;91109:22:0;;;;;;:14;:22;;;;;;;;91108:23;91100:67;;;;-1:-1:-1;;;91100:67:0;;;;;;;:::i;:::-;91210:12;;-1:-1:-1;;;;;91200:22:0;;;91210:12;;91200:22;;;;:52;;-1:-1:-1;91236:16:0;;-1:-1:-1;;;;;91226:26:0;;;91236:16;;91226:26;;91200:52;:73;;;;-1:-1:-1;91266:7:0;;-1:-1:-1;;;;;91256:17:0;;;91266:7;;91256:17;;91200:73;91178:177;;;;-1:-1:-1;;;91178:177:0;;;;;;;:::i;:::-;91389:17;;:92;;-1:-1:-1;;;91389:92:0;;91366:20;;-1:-1:-1;;;;;91389:17:0;;:36;;:92;;91440:6;;91461:9;;91389:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91366:115;;91529:1;91514:12;:16;91492:122;;;;-1:-1:-1;;;91492:122:0;;;;;;;:::i;:::-;91631:11;;;;;;;91627:274;;;91695:10;;91659:17;;91695:14;91691:159;;91742:37;91775:3;91742:28;91759:10;;91742:12;:16;;:28;;;;:::i;:37::-;91815:7;;91730:49;;-1:-1:-1;91798:36:0;;-1:-1:-1;;;;;91815:7:0;91730:49;91798:16;:36::i;:::-;91864:25;91880:9;91864:25;;:::i;:::-;;;91627:274;;91929:16;;91913:62;;-1:-1:-1;;;;;91929:16:0;91955:4;91962:12;91913:15;:62::i;:::-;91986:17;;:50;;-1:-1:-1;;;91986:50:0;;-1:-1:-1;;;;;91986:17:0;;;;:31;;:50;;92018:6;;92026:9;;91986:50;;;:::i;3939:181::-;3997:7;;4029:5;4033:1;4029;:5;:::i;:::-;4017:17;;4058:1;4053;:6;;4045:46;;;;-1:-1:-1;;;4045:46:0;;;;;;;:::i;42326:380::-;-1:-1:-1;;;;;42462:19:0;;42454:68;;;;-1:-1:-1;;;42454:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42541:21:0;;42533:68;;;;-1:-1:-1;;;42533:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42614:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;42666:32;;;;;42644:6;;42666:32;:::i;:::-;;;;;;;;42326:380;;;:::o;54599:257::-;54818:12;;-1:-1:-1;;;;;54798:16:0;;54745:7;54798:16;;;:7;:16;;;;;;54745:7;;54833:15;;54782:32;;:13;:32;:::i;:::-;54781:49;;;;:::i;:::-;:67;;;;:::i;:::-;54765:83;54599:257;-1:-1:-1;;;;54599:257:0:o;12161:391::-;12290:6;12265:21;:31;;12243:110;;;;-1:-1:-1;;;12243:110:0;;;;;;;:::i;:::-;12367:12;12385:9;-1:-1:-1;;;;;12385:14:0;12407:6;12385:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12366:52;;;12451:7;12429:115;;;;-1:-1:-1;;;12429:115:0;;;;;;;:::i;83122:1177::-;-1:-1:-1;;;;;83269:20:0;;;;;;:14;:20;;;;;;;;83268:21;:44;;;;-1:-1:-1;;;;;;83294:18:0;;;;;;:14;:18;;;;;;;;83293:19;83268:44;83246:113;;;;-1:-1:-1;;;83246:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;83378:18:0;;83370:68;;;;-1:-1:-1;;;83370:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;83457:16:0;;83449:64;;;;-1:-1:-1;;;83449:64:0;;;;;;;:::i;:::-;83536:7;:5;:7::i;:::-;-1:-1:-1;;;;;83528:15:0;:4;-1:-1:-1;;;;;83528:15:0;;;:38;;;;-1:-1:-1;83553:13:0;;-1:-1:-1;;;;;83547:19:0;;;83553:13;;83547:19;;83528:38;:72;;;;-1:-1:-1;83584:15:0;;-1:-1:-1;;;;;83570:30:0;;;83584:15;;83570:30;;83528:72;:95;;;;-1:-1:-1;;;;;;83604:19:0;;83618:4;83604:19;;83528:95;:120;;;;-1:-1:-1;;;;;;83627:21:0;;83643:4;83627:21;;83528:120;83524:724;;;83673:11;;;;83665:48;;;;-1:-1:-1;;;83665:48:0;;;;;;;:::i;:::-;83767:12;;-1:-1:-1;;;;;83761:18:0;;;83767:12;;83761:18;;;;:44;;-1:-1:-1;83789:16:0;;-1:-1:-1;;;;;83783:22:0;;;83789:16;;83783:22;;83761:44;:61;;;;-1:-1:-1;83815:7:0;;-1:-1:-1;;;;;83809:13:0;;;83815:7;;83809:13;;83761:61;:85;;;;-1:-1:-1;83834:12:0;;-1:-1:-1;;;;;83826:20:0;;;83834:12;;83826:20;;83761:85;:113;;;;-1:-1:-1;83858:16:0;;-1:-1:-1;;;;;83850:24:0;;;83858:16;;83850:24;;83761:113;:132;;;;-1:-1:-1;83886:7:0;;-1:-1:-1;;;;;83878:15:0;;;83886:7;;83878:15;;83761:132;83757:480;;;83914:19;83936:13;:11;:13::i;:::-;83914:35;;83968:21;83992:22;84010:2;83992:9;:22::i;:::-;83968:46;;84092:33;84119:5;84092:22;84108:5;;84092:11;:15;;:22;;;;:::i;:33::-;84063:25;:6;84074:13;84063:10;:25::i;:::-;:62;;84033:170;;;;-1:-1:-1;;;84033:170:0;;;;;;;:::i;:::-;83757:480;;;84258:33;84274:4;84280:2;84284:6;84258:15;:33::i;4842:226::-;4962:7;4998:12;4990:6;;;;4982:29;;;;-1:-1:-1;;;4982:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5022:9:0;5034:5;5038:1;5034;:5;:::i;:::-;5022:17;4842:226;-1:-1:-1;;;;;4842:226:0:o;44064:248::-;44181:123;44215:5;44258:23;;;44283:2;44287:5;44235:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;44235:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44181:19;:123::i;5327:471::-;5385:7;5630:6;5626:47;;-1:-1:-1;5660:1:0;5653:8;;5626:47;5685:9;5697:5;5701:1;5697;:5;:::i;:::-;5685:17;-1:-1:-1;5730:1:0;5721:5;5725:1;5685:17;5721:5;:::i;:::-;:10;5713:56;;;;-1:-1:-1;;;5713:56:0;;;;;;;:::i;6274:132::-;6332:7;6359:39;6363:1;6366;6359:39;;;;;;;;;;;;;;;;;:3;:39::i;84307:304::-;84417:21;84449:24;84466:6;84449:16;:24::i;:::-;84484:18;84505:46;84506:21;84533:17;84505:27;:46::i;:::-;84562:41;;84484:67;;-1:-1:-1;;;;;;84562:29:0;;;:41;;;;;84484:67;;84562:41;;;;84484:67;84562:29;:41;;;;;;;;;;;;;;;;;;;39825:610;-1:-1:-1;;;;;39965:20:0;;39957:70;;;;-1:-1:-1;;;39957:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40046:23:0;;40038:71;;;;-1:-1:-1;;;40038:71:0;;;;;;;:::i;:::-;40122:47;40143:6;40151:9;40162:6;40122:20;:47::i;:::-;40202:108;40238:6;40202:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40202:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;40182:17:0;;;:9;:17;;;;;;;;;;;:128;;;;40344:20;;;;;;;:32;;40369:6;40344:24;:32::i;:::-;-1:-1:-1;;;;;40321:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;40392:35;;;;;;;;;;40420:6;;40392:35;:::i;82764:350::-;-1:-1:-1;;;;;82869:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;82847:151;;;;-1:-1:-1;;;82847:151:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;83009:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;83009:39:0;;;;;;;;;;83066:40;;83009:39;;:31;83066:40;;;82764:350;;:::o;4403:136::-;4461:7;4488:43;4492:1;4495;4488:43;;;;;;;;;;;;;;;;;:3;:43::i;84619:420::-;84678:12;84693:13;:6;84704:1;84693:10;:13::i;:::-;84678:28;-1:-1:-1;84717:17:0;84737:16;:6;84678:28;84737:10;:16::i;:::-;84717:36;-1:-1:-1;84791:21:0;84825:22;84842:4;84825:16;:22::i;:::-;84860:18;84881:41;:21;84907:14;84881:25;:41::i;:::-;84860:62;;84935:35;84948:9;84959:10;84935:12;:35::i;:::-;84988:43;85003:4;85009:10;85021:9;84988:43;;;;;;;;:::i;:::-;;;;;;;;84619:420;;;;;:::o;85047:505::-;85137:16;;;85151:1;85137:16;;;;;;;;85113:21;;85137:16;;;;;;;;;;-1:-1:-1;85137:16:0;85113:40;;85182:4;85164;85169:1;85164:7;;;;;;-1:-1:-1;;;85164:7:0;;;;;;;;;-1:-1:-1;;;;;85164:23:0;;;:7;;;;;;;;;;:23;;;;85208:15;;:23;;;-1:-1:-1;;;85208:23:0;;;;:15;;;;;:21;;:23;;;;;85164:7;;85208:23;;;;;:15;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85198:4;85203:1;85198:7;;;;;;-1:-1:-1;;;85198:7:0;;;;;;;;;-1:-1:-1;;;;;85198:33:0;;;:7;;;;;;;;;:33;85276:15;;85244:62;;85261:4;;85276:15;85294:11;85244:8;:62::i;:::-;85319:15;;:225;;-1:-1:-1;;;85319:225:0;;-1:-1:-1;;;;;85319:15:0;;;;:67;;:225;;85401:11;;85319:15;;85471:4;;85498;;85518:15;;85319:225;;;:::i;46979:802::-;47403:23;47429:106;47471:4;47429:106;;;;;;;;;;;;;;;;;47437:5;-1:-1:-1;;;;;47429:27:0;;;:106;;;;;:::i;:::-;47550:17;;47403:132;;-1:-1:-1;47550:21:0;47546:228;;47665:10;47654:30;;;;;;;;;;;;:::i;:::-;47628:134;;;;-1:-1:-1;;;47628:134:0;;;;;;;:::i;6902:312::-;7022:7;7057:12;7050:5;7042:28;;;;-1:-1:-1;;;7042:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7081:9:0;7093:5;7097:1;7093;:5;:::i;85560:517::-;85740:15;;85708:62;;85725:4;;-1:-1:-1;;;;;85740:15:0;85758:11;85708:8;:62::i;:::-;85813:15;;:256;;-1:-1:-1;;;85813:256:0;;-1:-1:-1;;;;;85813:15:0;;;;:32;;85853:9;;85813:256;;85886:4;;85906:11;;85813:15;;;;;;86043;;85813:256;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13575:229::-;13712:12;13744:52;13766:6;13774:4;13780:1;13783:12;13712;15099:18;15110:6;15099:10;:18::i;:::-;15091:60;;;;-1:-1:-1;;;15091:60:0;;;;;;;:::i;:::-;15165:12;15179:23;15206:6;-1:-1:-1;;;;;15206:11:0;15225:5;15246:4;15206:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15164:97;;;;15279:51;15296:7;15305:10;15317:12;15279:16;:51::i;:::-;15272:58;14767:571;-1:-1:-1;;;;;;;14767:571:0:o;11001:387::-;11324:20;11372:8;;;11001:387::o;17667:712::-;17817:12;17846:7;17842:530;;;-1:-1:-1;17877:10:0;17870:17;;17842:530;17991:17;;:21;17987:374;;18189:10;18183:17;18250:15;18237:10;18233:2;18229:19;18222:44;18137:148;18332:12;18325:20;;-1:-1:-1;;;18325:20:0;;;;;;;;:::i;14:749:1:-;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;238:18;234:2;231:26;228:2;;;260:18;;:::i;:::-;307:2;303;299:11;330:27;353:2;349;345:11;330:27;:::i;:::-;391:15;;;422:12;;;;454:15;;;488;;;484:24;;481:33;-1:-1:-1;478:2:1;;;531:5;524;517:20;478:2;557:5;548:14;;571:163;585:2;582:1;579:9;571:163;;;642:17;;630:30;;603:1;596:9;;;;;680:12;;;;712;;571:163;;;-1:-1:-1;752:5:1;84:679;-1:-1:-1;;;;;;;84:679:1:o;768:259::-;;880:2;868:9;859:7;855:23;851:32;848:2;;;901:6;893;886:22;848:2;945:9;932:23;964:33;991:5;964:33;:::i;1032:263::-;;1155:2;1143:9;1134:7;1130:23;1126:32;1123:2;;;1176:6;1168;1161:22;1123:2;1213:9;1207:16;1232:33;1259:5;1232:33;:::i;1572:402::-;;;1701:2;1689:9;1680:7;1676:23;1672:32;1669:2;;;1722:6;1714;1707:22;1669:2;1766:9;1753:23;1785:33;1812:5;1785:33;:::i;:::-;1837:5;-1:-1:-1;1894:2:1;1879:18;;1866:32;1907:35;1866:32;1907:35;:::i;:::-;1961:7;1951:17;;;1659:315;;;;;:::o;1979:470::-;;;;2125:2;2113:9;2104:7;2100:23;2096:32;2093:2;;;2146:6;2138;2131:22;2093:2;2190:9;2177:23;2209:33;2236:5;2209:33;:::i;:::-;2261:5;-1:-1:-1;2318:2:1;2303:18;;2290:32;2331:35;2290:32;2331:35;:::i;:::-;2083:366;;2385:7;;-1:-1:-1;;;2439:2:1;2424:18;;;;2411:32;;2083:366::o;2454:396::-;;;2580:2;2568:9;2559:7;2555:23;2551:32;2548:2;;;2601:6;2593;2586:22;2548:2;2645:9;2632:23;2664:33;2691:5;2664:33;:::i;:::-;2716:5;-1:-1:-1;2773:2:1;2758:18;;2745:32;2786;2745;2786;:::i;2855:327::-;;;2984:2;2972:9;2963:7;2959:23;2955:32;2952:2;;;3005:6;2997;2990:22;2952:2;3049:9;3036:23;3068:33;3095:5;3068:33;:::i;:::-;3120:5;3172:2;3157:18;;;;3144:32;;-1:-1:-1;;;2942:240:1:o;3187:637::-;;;3366:2;3354:9;3345:7;3341:23;3337:32;3334:2;;;3387:6;3379;3372:22;3334:2;3432:9;3419:23;3461:18;3502:2;3494:6;3491:14;3488:2;;;3523:6;3515;3508:22;3488:2;3551:67;3610:7;3601:6;3590:9;3586:22;3551:67;:::i;:::-;3541:77;;3671:2;3660:9;3656:18;3643:32;3627:48;;3700:2;3690:8;3687:16;3684:2;;;3721:6;3713;3706:22;3684:2;;3749:69;3810:7;3799:8;3788:9;3784:24;3749:69;:::i;:::-;3739:79;;;3324:500;;;;;:::o;3829:253::-;;3938:2;3926:9;3917:7;3913:23;3909:32;3906:2;;;3959:6;3951;3944:22;3906:2;4003:9;3990:23;4022:30;4046:5;4022:30;:::i;4087:257::-;;4207:2;4195:9;4186:7;4182:23;4178:32;4175:2;;;4228:6;4220;4213:22;4175:2;4265:9;4259:16;4284:30;4308:5;4284:30;:::i;5050:677::-;;5183:2;5171:9;5162:7;5158:23;5154:32;5151:2;;;5204:6;5196;5189:22;5151:2;5242:9;5236:16;5275:18;5267:6;5264:30;5261:2;;;5312:6;5304;5297:22;5261:2;5340:22;;5393:4;5385:13;;5381:27;-1:-1:-1;5371:2:1;;5427:6;5419;5412:22;5371:2;5461;5455:9;5486:50;5501:34;5532:2;5501:34;:::i;:::-;5486:50;:::i;:::-;5559:2;5552:5;5545:17;5599:7;5594:2;5589;5585;5581:11;5577:20;5574:33;5571:2;;;5625:6;5617;5610:22;5571:2;5643:54;5694:2;5689;5682:5;5678:14;5673:2;5669;5665:11;5643:54;:::i;5732:797::-;;;5871:2;5859:9;5850:7;5846:23;5842:32;5839:2;;;5892:6;5884;5877:22;5839:2;5937:9;5924:23;5970:18;5962:6;5959:30;5956:2;;;6007:6;5999;5992:22;5956:2;6035:22;;6088:4;6080:13;;6076:27;-1:-1:-1;6066:2:1;;6122:6;6114;6107:22;6066:2;6163;6150:16;6188:50;6203:34;6234:2;6203:34;:::i;6188:50::-;6261:2;6254:5;6247:17;6303:7;6296:4;6291:2;6287;6283:11;6279:22;6276:35;6273:2;;;6329:6;6321;6314:22;6273:2;6393;6386:4;6382:2;6378:13;6371:4;6364:5;6360:16;6347:49;6416:14;;;6432:4;6412:25;;;6405:41;;;;6420:5;6502:20;;;;6489:34;;-1:-1:-1;;;5829:700:1:o;6534:190::-;;6646:2;6634:9;6625:7;6621:23;6617:32;6614:2;;;6667:6;6659;6652:22;6614:2;-1:-1:-1;6695:23:1;;6604:120;-1:-1:-1;6604:120:1:o;6729:194::-;;6852:2;6840:9;6831:7;6827:23;6823:32;6820:2;;;6873:6;6865;6858:22;6820:2;-1:-1:-1;6901:16:1;;6810:113;-1:-1:-1;6810:113:1:o;6928:316::-;;;;7085:2;7073:9;7064:7;7060:23;7056:32;7053:2;;;7106:6;7098;7091:22;7053:2;7140:9;7134:16;7124:26;;7190:2;7179:9;7175:18;7169:25;7159:35;;7234:2;7223:9;7219:18;7213:25;7203:35;;7043:201;;;;;:::o;7249:443::-;;7346:5;7340:12;7373:6;7368:3;7361:19;7399:4;7428:2;7423:3;7419:12;7412:19;;7465:2;7458:5;7454:14;7486:3;7498:169;7512:6;7509:1;7506:13;7498:169;;;7573:13;;7561:26;;7607:12;;;;7642:15;;;;7534:1;7527:9;7498:169;;;-1:-1:-1;7683:3:1;;7316:376;-1:-1:-1;;;;;7316:376:1:o;7697:260::-;;7779:5;7773:12;7806:6;7801:3;7794:19;7822:63;7878:6;7871:4;7866:3;7862:14;7855:4;7848:5;7844:16;7822:63;:::i;:::-;7939:2;7918:15;-1:-1:-1;;7914:29:1;7905:39;;;;7946:4;7901:50;;7749:208;-1:-1:-1;;7749:208:1:o;7962:274::-;;8129:6;8123:13;8145:53;8191:6;8186:3;8179:4;8171:6;8167:17;8145:53;:::i;:::-;8214:16;;;;;8099:137;-1:-1:-1;;8099:137:1:o;8241:205::-;8441:3;8432:14::o;8451:226::-;-1:-1:-1;;;;;8615:55:1;;;;8597:74;;8585:2;8570:18;;8552:125::o;8682:305::-;-1:-1:-1;;;;;8882:55:1;;;;8864:74;;8969:2;8954:18;;8947:34;8852:2;8837:18;;8819:168::o;8992:327::-;-1:-1:-1;;;;;9245:15:1;;;9227:34;;9297:15;;9292:2;9277:18;;9270:43;9154:2;9139:18;;9121:198::o;9324:413::-;;-1:-1:-1;;;;;9533:6:1;9529:55;9518:9;9511:74;9621:2;9616;9605:9;9601:18;9594:30;9641:47;9684:2;9673:9;9669:18;9661:6;9641:47;:::i;:::-;9633:55;;9724:6;9719:2;9708:9;9704:18;9697:34;9501:236;;;;;;:::o;10044:630::-;-1:-1:-1;;;;;10426:15:1;;;10408:34;;10473:2;10458:18;;10451:34;;;;10516:2;10501:18;;10494:34;;;;10559:2;10544:18;;10537:34;;;;10608:15;;;10602:3;10587:19;;10580:44;10655:3;10640:19;;10633:35;;;;10334:3;10319:19;;10301:373::o;10679:477::-;;10936:2;10925:9;10918:21;10962:62;11020:2;11009:9;11005:18;10997:6;10962:62;:::i;:::-;11072:9;11064:6;11060:22;11055:2;11044:9;11040:18;11033:50;11100;11143:6;11135;11100:50;:::i;11161:187::-;11326:14;;11319:22;11301:41;;11289:2;11274:18;;11256:92::o;11865:222::-;;12014:2;12003:9;11996:21;12034:47;12077:2;12066:9;12062:18;12054:6;12034:47;:::i;12092:414::-;12294:2;12276:21;;;12333:2;12313:18;;;12306:30;12372:34;12367:2;12352:18;;12345:62;12443:20;12438:2;12423:18;;12416:48;12496:3;12481:19;;12266:240::o;12511:399::-;12713:2;12695:21;;;12752:2;12732:18;;;12725:30;12791:34;12786:2;12771:18;;12764:62;-1:-1:-1;;;12857:2:1;12842:18;;12835:33;12900:3;12885:19;;12685:225::o;12915:356::-;13117:2;13099:21;;;13136:18;;;13129:30;13195:34;13190:2;13175:18;;13168:62;13262:2;13247:18;;13089:182::o;13276:337::-;13478:2;13460:21;;;13517:2;13497:18;;;13490:30;-1:-1:-1;;;13551:2:1;13536:18;;13529:43;13604:2;13589:18;;13450:163::o;13618:356::-;13820:2;13802:21;;;13839:18;;;13832:30;13898:34;13893:2;13878:18;;13871:62;13965:2;13950:18;;13792:182::o;13979:402::-;14181:2;14163:21;;;14220:2;14200:18;;;14193:30;14259:34;14254:2;14239:18;;14232:62;-1:-1:-1;;;14325:2:1;14310:18;;14303:36;14371:3;14356:19;;14153:228::o;14386:398::-;14588:2;14570:21;;;14627:2;14607:18;;;14600:30;14666:34;14661:2;14646:18;;14639:62;-1:-1:-1;;;14732:2:1;14717:18;;14710:32;14774:3;14759:19;;14560:224::o;14789:424::-;14991:2;14973:21;;;15030:2;15010:18;;;15003:30;15069:34;15064:2;15049:18;;15042:62;15140:30;15135:2;15120:18;;15113:58;15203:3;15188:19;;14963:250::o;15218:351::-;15420:2;15402:21;;;15459:2;15439:18;;;15432:30;15498:29;15493:2;15478:18;;15471:57;15560:2;15545:18;;15392:177::o;15574:401::-;15776:2;15758:21;;;15815:2;15795:18;;;15788:30;15854:34;15849:2;15834:18;;15827:62;-1:-1:-1;;;15920:2:1;15905:18;;15898:35;15965:3;15950:19;;15748:227::o;15980:425::-;16182:2;16164:21;;;16221:2;16201:18;;;16194:30;16260:34;16255:2;16240:18;;16233:62;16331:31;16326:2;16311:18;;16304:59;16395:3;16380:19;;16154:251::o;16410:344::-;16612:2;16594:21;;;16651:2;16631:18;;;16624:30;16690:22;16685:2;16670:18;;16663:50;16745:2;16730:18;;16584:170::o;16759:402::-;16961:2;16943:21;;;17000:2;16980:18;;;16973:30;17039:34;17034:2;17019:18;;17012:62;-1:-1:-1;;;17105:2:1;17090:18;;17083:36;17151:3;17136:19;;16933:228::o;17166:422::-;17368:2;17350:21;;;17407:2;17387:18;;;17380:30;17446:34;17441:2;17426:18;;17419:62;17517:28;17512:2;17497:18;;17490:56;17578:3;17563:19;;17340:248::o;17593:410::-;17795:2;17777:21;;;17834:2;17814:18;;;17807:30;17873:34;17868:2;17853:18;;17846:62;17944:16;17939:2;17924:18;;17917:44;17993:3;17978:19;;17767:236::o;18008:353::-;18210:2;18192:21;;;18249:2;18229:18;;;18222:30;18288:31;18283:2;18268:18;;18261:59;18352:2;18337:18;;18182:179::o;18773:407::-;18975:2;18957:21;;;19014:2;18994:18;;;18987:30;19053:34;19048:2;19033:18;;19026:62;-1:-1:-1;;;19119:2:1;19104:18;;19097:41;19170:3;19155:19;;18947:233::o;19185:355::-;19387:2;19369:21;;;19426:2;19406:18;;;19399:30;19465:33;19460:2;19445:18;;19438:61;19531:2;19516:18;;19359:181::o;19545:404::-;19747:2;19729:21;;;19786:2;19766:18;;;19759:30;19825:34;19820:2;19805:18;;19798:62;-1:-1:-1;;;19891:2:1;19876:18;;19869:38;19939:3;19924:19;;19719:230::o;19954:412::-;20156:2;20138:21;;;20195:2;20175:18;;;20168:30;20234:34;20229:2;20214:18;;20207:62;20305:18;20300:2;20285:18;;20278:46;20356:3;20341:19;;20128:238::o;20371:425::-;20573:2;20555:21;;;20612:2;20592:18;;;20585:30;20651:34;20646:2;20631:18;;20624:62;20722:31;20717:2;20702:18;;20695:59;20786:3;20771:19;;20545:251::o;20801:343::-;21003:2;20985:21;;;21042:2;21022:18;;;21015:30;21081:21;21076:2;21061:18;;21054:49;21135:2;21120:18;;20975:169::o;21149:478::-;21351:2;21333:21;;;21390:2;21370:18;;;21363:30;21429:34;21424:2;21409:18;;21402:62;21500:34;21495:2;21480:18;;21473:62;-1:-1:-1;;;21566:3:1;21551:19;;21544:41;21617:3;21602:19;;21323:304::o;21632:398::-;21834:2;21816:21;;;21873:2;21853:18;;;21846:30;21912:34;21907:2;21892:18;;21885:62;-1:-1:-1;;;21978:2:1;21963:18;;21956:32;22020:3;22005:19;;21806:224::o;22035:416::-;22237:2;22219:21;;;22276:2;22256:18;;;22249:30;22315:34;22310:2;22295:18;;22288:62;22386:22;22381:2;22366:18;;22359:50;22441:3;22426:19;;22209:242::o;22456:420::-;22658:2;22640:21;;;22697:2;22677:18;;;22670:30;22736:34;22731:2;22716:18;;22709:62;22807:26;22802:2;22787:18;;22780:54;22866:3;22851:19;;22630:246::o;22881:410::-;23083:2;23065:21;;;23122:2;23102:18;;;23095:30;23161:34;23156:2;23141:18;;23134:62;23232:16;23227:2;23212:18;;23205:44;23281:3;23266:19;;23055:236::o;23296:397::-;23498:2;23480:21;;;23537:2;23517:18;;;23510:30;23576:34;23571:2;23556:18;;23549:62;-1:-1:-1;;;23642:2:1;23627:18;;23620:31;23683:3;23668:19;;23470:223::o;23698:420::-;23900:2;23882:21;;;23939:2;23919:18;;;23912:30;23978:34;23973:2;23958:18;;23951:62;24049:26;24044:2;24029:18;;24022:54;24108:3;24093:19;;23872:246::o;24123:356::-;24325:2;24307:21;;;24344:18;;;24337:30;24403:34;24398:2;24383:18;;24376:62;24470:2;24455:18;;24297:182::o;24484:356::-;24686:2;24668:21;;;24705:18;;;24698:30;24764:34;24759:2;24744:18;;24737:62;24831:2;24816:18;;24658:182::o;24845:418::-;25047:2;25029:21;;;25086:2;25066:18;;;25059:30;25125:34;25120:2;25105:18;;25098:62;25196:24;25191:2;25176:18;;25169:52;25253:3;25238:19;;25019:244::o;25268:401::-;25470:2;25452:21;;;25509:2;25489:18;;;25482:30;25548:34;25543:2;25528:18;;25521:62;-1:-1:-1;;;25614:2:1;25599:18;;25592:35;25659:3;25644:19;;25442:227::o;25674:415::-;25876:2;25858:21;;;25915:2;25895:18;;;25888:30;25954:34;25949:2;25934:18;;25927:62;26025:21;26020:2;26005:18;;25998:49;26079:3;26064:19;;25848:241::o;26094:400::-;26296:2;26278:21;;;26335:2;26315:18;;;26308:30;26374:34;26369:2;26354:18;;26347:62;-1:-1:-1;;;26440:2:1;26425:18;;26418:34;26484:3;26469:19;;26268:226::o;26499:353::-;26701:2;26683:21;;;26740:2;26720:18;;;26713:30;26779:31;26774:2;26759:18;;26752:59;26843:2;26828:18;;26673:179::o;26857:347::-;27059:2;27041:21;;;27098:2;27078:18;;;27071:30;27137:25;27132:2;27117:18;;27110:53;27195:2;27180:18;;27031:173::o;27209:428::-;27411:2;27393:21;;;27450:2;27430:18;;;27423:30;;;27489:34;27469:18;;;27462:62;27560:34;27555:2;27540:18;;27533:62;27627:3;27612:19;;27383:254::o;27642:406::-;27844:2;27826:21;;;27883:2;27863:18;;;27856:30;27922:34;27917:2;27902:18;;27895:62;-1:-1:-1;;;27988:2:1;27973:18;;27966:40;28038:3;28023:19;;27816:232::o;28053:407::-;28255:2;28237:21;;;28294:2;28274:18;;;28267:30;28333:34;28328:2;28313:18;;28306:62;-1:-1:-1;;;28399:2:1;28384:18;;28377:41;28450:3;28435:19;;28227:233::o;28465:348::-;28667:2;28649:21;;;28706:2;28686:18;;;28679:30;28745:26;28740:2;28725:18;;28718:54;28804:2;28789:18;;28639:174::o;28818:416::-;29020:2;29002:21;;;29059:2;29039:18;;;29032:30;29098:34;29093:2;29078:18;;29071:62;29169:22;29164:2;29149:18;;29142:50;29224:3;29209:19;;28992:242::o;29239:177::-;29385:25;;;29373:2;29358:18;;29340:76::o;29421:1029::-;;29731:3;29720:9;29716:19;29762:6;29751:9;29744:25;29788:2;29826:6;29821:2;29810:9;29806:18;29799:34;29869:3;29864:2;29853:9;29849:18;29842:31;29893:6;29928;29922:13;29959:6;29951;29944:22;29997:3;29986:9;29982:19;29975:26;;30036:2;30028:6;30024:15;30010:29;;30057:4;30070:218;30084:6;30081:1;30078:13;30070:218;;;30149:13;;-1:-1:-1;;;;;30145:62:1;30133:75;;30263:15;;;;30228:12;;;;30106:1;30099:9;30070:218;;;-1:-1:-1;;;;;;;30344:55:1;;;;30339:2;30324:18;;30317:83;-1:-1:-1;;;30431:3:1;30416:19;30409:35;30305:3;29692:758;-1:-1:-1;;;29692:758:1:o;30455:319::-;30657:25;;;30713:2;30698:18;;30691:34;;;;30756:2;30741:18;;30734:34;30645:2;30630:18;;30612:162::o;30779:184::-;30951:4;30939:17;;;;30921:36;;30909:2;30894:18;;30876:87::o;30968:251::-;31038:2;31032:9;31068:17;;;31115:18;31100:34;;31136:22;;;31097:62;31094:2;;;31162:18;;:::i;:::-;31198:2;31191:22;31012:207;;-1:-1:-1;31012:207:1:o;31224:191::-;;31308:18;31300:6;31297:30;31294:2;;;31330:18;;:::i;:::-;-1:-1:-1;31398:2:1;31375:17;-1:-1:-1;;31371:31:1;31404:4;31367:42;;31284:131::o;31420:128::-;;31491:1;31487:6;31484:1;31481:13;31478:2;;;31497:18;;:::i;:::-;-1:-1:-1;31533:9:1;;31468:80::o;31553:217::-;;31619:1;31609:2;;-1:-1:-1;;;31644:31:1;;31698:4;31695:1;31688:15;31726:4;31651:1;31716:15;31609:2;-1:-1:-1;31755:9:1;;31599:171::o;31775:168::-;;31881:1;31877;31873:6;31869:14;31866:1;31863:21;31858:1;31851:9;31844:17;31840:45;31837:2;;;31888:18;;:::i;:::-;-1:-1:-1;31928:9:1;;31827:116::o;31948:125::-;;32016:1;32013;32010:8;32007:2;;;32021:18;;:::i;:::-;-1:-1:-1;32058:9:1;;31997:76::o;32078:258::-;32150:1;32160:113;32174:6;32171:1;32168:13;32160:113;;;32250:11;;;32244:18;32231:11;;;32224:39;32196:2;32189:10;32160:113;;;32291:6;32288:1;32285:13;32282:2;;;-1:-1:-1;;32326:1:1;32308:16;;32301:27;32131:205::o;32341:380::-;32426:1;32416:12;;32473:1;32463:12;;;32484:2;;32538:4;32530:6;32526:17;32516:27;;32484:2;32591;32583:6;32580:14;32560:18;32557:38;32554:2;;;32637:10;32632:3;32628:20;32625:1;32618:31;32672:4;32669:1;32662:15;32700:4;32697:1;32690:15;32554:2;;32396:325;;;:::o;32726:127::-;32787:10;32782:3;32778:20;32775:1;32768:31;32818:4;32815:1;32808:15;32842:4;32839:1;32832:15;32858:127;32919:10;32914:3;32910:20;32907:1;32900:31;32950:4;32947:1;32940:15;32974:4;32971:1;32964:15;32990:156;-1:-1:-1;;;;;33071:5:1;33067:54;33060:5;33057:65;33047:2;;33136:1;33133;33126:12;33047:2;33037:109;:::o;33151:120::-;33239:5;33232:13;33225:21;33218:5;33215:32;33205:2;;33261:1;33258;33251:12

Swarm Source

ipfs://2b82c9fe6a83988a5de3a1d8ea661d6db1b7f67acafce5af99d08d4f6bdada66
Loading