AVAX Price: $22.67 (+11.77%)
Gas: 1 nAVAX
 

More Info

Private Name Tags

TokenTracker

THOR v2 (THOR) (@$0.0219)

Multichain Info

Transaction Hash
Method
Block
From
To
Approve607544852025-04-22 20:50:1110 hrs ago1745355011IN
Thor Financial: THOR Token
0 AVAX0.0000080.17253208
Transfer607265082025-04-22 10:05:4220 hrs ago1745316342IN
Thor Financial: THOR Token
0 AVAX0.00000430.10927067
Approve607183142025-04-22 6:54:5424 hrs ago1745304894IN
Thor Financial: THOR Token
0 AVAX0.000075661.63159179
Transfer606821462025-04-21 16:04:1138 hrs ago1745251451IN
Thor Financial: THOR Token
0 AVAX0.000063071.60035569
Approve606528002025-04-21 4:39:422 days ago1745210382IN
Thor Financial: THOR Token
0 AVAX0.000029421.1
Approve606527432025-04-21 4:38:152 days ago1745210295IN
Thor Financial: THOR Token
0 AVAX0.000051311.1
Approve606375582025-04-20 22:09:022 days ago1745186942IN
Thor Financial: THOR Token
0 AVAX0.000074621.60918272
Transfer606374392025-04-20 22:05:522 days ago1745186752IN
Thor Financial: THOR Token
0 AVAX0.000063211.60488671
Approve606300412025-04-20 18:52:232 days ago1745175143IN
Thor Financial: THOR Token
0 AVAX0.000074551.60764677
Approve606163042025-04-20 13:09:252 days ago1745154565IN
Thor Financial: THOR Token
0 AVAX0.000074261.60140847
Approve605569322025-04-19 12:04:333 days ago1745064273IN
Thor Financial: THOR Token
0 AVAX0.000046831.01
Approve605547342025-04-19 11:09:103 days ago1745060950IN
Thor Financial: THOR Token
0 AVAX0.00007411.59792838
Approve605108432025-04-18 16:25:134 days ago1744993513IN
Thor Financial: THOR Token
0 AVAX0.000046831.01
Approve605102992025-04-18 16:13:224 days ago1744992802IN
Thor Financial: THOR Token
0 AVAX0.000046831.01
Approve605101152025-04-18 16:09:064 days ago1744992546IN
Thor Financial: THOR Token
0 AVAX0.000046831.01
Approve605100102025-04-18 16:06:364 days ago1744992396IN
Thor Financial: THOR Token
0 AVAX0.000046831.01
Approve605098772025-04-18 16:03:454 days ago1744992225IN
Thor Financial: THOR Token
0 AVAX0.000051931.12
Approve605028002025-04-18 13:17:564 days ago1744982276IN
Thor Financial: THOR Token
0 AVAX0.000009030.19492136
Approve605027412025-04-18 13:16:204 days ago1744982180IN
Thor Financial: THOR Token
0 AVAX0.000074331.59338223
Approve604955772025-04-18 10:15:234 days ago1744971323IN
Thor Financial: THOR Token
0 AVAX0.000029451.01
Approve604955722025-04-18 10:15:134 days ago1744971313IN
Thor Financial: THOR Token
0 AVAX0.000029451.01
Approve604955352025-04-18 10:14:164 days ago1744971256IN
Thor Financial: THOR Token
0 AVAX0.000029451.01
Approve604954982025-04-18 10:13:214 days ago1744971201IN
Thor Financial: THOR Token
0 AVAX0.000029451.01
Approve604951772025-04-18 10:04:444 days ago1744970684IN
Thor Financial: THOR Token
0 AVAX0.000029451.01
Approve604759962025-04-18 1:59:365 days ago1744941576IN
Thor Financial: THOR Token
0 AVAX0.000097952.09976624
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
182091192022-08-04 15:23:05992 days ago1659626585
Thor Financial: THOR Token
3,585.2595094 AVAX
177674882022-07-25 2:11:291003 days ago1658715089
Thor Financial: THOR Token
3.15 AVAX
177672692022-07-25 2:04:041003 days ago1658714644
Thor Financial: THOR Token
0.03 AVAX
177656942022-07-25 1:09:441003 days ago1658711384
Thor Financial: THOR Token
12.6 AVAX
169820162022-07-06 17:53:091021 days ago1657129989
Thor Financial: THOR Token
0.04762562 AVAX
169820162022-07-06 17:53:091021 days ago1657129989
Thor Financial: THOR Token
0.04762562 AVAX
168642782022-07-04 0:04:471024 days ago1656893087
Thor Financial: THOR Token
236.25 AVAX
163021762022-06-20 23:27:461037 days ago1655767666
Thor Financial: THOR Token
633.15 AVAX
160549332022-06-15 7:11:481042 days ago1655277108
Thor Financial: THOR Token
20,000 AVAX
160413422022-06-14 23:38:141043 days ago1655249894
Thor Financial: THOR Token
3.15 AVAX
160408312022-06-14 23:21:551043 days ago1655248915
Thor Financial: THOR Token
0.003 AVAX
160406322022-06-14 23:15:131043 days ago1655248513
Thor Financial: THOR Token
0.003 AVAX
160402042022-06-14 23:01:011043 days ago1655247661
Thor Financial: THOR Token
0.03 AVAX
160396152022-06-14 22:41:231043 days ago1655246483
Thor Financial: THOR Token
0.03 AVAX
160392912022-06-14 22:30:381043 days ago1655245838
Thor Financial: THOR Token
0.73105462 AVAX
160392802022-06-14 22:30:161043 days ago1655245816
Thor Financial: THOR Token
3.48121249 AVAX
160392752022-06-14 22:30:061043 days ago1655245806
Thor Financial: THOR Token
16.57720234 AVAX
160392692022-06-14 22:29:541043 days ago1655245794
Thor Financial: THOR Token
78.93905879 AVAX
159939342022-06-13 21:45:081044 days ago1655156708
Thor Financial: THOR Token
15.90027995 AVAX
159939272022-06-13 21:44:581044 days ago1655156698
Thor Financial: THOR Token
75.71561882 AVAX
159939232022-06-13 21:44:461044 days ago1655156686
Thor Financial: THOR Token
360.55056583 AVAX
159939112022-06-13 21:44:301044 days ago1655156670
Thor Financial: THOR Token
1,716.90745637 AVAX
156239452022-06-05 8:11:541052 days ago1654416714
Thor Financial: THOR Token
20,833 AVAX
154710812022-06-01 18:53:351056 days ago1654109615
Thor Financial: THOR Token
20,833 AVAX
153024082022-05-28 20:52:451060 days ago1653771165
Thor Financial: THOR Token
3.60693511 AVAX
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ThorV2

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowscan.xyz on 2021-12-06
*/

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 rewardAvailable;
    }

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

    uint256 public nodePrice;
    uint256 public rewardPerNode;
    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 totalNodesCreated = 0;
    uint256 public totalRewardStaked = 0;

    constructor(
        uint256 _nodePrice,
        uint256 _rewardPerNode,
        uint256 _claimTime
    ) {
        nodePrice = _nodePrice;
        rewardPerNode = _rewardPerNode;
        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 rewardNode)
    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 += rewardNode;
                    _node.lastClaimTime = newClaimTime;
                    totalRewardStaked += rewardNode;
                    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) external onlySentry {
        require(
            isNameAvailable(account, nodeName),
            "CREATE NODE: Name not available"
        );
        _nodesOfUser[account].push(
            NodeEntity({
        name: nodeName,
        creationTime: block.timestamp,
        lastClaimTime: block.timestamp,
        rewardAvailable: rewardPerNode
        })
        );
        nodeOwners.set(account, _nodesOfUser[account].length);
        totalNodesCreated++;
        if (autoDistri && !distribution) {
            distributeRewards(gasForDistribution, rewardPerNode);
        }
    }

    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;
        node.rewardAvailable = 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;
            _node.rewardAvailable = 0;
        }
        return rewardsTotal;
    }

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

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

        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;
        return rewardNode;
    }

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

    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);
        string memory separator = "#";

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

            _rewardsAvailable = string(
                abi.encodePacked(
                    _rewardsAvailable,
                    separator,
                    uint2str(_node.rewardAvailable)
                )
            );
        }
        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 _changeNodePrice(uint256 newNodePrice) external onlySentry {
        nodePrice = newNodePrice;
    }

    function _changeRewardPerNode(uint256 newPrice) external onlySentry {
        rewardPerNode = newPrice;
    }

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

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

    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, rewardPerNode);
    }
}

pragma solidity ^0.8.0;

contract ThorV2 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 deadWallet = 0x000000000000000000000000000000000000dEaD;

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

    uint256 public cashoutFee;

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

    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,
        uint256[] memory fees,
        uint256 swapAmount,
        address uniV2Router
    ) ERC20("THOR v2", "THOR") PaymentSplitter(payees, shares) {

        futurUsePool = addresses[4];
        distributionPool = addresses[5];

        require(futurUsePool != address(0) && distributionPool != address(0), "FUTUR & 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);

        require(
            fees[0] != 0 && fees[1] != 0 && fees[2] != 0 && fees[3] != 0,
            "CONSTR: Fees equal 0"
        );
        futurFee = fees[0];
        rewardsFee = fees[1];
        liquidityPoolFee = fees[2];
        cashoutFee = fees[3];
        rwSwap = fees[4];

        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() == 20456743e18, "CONSTR: totalSupply must equal 20 million");
        require(swapAmount > 0, "CONSTR: Swap amount incorrect");
        swapTokensAmount = swapAmount * (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 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 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(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(
            !_isBlacklisted[from] && !_isBlacklisted[to],
            "Blacklisted address"
        );

        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) 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,
            "NODE CREATION: futur and rewardsPool cannot create node"
        );
        uint256 nodePrice = nodeRewardManager.nodePrice();
        require(
            balanceOf(sender) >= nodePrice,
            "NODE CREATION: Balance too low for creation."
        );
        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapAmountOk = contractTokenBalance >= swapTokensAmount;
        if (
            swapAmountOk &&
            swapLiquify &&
            !swapping &&
            sender != owner() &&
            !automatedMarketMakerPairs[sender]
        ) {
            swapping = true;

            uint256 futurTokens = contractTokenBalance.mul(futurFee).div(100);

            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);
        nodeRewardManager.createNode(sender, name);
    }

    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 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 changeNodePrice(uint256 newNodePrice) public onlyOwner {
        nodeRewardManager._changeNodePrice(newNodePrice);
    }

    function getNodePrice() public view returns (uint256) {
        return nodeRewardManager.nodePrice();
    }

    function changeRewardPerNode(uint256 newPrice) public onlyOwner {
        nodeRewardManager._changeRewardPerNode(newPrice);
    }

    function getRewardPerNode() public view returns (uint256) {
        return nodeRewardManager.rewardPerNode();
    }

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

Contract Security Audit

Contract ABI

API
[{"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":"uint256[]","name":"fees","type":"uint256[]"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"address","name":"uniV2Router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"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":"newNodePrice","type":"uint256"}],"name":"changeNodePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changeRewardPerNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newVal","type":"bool"}],"name":"changeSwapLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"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":"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":"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":[{"internalType":"address","name":"account","type":"address"}],"name":"getNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodePrice","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":"getRewardPerNode","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":"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":"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":"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"}]

6080604052601280546001600160a01b03191661dead1790556019805461ffff19166101001790553480156200003457600080fd5b50604051620057df380380620057df833981016040819052620000579162000fa6565b60408051808201825260078152662a2427a9103b1960c91b6020808301918252835180850190945260048452632a2427a960e11b9084015281518a938a93929091620000a69160039162000ddb565b508051620000bc90600490602084019062000ddb565b5050506000620000d16200099860201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508051825114620001915760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001e45760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000188565b60005b825181101562000250576200023b8382815181106200020a576200020a620011aa565b6020026020010151838381518110620002275762000227620011aa565b60200260200101516200099c60201b60201c565b80620002478162001176565b915050620001e7565b50505084600481518110620002695762000269620011aa565b6020026020010151601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084600581518110620002ad57620002ad620011aa565b6020908102919091010151601180546001600160a01b0319166001600160a01b039283161790556010541615801590620002f157506011546001600160a01b031615155b6200034d5760405162461bcd60e51b815260206004820152602560248201527f465554555220262052455741524420414444524553532043414e4e4f54204245604482015264205a45524f60d81b606482015260840162000188565b6001600160a01b038116620003a55760405162461bcd60e51b815260206004820152601560248201527f524f555445522043414e4e4f54204245205a45524f0000000000000000000000604482015260640162000188565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620003e657600080fd5b505afa158015620003fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000421919062000f88565b6001600160a01b031663c9c6539630846001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b1580156200046a57600080fd5b505afa1580156200047f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a5919062000f88565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620004ee57600080fd5b505af115801562000503573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000529919062000f88565b600e80546001600160a01b038086166001600160a01b031992831617909255600f80549284169290911691909117905590506200056881600162000b8a565b846000815181106200057e576200057e620011aa565b6020026020010151600014158015620005b5575084600181518110620005a857620005a8620011aa565b6020026020010151600014155b8015620005e0575084600281518110620005d357620005d3620011aa565b6020026020010151600014155b80156200060b575084600381518110620005fe57620005fe620011aa565b6020026020010151600014155b620006595760405162461bcd60e51b815260206004820152601460248201527f434f4e5354523a204665657320657175616c2030000000000000000000000000604482015260640162000188565b846000815181106200066f576200066f620011aa565b602002602001015160158190555084600181518110620006935762000693620011aa565b602002602001015160138190555084600281518110620006b757620006b7620011aa565b602002602001015160148190555084600381518110620006db57620006db620011aa565b602002602001015160178190555084600481518110620006ff57620006ff620011aa565b6020026020010151601881905550620007466015546200073260145460135462000c7560201b6200324d1790919060201c565b62000c7560201b6200324d1790919060201c565b6016558651158015906200075b575060008651115b620007cf5760405162461bcd60e51b815260206004820152603860248201527f434f4e5354523a20616464726573736573206172726179206c656e677468206d60448201527f7573742062652067726561746572207468616e207a65726f0000000000000000606482015260840162000188565b8551875114620008335760405162461bcd60e51b815260206004820152602860248201527f434f4e5354523a2061646472657373657320617272617973206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840162000188565b60005b8751811015620008ae5762000899888281518110620008595762000859620011aa565b6020026020010151888381518110620008765762000876620011aa565b6020026020010151670de0b6b3a764000062000893919062001117565b62000cdf565b80620008a58162001176565b91505062000836565b506002546a10ebe24297ce6ff43c0000146200091f5760405162461bcd60e51b815260206004820152602960248201527f434f4e5354523a20746f74616c537570706c79206d75737420657175616c2032604482015268181036b4b63634b7b760b91b606482015260840162000188565b60008411620009715760405162461bcd60e51b815260206004820152601d60248201527f434f4e5354523a205377617020616d6f756e7420696e636f7272656374000000604482015260640162000188565b6200098584670de0b6b3a764000062001117565b601a5550620011d6975050505050505050565b3390565b6001600160a01b03821662000a095760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000188565b6000811162000a5b5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000188565b6001600160a01b0382166000908152600860205260409020541562000ad75760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000188565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038416908117909155600090815260086020526040902081905560065462000b41908290620010fc565b600655604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6001600160a01b0382166000908152601c602052604090205460ff161515811515141562000c215760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c7565000000606482015260840162000188565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60008062000c848385620010fc565b90508381101562000cd85760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000188565b9392505050565b6001600160a01b03821662000d375760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000188565b62000d538160025462000c7560201b6200324d1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000d869183906200324d62000c75821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000de99062001139565b90600052602060002090601f01602090048101928262000e0d576000855562000e58565b82601f1062000e2857805160ff191683800117855562000e58565b8280016001018555821562000e58579182015b8281111562000e5857825182559160200191906001019062000e3b565b5062000e6692915062000e6a565b5090565b5b8082111562000e66576000815560010162000e6b565b80516001600160a01b038116811462000e9957600080fd5b919050565b600082601f83011262000eb057600080fd5b8151602062000ec962000ec383620010d6565b620010a3565b80838252828201915082860187848660051b890101111562000eea57600080fd5b60005b8581101562000f145762000f018262000e81565b8452928401929084019060010162000eed565b5090979650505050505050565b600082601f83011262000f3357600080fd5b8151602062000f4662000ec383620010d6565b80838252828201915082860187848660051b890101111562000f6757600080fd5b60005b8581101562000f145781518452928401929084019060010162000f6a565b60006020828403121562000f9b57600080fd5b62000cd88262000e81565b600080600080600080600060e0888a03121562000fc257600080fd5b87516001600160401b038082111562000fda57600080fd5b62000fe88b838c0162000e9e565b985060208a015191508082111562000fff57600080fd5b6200100d8b838c0162000f21565b975060408a01519150808211156200102457600080fd5b620010328b838c0162000e9e565b965060608a01519150808211156200104957600080fd5b620010578b838c0162000f21565b955060808a01519150808211156200106e57600080fd5b506200107d8a828b0162000f21565b93505060a088015191506200109560c0890162000e81565b905092959891949750929550565b604051601f8201601f191681016001600160401b0381118282101715620010ce57620010ce620011c0565b604052919050565b60006001600160401b03821115620010f257620010f2620011c0565b5060051b60200190565b6000821982111562001112576200111262001194565b500190565b600081600019048311821515161562001134576200113462001194565b500290565b600181811c908216806200114e57607f821691505b602082108114156200117057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200118d576200118d62001194565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6145f980620011e66000396000f3fe60806040526004361061044b5760003560e01c80638013858b11610234578063b62496f51161012e578063db3ad6b5116100b6578063f5a072561161007a578063f5a0725614610d93578063f74c993414610da8578063f7b9f94314610dc8578063f9afc76314610ddd578063fb0a749414610df257600080fd5b8063db3ad6b514610cee578063dd62ed3e14610d03578063e33b7de314610d49578063ee1afdbf14610d5e578063f2fde38b14610d7357600080fd5b8063ce7c2ac2116100fd578063ce7c2ac214610c2d578063d0f7747414610c63578063d79779b214610c83578063d892934214610cb9578063da41b33314610cd957600080fd5b8063b62496f514610ba8578063b96392c114610bd8578063bdf24a5314610bf8578063c5ca7d6d14610c0d57600080fd5b806395d89b41116101bc578063a457c2d711610180578063a457c2d714610b1d578063a5021a1714610b3d578063a538ddf214610b52578063a9059cbb14610b72578063ab57476114610b9257600080fd5b806395d89b4114610a7d5780639852595c14610a925780639a7a23d614610ac85780639c82751c14610ae8578063a0a8fe6514610b0857600080fd5b80638b83209b116102035780638b83209b146109df5780638bc9c7b0146109ff5780638da5cb5b14610a1f5780638f0ba4ca14610a3d5780639349c47d14610a5d57600080fd5b80638013858b1461096a57806385141a771461098a5780638743ef6d146109aa57806388c41d7c146109bf57600080fd5b806348b750441161034557806365b8dbc0116102cd5780636f4a2cd0116102915780636f4a2cd0146108af57806370a08231146108df578063715018a6146109155780637628b3d71461092a5780637b7703921461094a57600080fd5b806365b8dbc01461081957806365bfe430146108395780636770474b146108595780636815a91c146108795780636d9ae0be1461089957600080fd5b806354f12f1f1161031457806354f12f1f14610798578063583bd7a6146107ae57806359640ed9146107ce5780635b0d4674146107ee5780635f1c31821461080357600080fd5b806348b750441461072e57806348e5642b1461074e57806349bd5a5e14610763578063545579731461078357600080fd5b806319165587116103d3578063395093511161039757806339509351146106735780633a98ef3914610693578063406072a9146106a85780634195fbf3146106ee57806342bc9fca1461070e57600080fd5b806319165587146105d15780631cdd3be3146105f157806323b872dd146106215780632bb14e1d14610641578063313ce5671461065757600080fd5b80630c08f3001161041a5780630c08f3001461053957806313114a9d14610559578063138a634a1461056f5780631694505e1461058457806318160ddd146105bc57600080fd5b806306fdde0314610499578063084a6bff146104c4578063095ea7b3146104e657806309a69f571461051657600080fd5b36610494577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156104a557600080fd5b506104ae610e12565b6040516104bb9190614191565b60405180910390f35b3480156104d057600080fd5b506104e46104df3660046140c5565b610ea4565b005b3480156104f257600080fd5b50610506610501366004613f71565b610efe565b60405190151581526020016104bb565b34801561052257600080fd5b5061052b610f15565b6040519081526020016104bb565b34801561054557600080fd5b506104e4610554366004613e8f565b611067565b34801561056557600080fd5b5061052b60165481565b34801561057b57600080fd5b506104ae6110b3565b34801561059057600080fd5b50600e546105a4906001600160a01b031681565b6040516001600160a01b0390911681526020016104bb565b3480156105c857600080fd5b5060025461052b565b3480156105dd57600080fd5b506104e46105ec366004613e8f565b611205565b3480156105fd57600080fd5b5061050661060c366004613e8f565b601b6020526000908152604090205460ff1681565b34801561062d57600080fd5b5061050661063c366004613f02565b611333565b34801561064d57600080fd5b5061052b60135481565b34801561066357600080fd5b50604051601281526020016104bb565b34801561067f57600080fd5b5061050661068e366004613f71565b61139d565b34801561069f57600080fd5b5060065461052b565b3480156106b457600080fd5b5061052b6106c3366004613ec9565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156106fa57600080fd5b506104e46107093660046140c5565b6113d3565b34801561071a57600080fd5b506104e46107293660046140c5565b611446565b34801561073a57600080fd5b506104e4610749366004613ec9565b61148a565b34801561075a57600080fd5b5061052b611672565b34801561076f57600080fd5b50600f546105a4906001600160a01b031681565b34801561078f57600080fd5b506104e46116b7565b3480156107a457600080fd5b5061052b60145481565b3480156107ba57600080fd5b506104e46107c9366004613f9d565b611a0a565b3480156107da57600080fd5b506104e46107e93660046140c5565b611a4e565b3480156107fa57600080fd5b506104ae611ada565b34801561080f57600080fd5b5061052b601a5481565b34801561082557600080fd5b506104e4610834366004613e8f565b611bb5565b34801561084557600080fd5b506104e46108543660046140c5565b611e51565b34801561086557600080fd5b506104e46108743660046140c5565b612196565b34801561088557600080fd5b506104e46108943660046140c5565b6121c5565b3480156108a557600080fd5b5061052b60175481565b3480156108bb57600080fd5b506108c46121f4565b604080519384526020840192909252908201526060016104bb565b3480156108eb57600080fd5b5061052b6108fa366004613e8f565b6001600160a01b031660009081526020819052604090205490565b34801561092157600080fd5b506104e46122b8565b34801561093657600080fd5b50600d546105a4906001600160a01b031681565b34801561095657600080fd5b506104e46109653660046140c5565b61232c565b34801561097657600080fd5b506104e46109853660046140c5565b612387565b34801561099657600080fd5b506012546105a4906001600160a01b031681565b3480156109b657600080fd5b506104e46123e2565b3480156109cb57600080fd5b506104e46109da3660046140c5565b61246a565b3480156109eb57600080fd5b506105a46109fa3660046140c5565b6124ae565b348015610a0b57600080fd5b506104e4610a1a3660046140c5565b6124de565b348015610a2b57600080fd5b506005546001600160a01b03166105a4565b348015610a4957600080fd5b506104e4610a58366004613fd7565b61250d565b348015610a6957600080fd5b506104e4610a78366004613e8f565b6129d9565b348015610a8957600080fd5b506104ae612a25565b348015610a9e57600080fd5b5061052b610aad366004613e8f565b6001600160a01b031660009081526009602052604090205490565b348015610ad457600080fd5b506104e4610ae3366004613f43565b612a34565b348015610af457600080fd5b506104e4610b033660046140c5565b612aff565b348015610b1457600080fd5b5061052b612b5a565b348015610b2957600080fd5b50610506610b38366004613f71565b612b9f565b348015610b4957600080fd5b5061052b612bee565b348015610b5e57600080fd5b506010546105a4906001600160a01b031681565b348015610b7e57600080fd5b50610506610b8d366004613f71565b612c33565b348015610b9e57600080fd5b5061052b60155481565b348015610bb457600080fd5b50610506610bc3366004613e8f565b601c6020526000908152604090205460ff1681565b348015610be457600080fd5b5061052b610bf3366004613e8f565b612c40565b348015610c0457600080fd5b506104ae612ceb565b348015610c1957600080fd5b506011546105a4906001600160a01b031681565b348015610c3957600080fd5b5061052b610c48366004613e8f565b6001600160a01b031660009081526008602052604090205490565b348015610c6f57600080fd5b506104e4610c7e366004613f9d565b612dc6565b348015610c8f57600080fd5b5061052b610c9e366004613e8f565b6001600160a01b03166000908152600b602052604090205490565b348015610cc557600080fd5b506104e4610cd4366004613f43565b612e22565b348015610ce557600080fd5b5061052b612e77565b348015610cfa57600080fd5b5061052b612ebc565b348015610d0f57600080fd5b5061052b610d1e366004613ec9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610d5557600080fd5b5060075461052b565b348015610d6a57600080fd5b506104ae612f01565b348015610d7f57600080fd5b506104e4610d8e366004613e8f565b612fdc565b348015610d9f57600080fd5b5061052b6130c7565b348015610db457600080fd5b5061052b610dc3366004613e8f565b61310c565b348015610dd457600080fd5b5061052b61313f565b348015610de957600080fd5b50610506613184565b348015610dfe57600080fd5b506104e4610e0d366004613e8f565b613201565b606060038054610e21906144ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4d906144ad565b8015610e9a5780601f10610e6f57610100808354040283529160200191610e9a565b820191906000526020600020905b815481529060010190602001808311610e7d57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610ed75760405162461bcd60e51b8152600401610ece906142cd565b60405180910390fd5b6013819055601554601454610ef89190610ef290849061324d565b9061324d565b60165550565b6000610f0b3384846132ac565b5060015b92915050565b600033610f345760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610f8557600080fd5b505afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190613fba565b610fd95760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b031663619a635e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106291906140de565b905090565b6005546001600160a01b031633146110915760405162461bcd60e51b8152600401610ece906142cd565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6060336110d25760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561112357600080fd5b505afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190613fba565b6111775760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b031663334de3a2335b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160006040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110629190810190614057565b6001600160a01b03811660009081526008602052604090205461123a5760405162461bcd60e51b8152600401610ece9061423c565b600061124560075490565b61124f9047614411565b9050600061127c8383611277866001600160a01b031660009081526009602052604090205490565b6133d1565b90508061129b5760405162461bcd60e51b8152600401610ece90614282565b6001600160a01b038316600090815260096020526040812080548392906112c3908490614411565b9250508190555080600760008282546112dc9190614411565b909155506112ec90508382613417565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6000611340848484613530565b611392843361138d85604051806060016040528060288152602001614577602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061360b565b6132ac565b5060015b9392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610f0b91859061138d908661324d565b6005546001600160a01b031633146113fd5760405162461bcd60e51b8152600401610ece906142cd565b478111156114085750475b6005546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611442573d6000803e3d6000fd5b5050565b6005546001600160a01b031633146114705760405162461bcd60e51b8152600401610ece906142cd565b6014819055601554601354610ef89190610ef2908461324d565b6001600160a01b0381166000908152600860205260409020546114bf5760405162461bcd60e51b8152600401610ece9061423c565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561151757600080fd5b505afa15801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f91906140de565b6115599190614411565b90506000611592838361127787876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b9050806115b15760405162461bcd60e51b8152600401610ece90614282565b6001600160a01b038085166000908152600c60209081526040808320938716835292905290812080548392906115e8908490614411565b90915550506001600160a01b0384166000908152600b602052604081208054839290611615908490614411565b909155506116269050848483613645565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600d54604080516345193f5560e11b815290516000926001600160a01b031691638a327eaa916004808301926020929190829003018186803b15801561102a57600080fd5b33806117195760405162461bcd60e51b815260206004820152602b60248201527f4d414e494120435348543a20206372656174696f6e2066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610ece565b6001600160a01b0381166000908152601b602052604090205460ff16156117825760405162461bcd60e51b815260206004820152601f60248201527f4d414e494120435348543a20426c61636b6c69737465642061646472657373006044820152606401610ece565b6010546001600160a01b038281169116148015906117ae57506011546001600160a01b03828116911614155b6118205760405162461bcd60e51b815260206004820152603860248201527f4d414e494120435348543a20667574757220616e642072657761726473506f6f60448201527f6c2063616e6e6f7420636173686f7574207265776172647300000000000000006064820152608401610ece565b600d546040516330cd31af60e11b81526001600160a01b038381166004830152600092169063619a635e9060240160206040518083038186803b15801561186657600080fd5b505afa15801561187a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189e91906140de565b90506000811161190d5760405162461bcd60e51b815260206004820152603460248201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f75676044820152731a081c995dd85c99081d1bc818d85cda081bdd5d60621b6064820152608401610ece565b601954610100900460ff161561196f57601754600090156119615761194860646119426017548561369790919063ffffffff16565b90613716565b601054909150611961906001600160a01b031682613758565b61196b818361446a565b9150505b601154611986906001600160a01b031683836137a7565b600d5460405163170a62c760e21b81526001600160a01b03848116600483015290911690635c298b1c90602401602060405180830381600087803b1580156119cd57600080fd5b505af11580156119e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0591906140de565b505050565b6005546001600160a01b03163314611a345760405162461bcd60e51b8152600401610ece906142cd565b601980549115156101000261ff0019909216919091179055565b6005546001600160a01b03163314611a785760405162461bcd60e51b8152600401610ece906142cd565b600d54604051631df3773160e31b8152600481018390526001600160a01b039091169063ef9bb988906024015b600060405180830381600087803b158015611abf57600080fd5b505af1158015611ad3573d6000803e3d6000fd5b5050505050565b606033611af95760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611b4a57600080fd5b505afa158015611b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b829190613fba565b611b9e5760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b0316634a389fae3361118a565b6005546001600160a01b03163314611bdf5760405162461bcd60e51b8152600401610ece906142cd565b600e546001600160a01b0382811691161415611c4e5760405162461bcd60e51b815260206004820152602860248201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604482015267206164647265737360c01b6064820152608401610ece565b600e546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600e80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b158015611ce057600080fd5b505afa158015611cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d189190613eac565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad9190613eac565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611df557600080fd5b505af1158015611e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2d9190613eac565b600f80546001600160a01b0319166001600160a01b03929092169190911790555050565b3380611ead5760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ece565b6001600160a01b0381166000908152601b602052604090205460ff1615611f165760405162461bcd60e51b815260206004820152601f60248201527f4d414e494120435348543a20426c61636b6c69737465642061646472657373006044820152606401610ece565b6010546001600160a01b03828116911614801590611f4257506011546001600160a01b03828116911614155b611fa95760405162461bcd60e51b815260206004820152603260248201527f435348543a20667574757220616e642072657761726473506f6f6c2063616e6e6044820152716f7420636173686f7574207265776172647360701b6064820152608401610ece565b600d546040516329b8573160e21b81526001600160a01b03838116600483015260248201859052600092169063a6e15cc49060440160206040518083038186803b158015611ff657600080fd5b505afa15801561200a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202e91906140de565b9050600081116120975760405162461bcd60e51b815260206004820152602e60248201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160448201526d1c99081d1bc818d85cda081bdd5d60921b6064820152608401610ece565b601954610100900460ff16156120f357601754600090156120e5576120cc60646119426017548561369790919063ffffffff16565b6010549091506120e5906001600160a01b031682613758565b6120ef818361446a565b9150505b60115461210a906001600160a01b031683836137a7565b600d5460405163376db80160e11b81526001600160a01b0384811660048301526024820186905290911690636edb700290604401602060405180830381600087803b15801561215857600080fd5b505af115801561216c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219091906140de565b50505050565b6005546001600160a01b031633146121c05760405162461bcd60e51b8152600401610ece906142cd565b601a55565b6005546001600160a01b031633146121ef5760405162461bcd60e51b8152600401610ece906142cd565b601755565b600554600090819081906001600160a01b031633146122255760405162461bcd60e51b8152600401610ece906142cd565b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b15801561227557600080fd5b505af1158015612289573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ad91906140f7565b925092509250909192565b6005546001600160a01b031633146122e25760405162461bcd60e51b8152600401610ece906142cd565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146123565760405162461bcd60e51b8152600401610ece906142cd565b600d546040516318df5db960e31b8152600481018390526001600160a01b039091169063c6faedc890602401611aa5565b6005546001600160a01b031633146123b15760405162461bcd60e51b8152600401610ece906142cd565b600d5460405163cece91eb60e01b8152600481018390526001600160a01b039091169063cece91eb90602401611aa5565b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b15801561243257600080fd5b505af1158015612446573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0591906140f7565b6005546001600160a01b031633146124945760405162461bcd60e51b8152600401610ece906142cd565b6015819055601454601354610ef8918391610ef29161324d565b6000600a82815481106124c3576124c36144fe565b6000918252602090912001546001600160a01b031692915050565b6005546001600160a01b031633146125085760405162461bcd60e51b8152600401610ece906142cd565b601855565b6003815111801561251f575060208151105b61256b5760405162461bcd60e51b815260206004820181905260248201527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c49446044820152606401610ece565b33806125d05760405162461bcd60e51b815260206004820152602e60248201527f4e4f4445204352454154494f4e3a20206372656174696f6e2066726f6d20746860448201526d65207a65726f206164647265737360901b6064820152608401610ece565b6001600160a01b0381166000908152601b602052604090205460ff16156126445760405162461bcd60e51b815260206004820152602260248201527f4e4f4445204352454154494f4e3a20426c61636b6c6973746564206164647265604482015261737360f01b6064820152608401610ece565b6010546001600160a01b0382811691161480159061267057506011546001600160a01b03828116911614155b6126e25760405162461bcd60e51b815260206004820152603760248201527f4e4f4445204352454154494f4e3a20667574757220616e64207265776172647360448201527f506f6f6c2063616e6e6f7420637265617465206e6f64650000000000000000006064820152608401610ece565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b15801561272757600080fd5b505afa15801561273b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275f91906140de565b905080612781836001600160a01b031660009081526020819052604090205490565b10156127e45760405162461bcd60e51b815260206004820152602c60248201527f4e4f4445204352454154494f4e3a2042616c616e636520746f6f206c6f77206660448201526b37b91031b932b0ba34b7b71760a11b6064820152608401610ece565b30600090815260208190526040902054601a548110801590819061280f5750601954610100900460ff165b801561281e575060195460ff16155b801561283857506005546001600160a01b03858116911614155b801561285d57506001600160a01b0384166000908152601c602052604090205460ff16155b15612963576019805460ff1916600117905560155460009061288790606490611942908690613697565b6010549091506128a0906001600160a01b031682613758565b60006128bc60646119426013548761369790919063ffffffff16565b905060006128da60646119426018548561369790919063ffffffff16565b6011549091506128f3906001600160a01b031682613758565b6011546129149030906001600160a01b031661290f85856138b0565b6137a7565b600061293060646119426014548961369790919063ffffffff16565b905061293b816138f2565b3060009081526020819052604090205461295490613979565b50506019805460ff1916905550505b61296e8430856137a7565b600d546040516312b8603f60e01b81526001600160a01b03909116906312b8603f906129a0908790899060040161416d565b600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b03163314612a035760405162461bcd60e51b8152600401610ece906142cd565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610e21906144ad565b6005546001600160a01b03163314612a5e5760405162461bcd60e51b8152600401610ece906142cd565b600f546001600160a01b0383811691161415612af55760405162461bcd60e51b815260206004820152604a60248201527f544b4e3a205468652050616e63616b655377617020706169722063616e6e6f7460448201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b65746064820152694d616b6572506169727360b01b608482015260a401610ece565b6114428282613ae2565b6005546001600160a01b03163314612b295760405162461bcd60e51b8152600401610ece906142cd565b600d5460405163d1871a8960e01b8152600481018390526001600160a01b039091169063d1871a8990602401611aa5565b600d546040805163b8527aef60e01b815290516000926001600160a01b03169163b8527aef916004808301926020929190829003018186803b15801561102a57600080fd5b6000610f0b338461138d8560405180606001604052806025815260200161459f602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061360b565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b15801561102a57600080fd5b6000610f0b338484613530565b6005546000906001600160a01b03163314612c6d5760405162461bcd60e51b8152600401610ece906142cd565b600d546040516330cd31af60e11b81526001600160a01b0384811660048301529091169063619a635e906024015b60206040518083038186803b158015612cb357600080fd5b505afa158015612cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0f91906140de565b606033612d0a5760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612d5b57600080fd5b505afa158015612d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d939190613fba565b612daf5760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b031663c92819ce3361118a565b6005546001600160a01b03163314612df05760405162461bcd60e51b8152600401610ece906142cd565b600d54604051636d58441560e11b815282151560048201526001600160a01b039091169063dab0882a90602401611aa5565b6005546001600160a01b03163314612e4c5760405162461bcd60e51b8152600401610ece906142cd565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d546040805163fb10d6fb60e01b815290516000926001600160a01b03169163fb10d6fb916004808301926020929190829003018186803b15801561102a57600080fd5b600d546040805163613ff46f60e01b815290516000926001600160a01b03169163613ff46f916004808301926020929190829003018186803b15801561102a57600080fd5b606033612f205760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612f7157600080fd5b505afa158015612f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa99190613fba565b612fc55760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b0316635759fb023361118a565b6005546001600160a01b031633146130065760405162461bcd60e51b8152600401610ece906142cd565b6001600160a01b03811661306b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ece565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604080516327b3bf1160e01b815290516000926001600160a01b0316916327b3bf11916004808301926020929190829003018186803b15801561102a57600080fd5b600d5460405163112469f960e21b81526001600160a01b0383811660048301526000921690634491a7e490602401612c9b565b600d5460408051636f60a39360e11b815290516000926001600160a01b03169163dec14726916004808301926020929190829003018186803b15801561102a57600080fd5b600d54604080516385c44d9d60e01b815290516000926001600160a01b0316916385c44d9d916004808301926020929190829003018186803b1580156131c957600080fd5b505afa1580156131dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110629190613fba565b6005546001600160a01b0316331461322b5760405162461bcd60e51b8152600401610ece906142cd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60008061325a8385614411565b9050838110156113965760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ece565b6001600160a01b03831661330e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ece565b6001600160a01b03821661336f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ece565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6006546001600160a01b038416600090815260086020526040812054909183916133fb908661444b565b6134059190614429565b61340f919061446a565b949350505050565b804710156134675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ece565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146134b4576040519150601f19603f3d011682016040523d82523d6000602084013e6134b9565b606091505b5050905080611a055760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ece565b6001600160a01b0383166135565760405162461bcd60e51b8152600401610ece90614302565b6001600160a01b03821661357c5760405162461bcd60e51b8152600401610ece906141a4565b6001600160a01b0383166000908152601b602052604090205460ff161580156135be57506001600160a01b0382166000908152601b602052604090205460ff16155b6136005760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b6044820152606401610ece565b611a058383836137a7565b6000818484111561362f5760405162461bcd60e51b8152600401610ece9190614191565b50600061363c848661446a565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a05908490613bcb565b6000826136a657506000610f0f565b60006136b2838561444b565b9050826136bf8583614429565b146113965760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ece565b600061139683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c9d565b4761376282613979565b600061376e47836138b0565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611ad3573d6000803e3d6000fd5b6001600160a01b0383166137cd5760405162461bcd60e51b8152600401610ece90614302565b6001600160a01b0382166137f35760405162461bcd60e51b8152600401610ece906141a4565b61383081604051806060016040528060268152602001614551602691396001600160a01b038616600090815260208190526040902054919061360b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461385f908261324d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016133c4565b600061139683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061360b565b60006138ff826002613716565b9050600061390d83836138b0565b90504761391983613979565b600061392547836138b0565b90506139318382613ccb565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106139ae576139ae6144fe565b6001600160a01b03928316602091820292909201810191909152600e54604080516339d94ae160e11b8152905191909316926373b295c2926004808301939192829003018186803b158015613a0257600080fd5b505afa158015613a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3a9190613eac565b81600181518110613a4d57613a4d6144fe565b6001600160a01b039283166020918202929092010152600e54613a7391309116846132ac565b600e54604051633b158ab160e11b81526001600160a01b039091169063762b156290613aac908590600090869030904290600401614347565b600060405180830381600087803b158015613ac657600080fd5b505af1158015613ada573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415613b775760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610ece565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6000613c20826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d849092919063ffffffff16565b805190915015611a055780806020019051810190613c3e9190613fba565b611a055760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ece565b60008183613cbe5760405162461bcd60e51b8152600401610ece9190614191565b50600061363c8486614429565b600e54613ce39030906001600160a01b0316846132ac565b600e54604051637c8d9fb960e11b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f91b3f7290839060c4016060604051808303818588803b158015613d4b57600080fd5b505af1158015613d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ad391906140f7565b606061340f848460008585843b613ddd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ece565b600080866001600160a01b03168587604051613df99190614151565b60006040518083038185875af1925050503d8060008114613e36576040519150601f19603f3d011682016040523d82523d6000602084013e613e3b565b606091505b5091509150613e4b828286613e56565b979650505050505050565b60608315613e65575081611396565b825115613e755782518084602001fd5b8160405162461bcd60e51b8152600401610ece9190614191565b600060208284031215613ea157600080fd5b81356113968161452a565b600060208284031215613ebe57600080fd5b81516113968161452a565b60008060408385031215613edc57600080fd5b8235613ee78161452a565b91506020830135613ef78161452a565b809150509250929050565b600080600060608486031215613f1757600080fd5b8335613f228161452a565b92506020840135613f328161452a565b929592945050506040919091013590565b60008060408385031215613f5657600080fd5b8235613f618161452a565b91506020830135613ef781614542565b60008060408385031215613f8457600080fd5b8235613f8f8161452a565b946020939093013593505050565b600060208284031215613faf57600080fd5b813561139681614542565b600060208284031215613fcc57600080fd5b815161139681614542565b600060208284031215613fe957600080fd5b813567ffffffffffffffff81111561400057600080fd5b8201601f8101841361401157600080fd5b803561402461401f826143e9565b6143b8565b81815285602083850101111561403957600080fd5b81602084016020830137600091810160200191909152949350505050565b60006020828403121561406957600080fd5b815167ffffffffffffffff81111561408057600080fd5b8201601f8101841361409157600080fd5b805161409f61401f826143e9565b8181528560208385010111156140b457600080fd5b61363c826020830160208601614481565b6000602082840312156140d757600080fd5b5035919050565b6000602082840312156140f057600080fd5b5051919050565b60008060006060848603121561410c57600080fd5b8351925060208401519150604084015190509250925092565b6000815180845261413d816020860160208601614481565b601f01601f19169290920160200192915050565b60008251614163818460208701614481565b9190910192915050565b6001600160a01b038316815260406020820181905260009061340f90830184614125565b6020815260006113966020830184614125565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600d908201526c2727902727a2229027aba722a960991b604082015260600190565b60208082526014908201527353454e4445522043414e2754204245205a45524f60601b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156143975784516001600160a01b031683529383019391830191600101614372565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156143e1576143e1614514565b604052919050565b600067ffffffffffffffff82111561440357614403614514565b50601f01601f191660200190565b60008219821115614424576144246144e8565b500190565b60008261444657634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614465576144656144e8565b500290565b60008282101561447c5761447c6144e8565b500390565b60005b8381101561449c578181015183820152602001614484565b838111156121905750506000910152565b600181811c908216806144c157607f821691505b602082108114156144e257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461453f57600080fd5b50565b801515811461453f57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122010bab493d99aee04215b6b672f29af3c45a9ac3fbb800e28a9cc439482ab7c2c64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d40000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b1e5e6b771ef9b48529c0e091823ef82f3102d0900000000000000000000000091bb7233a030b63c33477b303e41b66e207ca1bb0000000000000000000000007afc36e23f731a1852b95a1d14ef0889ad4afbdc0000000000000000000000004876d518c121351359987f0ecb6ffdbe21098c340000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000080000000000000000000000008942904901b65a544549ed57b66a43187522afe3000000000000000000000000b1e5e6b771ef9b48529c0e091823ef82f3102d0900000000000000000000000091bb7233a030b63c33477b303e41b66e207ca1bb0000000000000000000000007afc36e23f731a1852b95a1d14ef0889ad4afbdc000000000000000000000000f65e3c7bcefffe68746c8ff610ac0b1354d0e43f000000000000000000000000843b7c183165ab513d7c5b443d8ed7e5169de0e40000000000000000000000004876d518c121351359987f0ecb6ffdbe21098c34000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b60000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000128e2e700000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e

Deployed Bytecode

0x60806040526004361061044b5760003560e01c80638013858b11610234578063b62496f51161012e578063db3ad6b5116100b6578063f5a072561161007a578063f5a0725614610d93578063f74c993414610da8578063f7b9f94314610dc8578063f9afc76314610ddd578063fb0a749414610df257600080fd5b8063db3ad6b514610cee578063dd62ed3e14610d03578063e33b7de314610d49578063ee1afdbf14610d5e578063f2fde38b14610d7357600080fd5b8063ce7c2ac2116100fd578063ce7c2ac214610c2d578063d0f7747414610c63578063d79779b214610c83578063d892934214610cb9578063da41b33314610cd957600080fd5b8063b62496f514610ba8578063b96392c114610bd8578063bdf24a5314610bf8578063c5ca7d6d14610c0d57600080fd5b806395d89b41116101bc578063a457c2d711610180578063a457c2d714610b1d578063a5021a1714610b3d578063a538ddf214610b52578063a9059cbb14610b72578063ab57476114610b9257600080fd5b806395d89b4114610a7d5780639852595c14610a925780639a7a23d614610ac85780639c82751c14610ae8578063a0a8fe6514610b0857600080fd5b80638b83209b116102035780638b83209b146109df5780638bc9c7b0146109ff5780638da5cb5b14610a1f5780638f0ba4ca14610a3d5780639349c47d14610a5d57600080fd5b80638013858b1461096a57806385141a771461098a5780638743ef6d146109aa57806388c41d7c146109bf57600080fd5b806348b750441161034557806365b8dbc0116102cd5780636f4a2cd0116102915780636f4a2cd0146108af57806370a08231146108df578063715018a6146109155780637628b3d71461092a5780637b7703921461094a57600080fd5b806365b8dbc01461081957806365bfe430146108395780636770474b146108595780636815a91c146108795780636d9ae0be1461089957600080fd5b806354f12f1f1161031457806354f12f1f14610798578063583bd7a6146107ae57806359640ed9146107ce5780635b0d4674146107ee5780635f1c31821461080357600080fd5b806348b750441461072e57806348e5642b1461074e57806349bd5a5e14610763578063545579731461078357600080fd5b806319165587116103d3578063395093511161039757806339509351146106735780633a98ef3914610693578063406072a9146106a85780634195fbf3146106ee57806342bc9fca1461070e57600080fd5b806319165587146105d15780631cdd3be3146105f157806323b872dd146106215780632bb14e1d14610641578063313ce5671461065757600080fd5b80630c08f3001161041a5780630c08f3001461053957806313114a9d14610559578063138a634a1461056f5780631694505e1461058457806318160ddd146105bc57600080fd5b806306fdde0314610499578063084a6bff146104c4578063095ea7b3146104e657806309a69f571461051657600080fd5b36610494577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156104a557600080fd5b506104ae610e12565b6040516104bb9190614191565b60405180910390f35b3480156104d057600080fd5b506104e46104df3660046140c5565b610ea4565b005b3480156104f257600080fd5b50610506610501366004613f71565b610efe565b60405190151581526020016104bb565b34801561052257600080fd5b5061052b610f15565b6040519081526020016104bb565b34801561054557600080fd5b506104e4610554366004613e8f565b611067565b34801561056557600080fd5b5061052b60165481565b34801561057b57600080fd5b506104ae6110b3565b34801561059057600080fd5b50600e546105a4906001600160a01b031681565b6040516001600160a01b0390911681526020016104bb565b3480156105c857600080fd5b5060025461052b565b3480156105dd57600080fd5b506104e46105ec366004613e8f565b611205565b3480156105fd57600080fd5b5061050661060c366004613e8f565b601b6020526000908152604090205460ff1681565b34801561062d57600080fd5b5061050661063c366004613f02565b611333565b34801561064d57600080fd5b5061052b60135481565b34801561066357600080fd5b50604051601281526020016104bb565b34801561067f57600080fd5b5061050661068e366004613f71565b61139d565b34801561069f57600080fd5b5060065461052b565b3480156106b457600080fd5b5061052b6106c3366004613ec9565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156106fa57600080fd5b506104e46107093660046140c5565b6113d3565b34801561071a57600080fd5b506104e46107293660046140c5565b611446565b34801561073a57600080fd5b506104e4610749366004613ec9565b61148a565b34801561075a57600080fd5b5061052b611672565b34801561076f57600080fd5b50600f546105a4906001600160a01b031681565b34801561078f57600080fd5b506104e46116b7565b3480156107a457600080fd5b5061052b60145481565b3480156107ba57600080fd5b506104e46107c9366004613f9d565b611a0a565b3480156107da57600080fd5b506104e46107e93660046140c5565b611a4e565b3480156107fa57600080fd5b506104ae611ada565b34801561080f57600080fd5b5061052b601a5481565b34801561082557600080fd5b506104e4610834366004613e8f565b611bb5565b34801561084557600080fd5b506104e46108543660046140c5565b611e51565b34801561086557600080fd5b506104e46108743660046140c5565b612196565b34801561088557600080fd5b506104e46108943660046140c5565b6121c5565b3480156108a557600080fd5b5061052b60175481565b3480156108bb57600080fd5b506108c46121f4565b604080519384526020840192909252908201526060016104bb565b3480156108eb57600080fd5b5061052b6108fa366004613e8f565b6001600160a01b031660009081526020819052604090205490565b34801561092157600080fd5b506104e46122b8565b34801561093657600080fd5b50600d546105a4906001600160a01b031681565b34801561095657600080fd5b506104e46109653660046140c5565b61232c565b34801561097657600080fd5b506104e46109853660046140c5565b612387565b34801561099657600080fd5b506012546105a4906001600160a01b031681565b3480156109b657600080fd5b506104e46123e2565b3480156109cb57600080fd5b506104e46109da3660046140c5565b61246a565b3480156109eb57600080fd5b506105a46109fa3660046140c5565b6124ae565b348015610a0b57600080fd5b506104e4610a1a3660046140c5565b6124de565b348015610a2b57600080fd5b506005546001600160a01b03166105a4565b348015610a4957600080fd5b506104e4610a58366004613fd7565b61250d565b348015610a6957600080fd5b506104e4610a78366004613e8f565b6129d9565b348015610a8957600080fd5b506104ae612a25565b348015610a9e57600080fd5b5061052b610aad366004613e8f565b6001600160a01b031660009081526009602052604090205490565b348015610ad457600080fd5b506104e4610ae3366004613f43565b612a34565b348015610af457600080fd5b506104e4610b033660046140c5565b612aff565b348015610b1457600080fd5b5061052b612b5a565b348015610b2957600080fd5b50610506610b38366004613f71565b612b9f565b348015610b4957600080fd5b5061052b612bee565b348015610b5e57600080fd5b506010546105a4906001600160a01b031681565b348015610b7e57600080fd5b50610506610b8d366004613f71565b612c33565b348015610b9e57600080fd5b5061052b60155481565b348015610bb457600080fd5b50610506610bc3366004613e8f565b601c6020526000908152604090205460ff1681565b348015610be457600080fd5b5061052b610bf3366004613e8f565b612c40565b348015610c0457600080fd5b506104ae612ceb565b348015610c1957600080fd5b506011546105a4906001600160a01b031681565b348015610c3957600080fd5b5061052b610c48366004613e8f565b6001600160a01b031660009081526008602052604090205490565b348015610c6f57600080fd5b506104e4610c7e366004613f9d565b612dc6565b348015610c8f57600080fd5b5061052b610c9e366004613e8f565b6001600160a01b03166000908152600b602052604090205490565b348015610cc557600080fd5b506104e4610cd4366004613f43565b612e22565b348015610ce557600080fd5b5061052b612e77565b348015610cfa57600080fd5b5061052b612ebc565b348015610d0f57600080fd5b5061052b610d1e366004613ec9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610d5557600080fd5b5060075461052b565b348015610d6a57600080fd5b506104ae612f01565b348015610d7f57600080fd5b506104e4610d8e366004613e8f565b612fdc565b348015610d9f57600080fd5b5061052b6130c7565b348015610db457600080fd5b5061052b610dc3366004613e8f565b61310c565b348015610dd457600080fd5b5061052b61313f565b348015610de957600080fd5b50610506613184565b348015610dfe57600080fd5b506104e4610e0d366004613e8f565b613201565b606060038054610e21906144ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4d906144ad565b8015610e9a5780601f10610e6f57610100808354040283529160200191610e9a565b820191906000526020600020905b815481529060010190602001808311610e7d57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610ed75760405162461bcd60e51b8152600401610ece906142cd565b60405180910390fd5b6013819055601554601454610ef89190610ef290849061324d565b9061324d565b60165550565b6000610f0b3384846132ac565b5060015b92915050565b600033610f345760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610f8557600080fd5b505afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190613fba565b610fd95760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b031663619a635e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106291906140de565b905090565b6005546001600160a01b031633146110915760405162461bcd60e51b8152600401610ece906142cd565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6060336110d25760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561112357600080fd5b505afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190613fba565b6111775760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b031663334de3a2335b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160006040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110629190810190614057565b6001600160a01b03811660009081526008602052604090205461123a5760405162461bcd60e51b8152600401610ece9061423c565b600061124560075490565b61124f9047614411565b9050600061127c8383611277866001600160a01b031660009081526009602052604090205490565b6133d1565b90508061129b5760405162461bcd60e51b8152600401610ece90614282565b6001600160a01b038316600090815260096020526040812080548392906112c3908490614411565b9250508190555080600760008282546112dc9190614411565b909155506112ec90508382613417565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6000611340848484613530565b611392843361138d85604051806060016040528060288152602001614577602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061360b565b6132ac565b5060015b9392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610f0b91859061138d908661324d565b6005546001600160a01b031633146113fd5760405162461bcd60e51b8152600401610ece906142cd565b478111156114085750475b6005546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611442573d6000803e3d6000fd5b5050565b6005546001600160a01b031633146114705760405162461bcd60e51b8152600401610ece906142cd565b6014819055601554601354610ef89190610ef2908461324d565b6001600160a01b0381166000908152600860205260409020546114bf5760405162461bcd60e51b8152600401610ece9061423c565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561151757600080fd5b505afa15801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f91906140de565b6115599190614411565b90506000611592838361127787876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b9050806115b15760405162461bcd60e51b8152600401610ece90614282565b6001600160a01b038085166000908152600c60209081526040808320938716835292905290812080548392906115e8908490614411565b90915550506001600160a01b0384166000908152600b602052604081208054839290611615908490614411565b909155506116269050848483613645565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600d54604080516345193f5560e11b815290516000926001600160a01b031691638a327eaa916004808301926020929190829003018186803b15801561102a57600080fd5b33806117195760405162461bcd60e51b815260206004820152602b60248201527f4d414e494120435348543a20206372656174696f6e2066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610ece565b6001600160a01b0381166000908152601b602052604090205460ff16156117825760405162461bcd60e51b815260206004820152601f60248201527f4d414e494120435348543a20426c61636b6c69737465642061646472657373006044820152606401610ece565b6010546001600160a01b038281169116148015906117ae57506011546001600160a01b03828116911614155b6118205760405162461bcd60e51b815260206004820152603860248201527f4d414e494120435348543a20667574757220616e642072657761726473506f6f60448201527f6c2063616e6e6f7420636173686f7574207265776172647300000000000000006064820152608401610ece565b600d546040516330cd31af60e11b81526001600160a01b038381166004830152600092169063619a635e9060240160206040518083038186803b15801561186657600080fd5b505afa15801561187a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189e91906140de565b90506000811161190d5760405162461bcd60e51b815260206004820152603460248201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f75676044820152731a081c995dd85c99081d1bc818d85cda081bdd5d60621b6064820152608401610ece565b601954610100900460ff161561196f57601754600090156119615761194860646119426017548561369790919063ffffffff16565b90613716565b601054909150611961906001600160a01b031682613758565b61196b818361446a565b9150505b601154611986906001600160a01b031683836137a7565b600d5460405163170a62c760e21b81526001600160a01b03848116600483015290911690635c298b1c90602401602060405180830381600087803b1580156119cd57600080fd5b505af11580156119e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0591906140de565b505050565b6005546001600160a01b03163314611a345760405162461bcd60e51b8152600401610ece906142cd565b601980549115156101000261ff0019909216919091179055565b6005546001600160a01b03163314611a785760405162461bcd60e51b8152600401610ece906142cd565b600d54604051631df3773160e31b8152600481018390526001600160a01b039091169063ef9bb988906024015b600060405180830381600087803b158015611abf57600080fd5b505af1158015611ad3573d6000803e3d6000fd5b5050505050565b606033611af95760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611b4a57600080fd5b505afa158015611b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b829190613fba565b611b9e5760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b0316634a389fae3361118a565b6005546001600160a01b03163314611bdf5760405162461bcd60e51b8152600401610ece906142cd565b600e546001600160a01b0382811691161415611c4e5760405162461bcd60e51b815260206004820152602860248201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604482015267206164647265737360c01b6064820152608401610ece565b600e546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600e80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b158015611ce057600080fd5b505afa158015611cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d189190613eac565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad9190613eac565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611df557600080fd5b505af1158015611e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2d9190613eac565b600f80546001600160a01b0319166001600160a01b03929092169190911790555050565b3380611ead5760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ece565b6001600160a01b0381166000908152601b602052604090205460ff1615611f165760405162461bcd60e51b815260206004820152601f60248201527f4d414e494120435348543a20426c61636b6c69737465642061646472657373006044820152606401610ece565b6010546001600160a01b03828116911614801590611f4257506011546001600160a01b03828116911614155b611fa95760405162461bcd60e51b815260206004820152603260248201527f435348543a20667574757220616e642072657761726473506f6f6c2063616e6e6044820152716f7420636173686f7574207265776172647360701b6064820152608401610ece565b600d546040516329b8573160e21b81526001600160a01b03838116600483015260248201859052600092169063a6e15cc49060440160206040518083038186803b158015611ff657600080fd5b505afa15801561200a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202e91906140de565b9050600081116120975760405162461bcd60e51b815260206004820152602e60248201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160448201526d1c99081d1bc818d85cda081bdd5d60921b6064820152608401610ece565b601954610100900460ff16156120f357601754600090156120e5576120cc60646119426017548561369790919063ffffffff16565b6010549091506120e5906001600160a01b031682613758565b6120ef818361446a565b9150505b60115461210a906001600160a01b031683836137a7565b600d5460405163376db80160e11b81526001600160a01b0384811660048301526024820186905290911690636edb700290604401602060405180830381600087803b15801561215857600080fd5b505af115801561216c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219091906140de565b50505050565b6005546001600160a01b031633146121c05760405162461bcd60e51b8152600401610ece906142cd565b601a55565b6005546001600160a01b031633146121ef5760405162461bcd60e51b8152600401610ece906142cd565b601755565b600554600090819081906001600160a01b031633146122255760405162461bcd60e51b8152600401610ece906142cd565b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b15801561227557600080fd5b505af1158015612289573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ad91906140f7565b925092509250909192565b6005546001600160a01b031633146122e25760405162461bcd60e51b8152600401610ece906142cd565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146123565760405162461bcd60e51b8152600401610ece906142cd565b600d546040516318df5db960e31b8152600481018390526001600160a01b039091169063c6faedc890602401611aa5565b6005546001600160a01b031633146123b15760405162461bcd60e51b8152600401610ece906142cd565b600d5460405163cece91eb60e01b8152600481018390526001600160a01b039091169063cece91eb90602401611aa5565b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b15801561243257600080fd5b505af1158015612446573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0591906140f7565b6005546001600160a01b031633146124945760405162461bcd60e51b8152600401610ece906142cd565b6015819055601454601354610ef8918391610ef29161324d565b6000600a82815481106124c3576124c36144fe565b6000918252602090912001546001600160a01b031692915050565b6005546001600160a01b031633146125085760405162461bcd60e51b8152600401610ece906142cd565b601855565b6003815111801561251f575060208151105b61256b5760405162461bcd60e51b815260206004820181905260248201527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c49446044820152606401610ece565b33806125d05760405162461bcd60e51b815260206004820152602e60248201527f4e4f4445204352454154494f4e3a20206372656174696f6e2066726f6d20746860448201526d65207a65726f206164647265737360901b6064820152608401610ece565b6001600160a01b0381166000908152601b602052604090205460ff16156126445760405162461bcd60e51b815260206004820152602260248201527f4e4f4445204352454154494f4e3a20426c61636b6c6973746564206164647265604482015261737360f01b6064820152608401610ece565b6010546001600160a01b0382811691161480159061267057506011546001600160a01b03828116911614155b6126e25760405162461bcd60e51b815260206004820152603760248201527f4e4f4445204352454154494f4e3a20667574757220616e64207265776172647360448201527f506f6f6c2063616e6e6f7420637265617465206e6f64650000000000000000006064820152608401610ece565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b15801561272757600080fd5b505afa15801561273b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275f91906140de565b905080612781836001600160a01b031660009081526020819052604090205490565b10156127e45760405162461bcd60e51b815260206004820152602c60248201527f4e4f4445204352454154494f4e3a2042616c616e636520746f6f206c6f77206660448201526b37b91031b932b0ba34b7b71760a11b6064820152608401610ece565b30600090815260208190526040902054601a548110801590819061280f5750601954610100900460ff165b801561281e575060195460ff16155b801561283857506005546001600160a01b03858116911614155b801561285d57506001600160a01b0384166000908152601c602052604090205460ff16155b15612963576019805460ff1916600117905560155460009061288790606490611942908690613697565b6010549091506128a0906001600160a01b031682613758565b60006128bc60646119426013548761369790919063ffffffff16565b905060006128da60646119426018548561369790919063ffffffff16565b6011549091506128f3906001600160a01b031682613758565b6011546129149030906001600160a01b031661290f85856138b0565b6137a7565b600061293060646119426014548961369790919063ffffffff16565b905061293b816138f2565b3060009081526020819052604090205461295490613979565b50506019805460ff1916905550505b61296e8430856137a7565b600d546040516312b8603f60e01b81526001600160a01b03909116906312b8603f906129a0908790899060040161416d565b600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b03163314612a035760405162461bcd60e51b8152600401610ece906142cd565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610e21906144ad565b6005546001600160a01b03163314612a5e5760405162461bcd60e51b8152600401610ece906142cd565b600f546001600160a01b0383811691161415612af55760405162461bcd60e51b815260206004820152604a60248201527f544b4e3a205468652050616e63616b655377617020706169722063616e6e6f7460448201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b65746064820152694d616b6572506169727360b01b608482015260a401610ece565b6114428282613ae2565b6005546001600160a01b03163314612b295760405162461bcd60e51b8152600401610ece906142cd565b600d5460405163d1871a8960e01b8152600481018390526001600160a01b039091169063d1871a8990602401611aa5565b600d546040805163b8527aef60e01b815290516000926001600160a01b03169163b8527aef916004808301926020929190829003018186803b15801561102a57600080fd5b6000610f0b338461138d8560405180606001604052806025815260200161459f602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061360b565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b15801561102a57600080fd5b6000610f0b338484613530565b6005546000906001600160a01b03163314612c6d5760405162461bcd60e51b8152600401610ece906142cd565b600d546040516330cd31af60e11b81526001600160a01b0384811660048301529091169063619a635e906024015b60206040518083038186803b158015612cb357600080fd5b505afa158015612cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0f91906140de565b606033612d0a5760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612d5b57600080fd5b505afa158015612d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d939190613fba565b612daf5760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b031663c92819ce3361118a565b6005546001600160a01b03163314612df05760405162461bcd60e51b8152600401610ece906142cd565b600d54604051636d58441560e11b815282151560048201526001600160a01b039091169063dab0882a90602401611aa5565b6005546001600160a01b03163314612e4c5760405162461bcd60e51b8152600401610ece906142cd565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d546040805163fb10d6fb60e01b815290516000926001600160a01b03169163fb10d6fb916004808301926020929190829003018186803b15801561102a57600080fd5b600d546040805163613ff46f60e01b815290516000926001600160a01b03169163613ff46f916004808301926020929190829003018186803b15801561102a57600080fd5b606033612f205760405162461bcd60e51b8152600401610ece9061420e565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612f7157600080fd5b505afa158015612f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa99190613fba565b612fc55760405162461bcd60e51b8152600401610ece906141e7565b600d546001600160a01b0316635759fb023361118a565b6005546001600160a01b031633146130065760405162461bcd60e51b8152600401610ece906142cd565b6001600160a01b03811661306b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ece565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604080516327b3bf1160e01b815290516000926001600160a01b0316916327b3bf11916004808301926020929190829003018186803b15801561102a57600080fd5b600d5460405163112469f960e21b81526001600160a01b0383811660048301526000921690634491a7e490602401612c9b565b600d5460408051636f60a39360e11b815290516000926001600160a01b03169163dec14726916004808301926020929190829003018186803b15801561102a57600080fd5b600d54604080516385c44d9d60e01b815290516000926001600160a01b0316916385c44d9d916004808301926020929190829003018186803b1580156131c957600080fd5b505afa1580156131dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110629190613fba565b6005546001600160a01b0316331461322b5760405162461bcd60e51b8152600401610ece906142cd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60008061325a8385614411565b9050838110156113965760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ece565b6001600160a01b03831661330e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ece565b6001600160a01b03821661336f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ece565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6006546001600160a01b038416600090815260086020526040812054909183916133fb908661444b565b6134059190614429565b61340f919061446a565b949350505050565b804710156134675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ece565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146134b4576040519150601f19603f3d011682016040523d82523d6000602084013e6134b9565b606091505b5050905080611a055760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ece565b6001600160a01b0383166135565760405162461bcd60e51b8152600401610ece90614302565b6001600160a01b03821661357c5760405162461bcd60e51b8152600401610ece906141a4565b6001600160a01b0383166000908152601b602052604090205460ff161580156135be57506001600160a01b0382166000908152601b602052604090205460ff16155b6136005760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b6044820152606401610ece565b611a058383836137a7565b6000818484111561362f5760405162461bcd60e51b8152600401610ece9190614191565b50600061363c848661446a565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a05908490613bcb565b6000826136a657506000610f0f565b60006136b2838561444b565b9050826136bf8583614429565b146113965760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ece565b600061139683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c9d565b4761376282613979565b600061376e47836138b0565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611ad3573d6000803e3d6000fd5b6001600160a01b0383166137cd5760405162461bcd60e51b8152600401610ece90614302565b6001600160a01b0382166137f35760405162461bcd60e51b8152600401610ece906141a4565b61383081604051806060016040528060268152602001614551602691396001600160a01b038616600090815260208190526040902054919061360b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461385f908261324d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016133c4565b600061139683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061360b565b60006138ff826002613716565b9050600061390d83836138b0565b90504761391983613979565b600061392547836138b0565b90506139318382613ccb565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106139ae576139ae6144fe565b6001600160a01b03928316602091820292909201810191909152600e54604080516339d94ae160e11b8152905191909316926373b295c2926004808301939192829003018186803b158015613a0257600080fd5b505afa158015613a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3a9190613eac565b81600181518110613a4d57613a4d6144fe565b6001600160a01b039283166020918202929092010152600e54613a7391309116846132ac565b600e54604051633b158ab160e11b81526001600160a01b039091169063762b156290613aac908590600090869030904290600401614347565b600060405180830381600087803b158015613ac657600080fd5b505af1158015613ada573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415613b775760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610ece565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6000613c20826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d849092919063ffffffff16565b805190915015611a055780806020019051810190613c3e9190613fba565b611a055760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ece565b60008183613cbe5760405162461bcd60e51b8152600401610ece9190614191565b50600061363c8486614429565b600e54613ce39030906001600160a01b0316846132ac565b600e54604051637c8d9fb960e11b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f91b3f7290839060c4016060604051808303818588803b158015613d4b57600080fd5b505af1158015613d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ad391906140f7565b606061340f848460008585843b613ddd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ece565b600080866001600160a01b03168587604051613df99190614151565b60006040518083038185875af1925050503d8060008114613e36576040519150601f19603f3d011682016040523d82523d6000602084013e613e3b565b606091505b5091509150613e4b828286613e56565b979650505050505050565b60608315613e65575081611396565b825115613e755782518084602001fd5b8160405162461bcd60e51b8152600401610ece9190614191565b600060208284031215613ea157600080fd5b81356113968161452a565b600060208284031215613ebe57600080fd5b81516113968161452a565b60008060408385031215613edc57600080fd5b8235613ee78161452a565b91506020830135613ef78161452a565b809150509250929050565b600080600060608486031215613f1757600080fd5b8335613f228161452a565b92506020840135613f328161452a565b929592945050506040919091013590565b60008060408385031215613f5657600080fd5b8235613f618161452a565b91506020830135613ef781614542565b60008060408385031215613f8457600080fd5b8235613f8f8161452a565b946020939093013593505050565b600060208284031215613faf57600080fd5b813561139681614542565b600060208284031215613fcc57600080fd5b815161139681614542565b600060208284031215613fe957600080fd5b813567ffffffffffffffff81111561400057600080fd5b8201601f8101841361401157600080fd5b803561402461401f826143e9565b6143b8565b81815285602083850101111561403957600080fd5b81602084016020830137600091810160200191909152949350505050565b60006020828403121561406957600080fd5b815167ffffffffffffffff81111561408057600080fd5b8201601f8101841361409157600080fd5b805161409f61401f826143e9565b8181528560208385010111156140b457600080fd5b61363c826020830160208601614481565b6000602082840312156140d757600080fd5b5035919050565b6000602082840312156140f057600080fd5b5051919050565b60008060006060848603121561410c57600080fd5b8351925060208401519150604084015190509250925092565b6000815180845261413d816020860160208601614481565b601f01601f19169290920160200192915050565b60008251614163818460208701614481565b9190910192915050565b6001600160a01b038316815260406020820181905260009061340f90830184614125565b6020815260006113966020830184614125565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600d908201526c2727902727a2229027aba722a960991b604082015260600190565b60208082526014908201527353454e4445522043414e2754204245205a45524f60601b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156143975784516001600160a01b031683529383019391830191600101614372565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156143e1576143e1614514565b604052919050565b600067ffffffffffffffff82111561440357614403614514565b50601f01601f191660200190565b60008219821115614424576144246144e8565b500190565b60008261444657634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614465576144656144e8565b500290565b60008282101561447c5761447c6144e8565b500390565b60005b8381101561449c578181015183820152602001614484565b838111156121905750506000910152565b600181811c908216806144c157607f821691505b602082108114156144e257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461453f57600080fd5b50565b801515811461453f57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122010bab493d99aee04215b6b672f29af3c45a9ac3fbb800e28a9cc439482ab7c2c64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d40000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b1e5e6b771ef9b48529c0e091823ef82f3102d0900000000000000000000000091bb7233a030b63c33477b303e41b66e207ca1bb0000000000000000000000007afc36e23f731a1852b95a1d14ef0889ad4afbdc0000000000000000000000004876d518c121351359987f0ecb6ffdbe21098c340000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000080000000000000000000000008942904901b65a544549ed57b66a43187522afe3000000000000000000000000b1e5e6b771ef9b48529c0e091823ef82f3102d0900000000000000000000000091bb7233a030b63c33477b303e41b66e207ca1bb0000000000000000000000007afc36e23f731a1852b95a1d14ef0889ad4afbdc000000000000000000000000f65e3c7bcefffe68746c8ff610ac0b1354d0e43f000000000000000000000000843b7c183165ab513d7c5b443d8ed7e5169de0e40000000000000000000000004876d518c121351359987f0ecb6ffdbe21098c34000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b60000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000128e2e700000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e

-----Decoded View---------------
Arg [0] : payees (address[]): 0xB1E5E6B771EF9b48529C0E091823EF82F3102d09,0x91BB7233A030B63C33477B303e41B66e207CA1bb,0x7afC36e23f731a1852b95a1D14eF0889ad4AfBDC,0x4876D518c121351359987f0ECB6fFdBe21098c34
Arg [1] : shares (uint256[]): 25,25,25,25
Arg [2] : addresses (address[]): 0x8942904901b65A544549ed57b66a43187522Afe3,0xB1E5E6B771EF9b48529C0E091823EF82F3102d09,0x91BB7233A030B63C33477B303e41B66e207CA1bb,0x7afC36e23f731a1852b95a1D14eF0889ad4AfBDC,0xF65e3C7bcEFffe68746c8FF610ac0b1354D0E43f,0x843B7C183165ab513d7C5b443d8eD7e5169De0e4,0x4876D518c121351359987f0ECB6fFdBe21098c34,0x000000000000000000000000000000000000dEaD
Arg [3] : balances (uint256[]): 220000,220000,220000,220000,10000,100000,10000,19456743
Arg [4] : fees (uint256[]): 2,60,10,10,30
Arg [5] : swapAmount (uint256): 30
Arg [6] : uniV2Router (address): 0x60aE616a2155Ee3d9A68541Ba4544862310933d4

-----Encoded View---------------
41 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000340
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000460
Arg [5] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [6] : 00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d4
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 000000000000000000000000b1e5e6b771ef9b48529c0e091823ef82f3102d09
Arg [9] : 00000000000000000000000091bb7233a030b63c33477b303e41b66e207ca1bb
Arg [10] : 0000000000000000000000007afc36e23f731a1852b95a1d14ef0889ad4afbdc
Arg [11] : 0000000000000000000000004876d518c121351359987f0ecb6ffdbe21098c34
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [18] : 0000000000000000000000008942904901b65a544549ed57b66a43187522afe3
Arg [19] : 000000000000000000000000b1e5e6b771ef9b48529c0e091823ef82f3102d09
Arg [20] : 00000000000000000000000091bb7233a030b63c33477b303e41b66e207ca1bb
Arg [21] : 0000000000000000000000007afc36e23f731a1852b95a1d14ef0889ad4afbdc
Arg [22] : 000000000000000000000000f65e3c7bcefffe68746c8ff610ac0b1354d0e43f
Arg [23] : 000000000000000000000000843b7c183165ab513d7c5b443d8ed7e5169de0e4
Arg [24] : 0000000000000000000000004876d518c121351359987f0ecb6ffdbe21098c34
Arg [25] : 000000000000000000000000000000000000000000000000000000000000dead
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [27] : 0000000000000000000000000000000000000000000000000000000000035b60
Arg [28] : 0000000000000000000000000000000000000000000000000000000000035b60
Arg [29] : 0000000000000000000000000000000000000000000000000000000000035b60
Arg [30] : 0000000000000000000000000000000000000000000000000000000000035b60
Arg [31] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [32] : 00000000000000000000000000000000000000000000000000000000000186a0
Arg [33] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [34] : 000000000000000000000000000000000000000000000000000000000128e2e7
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [37] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [38] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [39] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [40] : 000000000000000000000000000000000000000000000000000000000000001e


Deployed Bytecode Sourcemap

67979:16600:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50002:40;27246:10;50002:40;;;-1:-1:-1;;;;;6678:32:1;;;6660:51;;50032:9:0;6742:2:1;6727:18;;6720:34;6633:18;50002:40:0;;;;;;;67979:16600;;;;;33336:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72141:166;;;;;;;;;;-1:-1:-1;72141:166:0;;;;;:::i;:::-;;:::i;:::-;;35588:194;;;;;;;;;;-1:-1:-1;35588:194:0;;;;;:::i;:::-;;:::i;:::-;;;8452:14:1;;8445:22;8427:41;;8415:2;8400:18;35588:194:0;8287:187:1;80922:321:0;;;;;;;;;;;;;:::i;:::-;;;22475:25:1;;;22463:2;22448:18;80922:321:0;22329:177:1;71911:104:0;;;;;;;;;;-1:-1:-1;71911:104:0;;;;;:::i;:::-;;:::i;68458:24::-;;;;;;;;;;;;;;;;82657:321;;;;;;;;;;;;;:::i;68126:35::-;;;;;;;;;;-1:-1:-1;68126:35:0;;;;-1:-1:-1;;;;;68126:35:0;;;;;;-1:-1:-1;;;;;6434:32:1;;;6416:51;;6404:2;6389:18;68126:35:0;6270:203:1;34456:108:0;;;;;;;;;;-1:-1:-1;34544:12:0;;34456:108;;51808:616;;;;;;;;;;-1:-1:-1;51808:616:0;;;;;:::i;:::-;;:::i;68668:46::-;;;;;;;;;;-1:-1:-1;68668:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36264:454;;;;;;;;;;-1:-1:-1;36264:454:0;;;;;:::i;:::-;;:::i;68358:25::-;;;;;;;;;;;;;;;;34298:93;;;;;;;;;;-1:-1:-1;34298:93:0;;34381:2;23962:36:1;;23950:2;23935:18;34298:93:0;23820:184:1;37127:288:0;;;;;;;;;;-1:-1:-1;37127:288:0;;;;;:::i;:::-;;:::i;50133:91::-;;;;;;;;;;-1:-1:-1;50204:12:0;;50133:91;;51262:155;;;;;;;;;;-1:-1:-1;51262:155:0;;;;;:::i;:::-;-1:-1:-1;;;;;51379:21:0;;;51347:7;51379:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;51262:155;80293:180;;;;;;;;;;-1:-1:-1;80293:180:0;;;;;:::i;:::-;;:::i;72315:173::-;;;;;;;;;;-1:-1:-1;72315:173:0;;;;;:::i;:::-;;:::i;52692:700::-;;;;;;;;;;-1:-1:-1;52692:700:0;;;;;:::i;:::-;;:::i;84318:125::-;;;;;;;;;;;;;:::i;68170:28::-;;;;;;;;;;-1:-1:-1;68170:28:0;;;;-1:-1:-1;;;;;68170:28:0;;;79216:1069;;;;;;;;;;;;;:::i;68390:31::-;;;;;;;;;;;;;;;;80481:96;;;;;;;;;;-1:-1:-1;80481:96:0;;;;;:::i;:::-;;:::i;82261:131::-;;;;;;;;;;-1:-1:-1;82261:131:0;;;;;:::i;:::-;;:::i;83325:333::-;;;;;;;;;;;;;:::i;68628:31::-;;;;;;;;;;;;;;;;71302:482;;;;;;;;;;-1:-1:-1;71302:482:0;;;;;:::i;:::-;;:::i;78117:1091::-;;;;;;;;;;-1:-1:-1;78117:1091:0;;;;;:::i;:::-;;:::i;71792:111::-;;;;;;;;;;-1:-1:-1;71792:111:0;;;;;:::i;:::-;;:::i;72666:97::-;;;;;;;;;;-1:-1:-1;72666:97:0;;;;;:::i;:::-;;:::i;68491:25::-;;;;;;;;;;;;;;;;84008:200;;;;;;;;;;;;;:::i;:::-;;;;23698:25:1;;;23754:2;23739:18;;23732:34;;;;23782:18;;;23775:34;23686:2;23671:18;84008:200:0;23496:319:1;34627:157:0;;;;;;;;;;-1:-1:-1;34627:157:0;;;;;:::i;:::-;-1:-1:-1;;;;;34758:18:0;34726:7;34758:18;;;;;;;;;;;;34627:157;28551:148;;;;;;;;;;;;;:::i;68072:45::-;;;;;;;;;;-1:-1:-1;68072:45:0;;;;-1:-1:-1;;;;;68072:45:0;;;81507:131;;;;;;;;;;-1:-1:-1;81507:131:0;;;;;:::i;:::-;;:::i;81251:::-;;;;;;;;;;-1:-1:-1;81251:131:0;;;;;:::i;:::-;;:::i;68279:70::-;;;;;;;;;;-1:-1:-1;68279:70:0;;;;-1:-1:-1;;;;;68279:70:0;;;84216:94;;;;;;;;;;;;;:::i;72496:162::-;;;;;;;;;;-1:-1:-1;72496:162:0;;;;;:::i;:::-;;:::i;51508:100::-;;;;;;;;;;-1:-1:-1;51508:100:0;;;;;:::i;:::-;;:::i;72771:92::-;;;;;;;;;;-1:-1:-1;72771:92:0;;;;;:::i;:::-;;:::i;27909:79::-;;;;;;;;;;-1:-1:-1;27974:6:0;;-1:-1:-1;;;;;27974:6:0;27909:79;;75930:2179;;;;;;;;;;-1:-1:-1;75930:2179:0;;;;;:::i;:::-;;:::i;72023:110::-;;;;;;;;;;-1:-1:-1;72023:110:0;;;;;:::i;:::-;;:::i;33555:104::-;;;;;;;;;;;;;:::i;50984:109::-;;;;;;;;;;-1:-1:-1;50984:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;51067:18:0;51040:7;51067:18;;;:9;:18;;;;;;;50984:109;72871:313;;;;;;;;;;-1:-1:-1;72871:313:0;;;;;:::i;:::-;;:::i;81771:121::-;;;;;;;;;;-1:-1:-1;81771:121:0;;;;;:::i;:::-;;:::i;84451:125::-;;;;;;;;;;;;;:::i;37918:388::-;;;;;;;;;;-1:-1:-1;37918:388:0;;;;;:::i;:::-;;:::i;81390:109::-;;;;;;;;;;;;;:::i;68205:27::-;;;;;;;;;;-1:-1:-1;68205:27:0;;;;-1:-1:-1;;;;;68205:27:0;;;34997:200;;;;;;;;;;-1:-1:-1;34997:200:0;;;;;:::i;:::-;;:::i;68428:23::-;;;;;;;;;;;;;;;;68721:57;;;;;;;;;;-1:-1:-1;68721:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;80734:180;;;;;;;;;;-1:-1:-1;80734:180:0;;;;;:::i;:::-;;:::i;82986:331::-;;;;;;;;;;;;;:::i;68239:31::-;;;;;;;;;;-1:-1:-1;68239:31:0;;;;-1:-1:-1;;;;;68239:31:0;;;50780:105;;;;;;;;;;-1:-1:-1;50780:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;50861:16:0;50834:7;50861:16;;;:7;:16;;;;;;;50780:105;82017:120;;;;;;;;;;-1:-1:-1;82017:120:0;;;;;:::i;:::-;;:::i;50570:119::-;;;;;;;;;;-1:-1:-1;50570:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;50655:26:0;50628:7;50655:26;;;:19;:26;;;;;;;50570:119;73192:141;;;;;;;;;;-1:-1:-1;73192:141:0;;;;;:::i;:::-;;:::i;82526:123::-;;;;;;;;;;;;;:::i;81646:117::-;;;;;;;;;;;;;:::i;35260:181::-;;;;;;;;;;-1:-1:-1;35260:181:0;;;;;:::i;:::-;-1:-1:-1;;;;;35406:18:0;;;35374:7;35406:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35260:181;50318:95;;;;;;;;;;-1:-1:-1;50391:14:0;;50318:95;;83666:334;;;;;;;;;;;;;:::i;28854:281::-;;;;;;;;;;-1:-1:-1;28854:281:0;;;;;:::i;:::-;;:::i;81900:109::-;;;;;;;;;;;;;:::i;80585:141::-;;;;;;;;;;-1:-1:-1;80585:141:0;;;;;:::i;:::-;;:::i;82400:118::-;;;;;;;;;;;;;:::i;82145:108::-;;;;;;;;;;;;;:::i;71149:145::-;;;;;;;;;;-1:-1:-1;71149:145:0;;;;;:::i;:::-;;:::i;33336:100::-;33390:13;33423:5;33416:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33336:100;:::o;72141:166::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;;;;;;;;;72212:10:::1;:18:::0;;;72290:8:::1;::::0;72268:16:::1;::::0;72253:46:::1;::::0;72290:8;72253:32:::1;::::0;72225:5;;72253:14:::1;:32::i;:::-;:36:::0;::::1;:46::i;:::-;72241:9;:58:::0;-1:-1:-1;72141:166:0:o;35588:194::-;35691:4;35713:39;27246:10;35736:7;35745:6;35713:8;:39::i;:::-;-1:-1:-1;35770:4:0;35588:194;;;;;:::o;80922:321::-;80970:7;27246:10;80990:59;;;;-1:-1:-1;;;80990:59:0;;;;;;;:::i;:::-;81082:17;;-1:-1:-1;;;;;81082:17:0;:30;27246:10;81082:44;;-1:-1:-1;;;;;;81082:44:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;81082:44:0;;;6416:51:1;6389:18;;81082:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81060:107;;;;-1:-1:-1;;;81060:107:0;;;;;;;:::i;:::-;81185:17;;-1:-1:-1;;;;;81185:17:0;:36;27246:10;81185:50;;-1:-1:-1;;;;;;81185:50:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;81185:50:0;;;6416:51:1;6389:18;;81185:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81178:57;;80922:321;:::o;71911:104::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;71988:12:::1;:19:::0;;-1:-1:-1;;;;;;71988:19:0::1;-1:-1:-1::0;;;;;71988:19:0;;;::::1;::::0;;;::::1;::::0;;71911:104::o;82657:321::-;82703:13;27246:10;82729:59;;;;-1:-1:-1;;;82729:59:0;;;;;;;:::i;:::-;82821:17;;-1:-1:-1;;;;;82821:17:0;:30;27246:10;82821:44;;-1:-1:-1;;;;;;82821:44:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;82821:44:0;;;6416:51:1;6389:18;;82821:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82799:107;;;;-1:-1:-1;;;82799:107:0;;;;;;;:::i;:::-;82924:17;;-1:-1:-1;;;;;82924:17:0;:32;27246:10;82957:12;82924:46;;-1:-1:-1;;;;;;82924:46:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;82924:46:0;;;6416:51:1;6389:18;;82924:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;82924:46:0;;;;;;;;;;;;:::i;51808:616::-;-1:-1:-1;;;;;51884:16:0;;51903:1;51884:16;;;:7;:16;;;;;;51876:71;;;;-1:-1:-1;;;51876:71:0;;;;;;;:::i;:::-;51960:21;52008:15;50391:14;;;50318:95;52008:15;51984:39;;:21;:39;:::i;:::-;51960:63;;52034:15;52052:108;52082:7;52104:13;52132:17;52141:7;-1:-1:-1;;;;;51067:18:0;51040:7;51067:18;;;:9;:18;;;;;;;50984:109;52132:17;52052:15;:108::i;:::-;52034:126;-1:-1:-1;52181:12:0;52173:68;;;;-1:-1:-1;;;52173:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52254:18:0;;;;;;:9;:18;;;;;:29;;52276:7;;52254:18;:29;;52276:7;;52254:29;:::i;:::-;;;;;;;;52312:7;52294:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;52332:35:0;;-1:-1:-1;52350:7:0;52359;52332:17;:35::i;:::-;52383:33;;;-1:-1:-1;;;;;6678:32:1;;6660:51;;6742:2;6727:18;;6720:34;;;52383:33:0;;6633:18:1;52383:33:0;;;;;;;51865:559;;51808:616;:::o;36264:454::-;36404:4;36421:36;36431:6;36439:9;36450:6;36421:9;:36::i;:::-;36468:220;36491:6;27246:10;36539:138;36595:6;36539:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36539:19:0;;;;;;:11;:19;;;;;;;;27246:10;36539:33;;;;;;;;;;:37;:138::i;:::-;36468:8;:220::i;:::-;-1:-1:-1;36706:4:0;36264:454;;;;;;:::o;37127:288::-;27246:10;37230:4;37324:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;37324:34:0;;;;;;;;;;37230:4;;37252:133;;37302:7;;37324:50;;37363:10;37324:38;:50::i;80293:180::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;80368:21:::1;80359:6;:30;80355:66;;;-1:-1:-1::0;80400:21:0::1;80355:66;27974:6:::0;;80432:33:::1;::::0;-1:-1:-1;;;;;27974:6:0;;;;80432:33;::::1;;;::::0;80458:6;;80432:33:::1;::::0;;;80458:6;27974;80432:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;80293:180:::0;:::o;72315:173::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;72387:16:::1;:24:::0;;;72471:8:::1;::::0;72434:10:::1;::::0;:46:::1;::::0;72471:8;72434:32:::1;::::0;72406:5;72434:14:::1;:32::i;52692:700::-:0;-1:-1:-1;;;;;52774:16:0;;52793:1;52774:16;;;:7;:16;;;;;;52766:71;;;;-1:-1:-1;;;52766:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50655:26:0;;52850:21;50655:26;;;:19;:26;;;;;;52874:30;;-1:-1:-1;;;52874:30:0;;52898:4;52874:30;;;6416:51:1;-1:-1:-1;;;;;52874:15:0;;;;;6389:18:1;;52874:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;52850:86;;52947:15;52965:115;52995:7;53017:13;53045:24;53054:5;53061:7;-1:-1:-1;;;;;51379:21:0;;;51347:7;51379:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;51262:155;52965:115;52947:133;-1:-1:-1;53101:12:0;53093:68;;;;-1:-1:-1;;;53093:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53174:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;53208:7;;53174:21;:41;;53208:7;;53174:41;:::i;:::-;;;;-1:-1:-1;;;;;;;53226:26:0;;;;;;:19;:26;;;;;:37;;53256:7;;53226:26;:37;;53256:7;;53226:37;:::i;:::-;;;;-1:-1:-1;53276:47:0;;-1:-1:-1;53299:5:0;53306:7;53315;53276:22;:47::i;:::-;53339:45;;;-1:-1:-1;;;;;6678:32:1;;;6660:51;;6742:2;6727:18;;6720:34;;;53339:45:0;;;;;6633:18:1;53339:45:0;;;;;;;52755:637;;52692:700;;:::o;84318:125::-;84398:17;;:37;;;-1:-1:-1;;;84398:37:0;;;;84371:7;;-1:-1:-1;;;;;84398:17:0;;:35;;:37;;;;;;;;;;;;;;:17;:37;;;;;;;;;;79216:1069;27246:10;;79296:113;;;;-1:-1:-1;;;79296:113:0;;21698:2:1;79296:113:0;;;21680:21:1;21737:2;21717:18;;;21710:30;21776:34;21756:18;;;21749:62;-1:-1:-1;;;21827:18:1;;;21820:41;21878:19;;79296:113:0;21496:407:1;79296:113:0;-1:-1:-1;;;;;79429:22:0;;;;;;:14;:22;;;;;;;;79428:23;79420:67;;;;-1:-1:-1;;;79420:67:0;;15245:2:1;79420:67:0;;;15227:21:1;15284:2;15264:18;;;15257:30;15323:33;15303:18;;;15296:61;15374:18;;79420:67:0;15043:355:1;79420:67:0;79530:12;;-1:-1:-1;;;;;79520:22:0;;;79530:12;;79520:22;;;;:52;;-1:-1:-1;79556:16:0;;-1:-1:-1;;;;;79546:26:0;;;79556:16;;79546:26;;79520:52;79498:158;;;;-1:-1:-1;;;79498:158:0;;18515:2:1;79498:158:0;;;18497:21:1;18554:2;18534:18;;;18527:30;18593:34;18573:18;;;18566:62;18664:26;18644:18;;;18637:54;18708:19;;79498:158:0;18313:420:1;79498:158:0;79690:17;;:44;;-1:-1:-1;;;79690:44:0;;-1:-1:-1;;;;;6434:32:1;;;79690:44:0;;;6416:51:1;79667:20:0;;79690:17;;:36;;6389:18:1;;79690:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79667:67;;79782:1;79767:12;:16;79745:118;;;;-1:-1:-1;;;79745:118:0;;22110:2:1;79745:118:0;;;22092:21:1;22149:2;22129:18;;;22122:30;22188:34;22168:18;;;22161:62;-1:-1:-1;;;22239:18:1;;;22232:50;22299:19;;79745:118:0;21908:416:1;79745:118:0;79878:11;;;;;;;79874:279;;;79942:10;;79906:17;;79942:14;79938:164;;79989:37;80022:3;79989:28;80006:10;;79989:12;:16;;:28;;;;:::i;:::-;:32;;:37::i;:::-;80062:12;;79977:49;;-1:-1:-1;80045:41:0;;-1:-1:-1;;;;;80062:12:0;79977:49;80045:16;:41::i;:::-;80116:25;80132:9;80116:25;;:::i;:::-;;;79891:262;79874:279;80179:16;;80163:55;;-1:-1:-1;;;;;80179:16:0;80197:6;80205:12;80163:15;:55::i;:::-;80229:17;;:48;;-1:-1:-1;;;80229:48:0;;-1:-1:-1;;;;;6434:32:1;;;80229:48:0;;;6416:51:1;80229:17:0;;;;:40;;6389:18:1;;80229:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;79245:1040;;79216:1069::o;80481:96::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;80549:11:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;80549:20:0;;::::1;::::0;;;::::1;::::0;;80481:96::o;82261:131::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;82336:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;82336:48:0;;::::1;::::0;::::1;22475:25:1::0;;;-1:-1:-1;;;;;82336:17:0;;::::1;::::0;:34:::1;::::0;22448:18:1;;82336:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;82261:131:::0;:::o;83325:333::-;83373:13;27246:10;83399:59;;;;-1:-1:-1;;;83399:59:0;;;;;;;:::i;:::-;83491:17;;-1:-1:-1;;;;;83491:17:0;:30;27246:10;83491:44;;-1:-1:-1;;;;;;83491:44:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;83491:44:0;;;6416:51:1;6389:18;;83491:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83469:107;;;;-1:-1:-1;;;83469:107:0;;;;;;;:::i;:::-;83594:17;;-1:-1:-1;;;;;83594:17:0;:42;27246:10;83637:12;27166:98;71302:482;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;71411:15:::1;::::0;-1:-1:-1;;;;;71389:38:0;;::::1;71411:15:::0;::::1;71389:38;;71381:91;;;::::0;-1:-1:-1;;;71381:91:0;;15605:2:1;71381:91:0::1;::::0;::::1;15587:21:1::0;15644:2;15624:18;;;15617:30;15683:34;15663:18;;;15656:62;-1:-1:-1;;;15734:18:1;;;15727:38;15782:19;;71381:91:0::1;15403:404:1::0;71381:91:0::1;71530:15;::::0;71488:59:::1;::::0;-1:-1:-1;;;;;71530:15:0;;::::1;::::0;71488:59;::::1;::::0;::::1;::::0;71530:15:::1;::::0;71488:59:::1;71558:15;:42:::0;;-1:-1:-1;;;;;;71558:42:0::1;-1:-1:-1::0;;;;;71558:42:0;::::1;::::0;;::::1;::::0;;;71648:25:::1;::::0;;-1:-1:-1;;;71648:25:0;;;;-1:-1:-1;;71558:42:0;71648:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;71558:42;71648:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;71636:59:0::1;;71704:4;71711:15;;;;;;;;;-1:-1:-1::0;;;;;71711:15:0::1;-1:-1:-1::0;;;;;71711:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71636:99;::::0;-1:-1:-1;;;;;;71636:99:0::1;::::0;;;;;;-1:-1:-1;;;;;6995:15:1;;;71636:99:0::1;::::0;::::1;6977:34:1::0;7047:15;;7027:18;;;7020:43;6912:18;;71636:99:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71746:13;:30:::0;;-1:-1:-1;;;;;;71746:30:0::1;-1:-1:-1::0;;;;;71746:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;71302:482:0:o;78117:1091::-;27246:10;;78217:70;;;;-1:-1:-1;;;78217:70:0;;12064:2:1;78217:70:0;;;12046:21:1;12103:2;12083:18;;;12076:30;12142:34;12122:18;;;12115:62;-1:-1:-1;;;12193:18:1;;;12186:35;12238:19;;78217:70:0;11862:401:1;78217:70:0;-1:-1:-1;;;;;78307:22:0;;;;;;:14;:22;;;;;;;;78306:23;78298:67;;;;-1:-1:-1;;;78298:67:0;;15245:2:1;78298:67:0;;;15227:21:1;15284:2;15264:18;;;15257:30;15323:33;15303:18;;;15296:61;15374:18;;78298:67:0;15043:355:1;78298:67:0;78408:12;;-1:-1:-1;;;;;78398:22:0;;;78408:12;;78398:22;;;;:52;;-1:-1:-1;78434:16:0;;-1:-1:-1;;;;;78424:26:0;;;78434:16;;78424:26;;78398:52;78376:152;;;;-1:-1:-1;;;78376:152:0;;9372:2:1;78376:152:0;;;9354:21:1;9411:2;9391:18;;;9384:30;9450:34;9430:18;;;9423:62;-1:-1:-1;;;9501:18:1;;;9494:48;9559:19;;78376:152:0;9170:414:1;78376:152:0;78562:17;;:92;;-1:-1:-1;;;78562:92:0;;-1:-1:-1;;;;;6678:32:1;;;78562:92:0;;;6660:51:1;6727:18;;;6720:34;;;78539:20:0;;78562:17;;:36;;6633:18:1;;78562:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78539:115;;78702:1;78687:12;:16;78665:112;;;;-1:-1:-1;;;78665:112:0;;13653:2:1;78665:112:0;;;13635:21:1;13692:2;13672:18;;;13665:30;13731:34;13711:18;;;13704:62;-1:-1:-1;;;13782:18:1;;;13775:44;13836:19;;78665:112:0;13451:410:1;78665:112:0;78794:11;;;;;;;78790:279;;;78858:10;;78822:17;;78858:14;78854:164;;78905:37;78938:3;78905:28;78922:10;;78905:12;:16;;:28;;;;:::i;:37::-;78978:12;;78893:49;;-1:-1:-1;78961:41:0;;-1:-1:-1;;;;;78978:12:0;78893:49;78961:16;:41::i;:::-;79032:25;79048:9;79032:25;;:::i;:::-;;;78807:262;78790:279;79095:16;;79079:55;;-1:-1:-1;;;;;79095:16:0;79113:6;79121:12;79079:15;:55::i;:::-;79145:17;;:55;;-1:-1:-1;;;79145:55:0;;-1:-1:-1;;;;;6678:32:1;;;79145:55:0;;;6660:51:1;6727:18;;;6720:34;;;79145:17:0;;;;:36;;6633:18:1;;79145:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;78166:1042;;78117:1091;:::o;71792:111::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;71870:16:::1;:25:::0;71792:111::o;72666:97::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;72737:10:::1;:18:::0;72666:97::o;84008:200::-;28121:6;;84088:7;;;;;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;84162:17:::1;;;;;;;;;-1:-1:-1::0;;;;;84162:17:0::1;-1:-1:-1::0;;;;;84162:36:0::1;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84155:45;;;;;;84008:200:::0;;;:::o;28551:148::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;28642:6:::1;::::0;28621:40:::1;::::0;28658:1:::1;::::0;-1:-1:-1;;;;;28642:6:0::1;::::0;28621:40:::1;::::0;28658:1;;28621:40:::1;28672:6;:19:::0;;-1:-1:-1;;;;;;28672:19:0::1;::::0;;28551:148::o;81507:131::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;81582:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;81582:48:0;;::::1;::::0;::::1;22475:25:1::0;;;-1:-1:-1;;;;;81582:17:0;;::::1;::::0;:38:::1;::::0;22448:18:1;;81582:48:0::1;22329:177:1::0;81251:131:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;81326:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;81326:48:0;;::::1;::::0;::::1;22475:25:1::0;;;-1:-1:-1;;;;;81326:17:0;;::::1;::::0;:34:::1;::::0;22448:18:1;;81326:48:0::1;22329:177:1::0;84216:94:0;84264:17;;;;;;;;;-1:-1:-1;;;;;84264:17:0;-1:-1:-1;;;;;84264:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;72496:162::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;72565:8:::1;:16:::0;;;72619::::1;::::0;72604:10:::1;::::0;:46:::1;::::0;72576:5;;72604:32:::1;::::0;:14:::1;:32::i;51508:100::-:0;51559:7;51586;51594:5;51586:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;51586:14:0;;51508:100;-1:-1:-1;;51508:100:0:o;72771:92::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;72841:6:::1;:14:::0;72771:92::o;75930:2179::-;76041:1;76026:4;76020:18;:22;:49;;;;;76067:2;76052:4;76046:18;:23;76020:49;75998:131;;;;-1:-1:-1;;;75998:131:0;;10537:2:1;75998:131:0;;;10519:21:1;;;10556:18;;;10549:30;10615:34;10595:18;;;10588:62;10667:18;;75998:131:0;10335:356:1;75998:131:0;27246:10;;76180:116;;;;-1:-1:-1;;;76180:116:0;;18940:2:1;76180:116:0;;;18922:21:1;18979:2;18959:18;;;18952:30;19018:34;18998:18;;;18991:62;-1:-1:-1;;;19069:18:1;;;19062:44;19123:19;;76180:116:0;18738:410:1;76180:116:0;-1:-1:-1;;;;;76316:22:0;;;;;;:14;:22;;;;;;;;76315:23;76307:70;;;;-1:-1:-1;;;76307:70:0;;18112:2:1;76307:70:0;;;18094:21:1;18151:2;18131:18;;;18124:30;18190:34;18170:18;;;18163:62;-1:-1:-1;;;18241:18:1;;;18234:32;18283:19;;76307:70:0;17910:398:1;76307:70:0;76420:12;;-1:-1:-1;;;;;76410:22:0;;;76420:12;;76410:22;;;;:52;;-1:-1:-1;76446:16:0;;-1:-1:-1;;;;;76436:26:0;;;76446:16;;76436:26;;76410:52;76388:157;;;;-1:-1:-1;;;76388:157:0;;17688:2:1;76388:157:0;;;17670:21:1;17727:2;17707:18;;;17700:30;17766:34;17746:18;;;17739:62;17837:25;17817:18;;;17810:53;17880:19;;76388:157:0;17486:419:1;76388:157:0;76576:17;;:29;;;-1:-1:-1;;;76576:29:0;;;;76556:17;;-1:-1:-1;;;;;76576:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76556:49;;76659:9;76638:17;76648:6;-1:-1:-1;;;;;34758:18:0;34726:7;34758:18;;;;;;;;;;;;34627:157;76638:17;:30;;76616:124;;;;-1:-1:-1;;;76616:124:0;;16014:2:1;76616:124:0;;;15996:21:1;16053:2;16033:18;;;16026:30;16092:34;16072:18;;;16065:62;-1:-1:-1;;;16143:18:1;;;16136:42;16195:19;;76616:124:0;15812:408:1;76616:124:0;76800:4;76751:28;34758:18;;;;;;;;;;;76861:16;;76837:40;;;;;;;76906;;-1:-1:-1;76935:11:0;;;;;;;76906:40;:66;;;;-1:-1:-1;76964:8:0;;;;76963:9;76906:66;:100;;;;-1:-1:-1;27974:6:0;;-1:-1:-1;;;;;76989:17:0;;;27974:6;;76989:17;;76906:100;:151;;;;-1:-1:-1;;;;;;77024:33:0;;;;;;:25;:33;;;;;;;;77023:34;76906:151;76888:1101;;;77084:8;:15;;-1:-1:-1;;77084:15:0;77095:4;77084:15;;;77163:8;;77084;;77138:43;;77177:3;;77138:34;;:20;;:24;:34::i;:43::-;77215:12;;77116:65;;-1:-1:-1;77198:43:0;;-1:-1:-1;;;;;77215:12:0;77116:65;77198:16;:43::i;:::-;77258:25;77286:73;77355:3;77286:50;77325:10;;77286:20;:38;;:50;;;;:::i;:73::-;77258:101;;77376:27;77406:70;77458:3;77406:29;77428:6;;77406:17;:21;;:29;;;;:::i;:70::-;77510:16;;77376:100;;-1:-1:-1;77493:55:0;;-1:-1:-1;;;;;77510:16:0;77376:100;77493:16;:55::i;:::-;77629:16;;77563:158;;77605:4;;-1:-1:-1;;;;;77629:16:0;77664:42;:17;77686:19;77664:21;:42::i;:::-;77563:15;:158::i;:::-;77738:18;77759:83;77824:3;77759:42;77784:16;;77759:20;:24;;:42;;;;:::i;:83::-;77738:104;;77859:26;77874:10;77859:14;:26::i;:::-;77937:4;34726:7;34758:18;;;;;;;;;;;77902:42;;:16;:42::i;:::-;-1:-1:-1;;77961:8:0;:16;;-1:-1:-1;;77961:16:0;;;-1:-1:-1;;76888:1101:0;77999:49;78015:6;78031:4;78038:9;77999:15;:49::i;:::-;78059:17;;:42;;-1:-1:-1;;;78059:42:0;;-1:-1:-1;;;;;78059:17:0;;;;:28;;:42;;78088:6;;78096:4;;78059:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75987:2122;;;;75930:2179;:::o;72023:110::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;72102:16:::1;:23:::0;;-1:-1:-1;;;;;;72102:23:0::1;-1:-1:-1::0;;;;;72102:23:0;;;::::1;::::0;;;::::1;::::0;;72023:110::o;33555:104::-;33611:13;33644:7;33637:14;;;;;:::i;72871:313::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;73007:13:::1;::::0;-1:-1:-1;;;;;72999:21:0;;::::1;73007:13:::0;::::1;72999:21;;72977:145;;;::::0;-1:-1:-1;;;72977:145:0;;17205:2:1;72977:145:0::1;::::0;::::1;17187:21:1::0;17244:2;17224:18;;;17217:30;17283:34;17263:18;;;17256:62;17354:34;17334:18;;;17327:62;-1:-1:-1;;;17405:19:1;;;17398:41;17456:19;;72977:145:0::1;17003:478:1::0;72977:145:0::1;73135:41;73164:4;73170:5;73135:28;:41::i;81771:121::-:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;81841:17:::1;::::0;:43:::1;::::0;-1:-1:-1;;;81841:43:0;;::::1;::::0;::::1;22475:25:1::0;;;-1:-1:-1;;;;;81841:17:0;;::::1;::::0;:34:::1;::::0;22448:18:1;;81841:43:0::1;22329:177:1::0;84451:125:0;84531:17;;:37;;;-1:-1:-1;;;84531:37:0;;;;84504:7;;-1:-1:-1;;;;;84531:17:0;;:35;;:37;;;;;;;;;;;;;;:17;:37;;;;;;;;;;37918:388;38026:4;38048:228;27246:10;38098:7;38120:145;38177:15;38120:145;;;;;;;;;;;;;;;;;27246:10;38120:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;38120:34:0;;;;;;;;;;;;:38;:145::i;81390:109::-;81462:17;;:29;;;-1:-1:-1;;;81462:29:0;;;;81435:7;;-1:-1:-1;;;;;81462:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;34997:200;35103:4;35125:42;27246:10;35149:9;35160:6;35125:9;:42::i;80734:180::-;28121:6;;80829:7;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;80861:17:::1;::::0;:45:::1;::::0;-1:-1:-1;;;80861:45:0;;-1:-1:-1;;;;;6434:32:1;;;80861:45:0::1;::::0;::::1;6416:51:1::0;80861:17:0;;::::1;::::0;:36:::1;::::0;6389:18:1;;80861:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;82986:331::-:0;83035:13;27246:10;83061:59;;;;-1:-1:-1;;;83061:59:0;;;;;;;:::i;:::-;83153:17;;-1:-1:-1;;;;;83153:17:0;:30;27246:10;83153:44;;-1:-1:-1;;;;;;83153:44:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;83153:44:0;;;6416:51:1;6389:18;;83153:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83131:107;;;;-1:-1:-1;;;83131:107:0;;;;;;;:::i;:::-;83256:17;;-1:-1:-1;;;;;83256:17:0;:39;27246:10;83296:12;27166:98;82017:120;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;82085:17:::1;::::0;:44:::1;::::0;-1:-1:-1;;;82085:44:0;;8452:14:1;;8445:22;82085:44:0::1;::::0;::::1;8427:41:1::0;-1:-1:-1;;;;;82085:17:0;;::::1;::::0;:35:::1;::::0;8400:18:1;;82085:44:0::1;8287:187:1::0;73192:141:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;73294:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;73294:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;73192:141::o;82526:123::-;82600:17;;:41;;;-1:-1:-1;;;82600:41:0;;;;82573:7;;-1:-1:-1;;;;;82600:17:0;;:39;;:41;;;;;;;;;;;;;;:17;:41;;;;;;;;;;81646:117;81722:17;;:33;;;-1:-1:-1;;;81722:33:0;;;;81695:7;;-1:-1:-1;;;;;81722:17:0;;:31;;:33;;;;;;;;;;;;;;:17;:33;;;;;;;;;;83666:334;83717:13;27246:10;83743:59;;;;-1:-1:-1;;;83743:59:0;;;;;;;:::i;:::-;83835:17;;-1:-1:-1;;;;;83835:17:0;:30;27246:10;83835:44;;-1:-1:-1;;;;;;83835:44:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;83835:44:0;;;6416:51:1;6389:18;;83835:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83813:107;;;;-1:-1:-1;;;83813:107:0;;;;;;;:::i;:::-;83938:17;;-1:-1:-1;;;;;83938:17:0;:40;27246:10;83979:12;27166:98;28854:281;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28957:22:0;::::1;28935:110;;;::::0;-1:-1:-1;;;28935:110:0;;10898:2:1;28935:110:0::1;::::0;::::1;10880:21:1::0;10937:2;10917:18;;;10910:30;10976:34;10956:18;;;10949:62;-1:-1:-1;;;11027:18:1;;;11020:36;11073:19;;28935:110:0::1;10696:402:1::0;28935:110:0::1;29082:6;::::0;29061:38:::1;::::0;-1:-1:-1;;;;;29061:38:0;;::::1;::::0;29082:6:::1;::::0;29061:38:::1;::::0;29082:6:::1;::::0;29061:38:::1;29110:6;:17:::0;;-1:-1:-1;;;;;;29110:17:0::1;-1:-1:-1::0;;;;;29110:17:0;;;::::1;::::0;;;::::1;::::0;;28854:281::o;81900:109::-;81972:17;;:29;;;-1:-1:-1;;;81972:29:0;;;;81945:7;;-1:-1:-1;;;;;81972:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;80585:141;80675:17;;:43;;-1:-1:-1;;;80675:43:0;;-1:-1:-1;;;;;6434:32:1;;;80675:43:0;;;6416:51:1;80648:7:0;;80675:17;;:34;;6389:18:1;;80675:43:0;6270:203:1;82400:118:0;82472:17;;:38;;;-1:-1:-1;;;82472:38:0;;;;82445:7;;-1:-1:-1;;;;;82472:17:0;;:36;;:38;;;;;;;;;;;;;;:17;:38;;;;;;;;;;82145:108;82215:17;;:30;;;-1:-1:-1;;;82215:30:0;;;;82191:4;;-1:-1:-1;;;;;82215:17:0;;:28;;:30;;;;;;;;;;;;;;:17;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;71149:145::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;71230:17:::1;:56:::0;;-1:-1:-1;;;;;;71230:56:0::1;-1:-1:-1::0;;;;;71230:56:0;;;::::1;::::0;;;::::1;::::0;;71149:145::o;2910:181::-;2968:7;;3000:5;3004:1;3000;:5;:::i;:::-;2988:17;;3029:1;3024;:6;;3016:46;;;;-1:-1:-1;;;3016:46:0;;11708:2:1;3016:46:0;;;11690:21:1;11747:2;11727:18;;;11720:30;11786:29;11766:18;;;11759:57;11833:18;;3016:46:0;11506:351:1;41297:380:0;-1:-1:-1;;;;;41433:19:0;;41425:68;;;;-1:-1:-1;;;41425:68:0;;20524:2:1;41425:68:0;;;20506:21:1;20563:2;20543:18;;;20536:30;20602:34;20582:18;;;20575:62;-1:-1:-1;;;20653:18:1;;;20646:34;20697:19;;41425:68:0;20322:400:1;41425:68:0;-1:-1:-1;;;;;41512:21:0;;41504:68;;;;-1:-1:-1;;;41504:68:0;;11305:2:1;41504:68:0;;;11287:21:1;11344:2;11324:18;;;11317:30;11383:34;11363:18;;;11356:62;-1:-1:-1;;;11434:18:1;;;11427:32;11476:19;;41504:68:0;11103:398:1;41504:68:0;-1:-1:-1;;;;;41585:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;41637:32;;22475:25:1;;;41637:32:0;;22448:18:1;41637:32:0;;;;;;;;41297:380;;;:::o;53570:257::-;53789:12;;-1:-1:-1;;;;;53769:16:0;;53716:7;53769:16;;;:7;:16;;;;;;53716:7;;53804:15;;53753:32;;:13;:32;:::i;:::-;53752:49;;;;:::i;:::-;:67;;;;:::i;:::-;53736:83;53570:257;-1:-1:-1;;;;53570:257:0:o;11132:391::-;11261:6;11236:21;:31;;11214:110;;;;-1:-1:-1;;;11214:110:0;;14068:2:1;11214:110:0;;;14050:21:1;14107:2;14087:18;;;14080:30;14146:31;14126:18;;;14119:59;14195:18;;11214:110:0;13866:353:1;11214:110:0;11338:12;11356:9;-1:-1:-1;;;;;11356:14:0;11378:6;11356:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11337:52;;;11422:7;11400:115;;;;-1:-1:-1;;;11400:115:0;;13226:2:1;11400:115:0;;;13208:21:1;13265:2;13245:18;;;13238:30;13304:34;13284:18;;;13277:62;13375:28;13355:18;;;13348:56;13421:19;;11400:115:0;13024:422:1;73699:445:0;-1:-1:-1;;;;;73831:18:0;;73823:68;;;;-1:-1:-1;;;73823:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;73910:16:0;;73902:64;;;;-1:-1:-1;;;73902:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;74000:20:0;;;;;;:14;:20;;;;;;;;73999:21;:44;;;;-1:-1:-1;;;;;;74025:18:0;;;;;;:14;:18;;;;;;;;74024:19;73999:44;73977:113;;;;-1:-1:-1;;;73977:113:0;;16857:2:1;73977:113:0;;;16839:21:1;16896:2;16876:18;;;16869:30;-1:-1:-1;;;16915:18:1;;;16908:49;16974:18;;73977:113:0;16655:343:1;73977:113:0;74103:33;74119:4;74125:2;74129:6;74103:15;:33::i;3813:226::-;3933:7;3969:12;3961:6;;;;3953:29;;;;-1:-1:-1;;;3953:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3993:9:0;4005:5;4009:1;4005;:5;:::i;:::-;3993:17;3813:226;-1:-1:-1;;;;;3813:226:0:o;43035:248::-;43206:58;;;-1:-1:-1;;;;;6678:32:1;;43206:58:0;;;6660:51:1;6727:18;;;;6720:34;;;43206:58:0;;;;;;;;;;6633:18:1;;;;43206:58:0;;;;;;;;-1:-1:-1;;;;;43206:58:0;-1:-1:-1;;;43206:58:0;;;43152:123;;43186:5;;43152:19;:123::i;4298:471::-;4356:7;4601:6;4597:47;;-1:-1:-1;4631:1:0;4624:8;;4597:47;4656:9;4668:5;4672:1;4668;:5;:::i;:::-;4656:17;-1:-1:-1;4701:1:0;4692:5;4696:1;4656:17;4692:5;:::i;:::-;:10;4684:56;;;;-1:-1:-1;;;4684:56:0;;19355:2:1;4684:56:0;;;19337:21:1;19394:2;19374:18;;;19367:30;19433:34;19413:18;;;19406:62;-1:-1:-1;;;19484:18:1;;;19477:31;19525:19;;4684:56:0;19153:397:1;5245:132:0;5303:7;5330:39;5334:1;5337;5330:39;;;;;;;;;;;;;;;;;:3;:39::i;74152:304::-;74262:21;74294:24;74311:6;74294:16;:24::i;:::-;74329:18;74350:46;74351:21;74378:17;74350:27;:46::i;:::-;74407:41;;74329:67;;-1:-1:-1;;;;;;74407:29:0;;;:41;;;;;74329:67;;74407:41;;;;74329:67;74407:29;:41;;;;;;;;;;;;;;;;;;;38796:610;-1:-1:-1;;;;;38936:20:0;;38928:70;;;;-1:-1:-1;;;38928:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39017:23:0;;39009:71;;;;-1:-1:-1;;;39009:71:0;;;;;;;:::i;:::-;39173:108;39209:6;39173:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39173:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;39153:17:0;;;:9;:17;;;;;;;;;;;:128;;;;39315:20;;;;;;;:32;;39340:6;39315:24;:32::i;:::-;-1:-1:-1;;;;;39292:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;39363:35;22475:25:1;;;39292:20:0;;39363:35;;;;;;22448:18:1;39363:35:0;22329:177:1;3374:136:0;3432:7;3459:43;3463:1;3466;3459:43;;;;;;;;;;;;;;;;;:3;:43::i;74464:420::-;74523:12;74538:13;:6;74549:1;74538:10;:13::i;:::-;74523:28;-1:-1:-1;74562:17:0;74582:16;:6;74523:28;74582:10;:16::i;:::-;74562:36;-1:-1:-1;74636:21:0;74670:22;74687:4;74670:16;:22::i;:::-;74705:18;74726:41;:21;74752:14;74726:25;:41::i;:::-;74705:62;;74780:35;74793:9;74804:10;74780:12;:35::i;:::-;74833:43;;;23698:25:1;;;23754:2;23739:18;;23732:34;;;23782:18;;;23775:34;;;74833:43:0;;23686:2:1;23671:18;74833:43:0;;;;;;;74512:372;;;;74464:420;:::o;74892:505::-;74982:16;;;74996:1;74982:16;;;;;;;;74958:21;;74982:16;;;;;;;;;;-1:-1:-1;74982:16:0;74958:40;;75027:4;75009;75014:1;75009:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;75009:23:0;;;:7;;;;;;;;;;:23;;;;75053:15;;:23;;;-1:-1:-1;;;75053:23:0;;;;:15;;;;;:21;;:23;;;;;75009:7;;75053:23;;;;;:15;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75043:4;75048:1;75043:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;75043:33:0;;;:7;;;;;;;;;:33;75121:15;;75089:62;;75106:4;;75121:15;75139:11;75089:8;:62::i;:::-;75164:15;;:225;;-1:-1:-1;;;75164:225:0;;-1:-1:-1;;;;;75164:15:0;;;;:67;;:225;;75246:11;;75164:15;;75316:4;;75343;;75363:15;;75164:225;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74947:450;74892:505;:::o;73341:350::-;-1:-1:-1;;;;;73446:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;73424:151;;;;-1:-1:-1;;;73424:151:0;;16427:2:1;73424:151:0;;;16409:21:1;16466:2;16446:18;;;16439:30;16505:34;16485:18;;;16478:62;16576:31;16556:18;;;16549:59;16625:19;;73424:151:0;16225:425:1;73424:151:0;-1:-1:-1;;;;;73586:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;73586:39:0;;;;;;;;;;73643:40;;73586:39;;:31;73643:40;;;73341:350;;:::o;45950:802::-;46374:23;46400:106;46442:4;46400:106;;;;;;;;;;;;;;;;;46408:5;-1:-1:-1;;;;;46400:27:0;;;:106;;;;;:::i;:::-;46521:17;;46374:132;;-1:-1:-1;46521:21:0;46517:228;;46636:10;46625:30;;;;;;;;;;;;:::i;:::-;46599:134;;;;-1:-1:-1;;;46599:134:0;;21287:2:1;46599:134:0;;;21269:21:1;21326:2;21306:18;;;21299:30;21365:34;21345:18;;;21338:62;-1:-1:-1;;;21416:18:1;;;21409:40;21466:19;;46599:134:0;21085:406:1;5873:312:0;5993:7;6028:12;6021:5;6013:28;;;;-1:-1:-1;;;6013:28:0;;;;;;;;:::i;:::-;-1:-1:-1;6052:9:0;6064:5;6068:1;6064;:5;:::i;75405:517::-;75585:15;;75553:62;;75570:4;;-1:-1:-1;;;;;75585:15:0;75603:11;75553:8;:62::i;:::-;75658:15;;:256;;-1:-1:-1;;;75658:256:0;;75731:4;75658:256;;;8016:34:1;8066:18;;;8059:34;;;75658:15:0;8109:18:1;;;8102:34;;;8152:18;;;8145:34;;;8195:19;;;8188:44;75888:15:0;8248:19:1;;;8241:35;-1:-1:-1;;;;;75658:15:0;;;;:32;;75698:9;;7950:19:1;;75658:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12546:229::-;12683:12;12715:52;12737:6;12745:4;12751:1;12754:12;12683;10295:20;;14062:60;;;;-1:-1:-1;;;14062:60:0;;20929:2:1;14062:60:0;;;20911:21:1;20968:2;20948:18;;;20941:30;21007:31;20987:18;;;20980:59;21056:18;;14062:60:0;20727:353:1;14062:60:0;14136:12;14150:23;14177:6;-1:-1:-1;;;;;14177:11:0;14196:5;14217:4;14177:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14135:97;;;;14250:51;14267:7;14276:10;14288:12;14250:16;:51::i;:::-;14243:58;13738:571;-1:-1:-1;;;;;;;13738:571:0:o;16638:712::-;16788:12;16817:7;16813:530;;;-1:-1:-1;16848:10:0;16841:17;;16813:530;16962:17;;:21;16958:374;;17160:10;17154:17;17221:15;17208:10;17204:2;17200:19;17193:44;16958:374;17303:12;17296:20;;-1:-1:-1;;;17296:20:0;;;;;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;782:388::-;850:6;858;911:2;899:9;890:7;886:23;882:32;879:52;;;927:1;924;917:12;879:52;966:9;953:23;985:31;1010:5;985:31;:::i;:::-;1035:5;-1:-1:-1;1092:2:1;1077:18;;1064:32;1105:33;1064:32;1105:33;:::i;:::-;1157:7;1147:17;;;782:388;;;;;:::o;1175:456::-;1252:6;1260;1268;1321:2;1309:9;1300:7;1296:23;1292:32;1289:52;;;1337:1;1334;1327:12;1289:52;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1175:456;;1567:7;;-1:-1:-1;;;1621:2:1;1606:18;;;;1593:32;;1175:456::o;1636:382::-;1701:6;1709;1762:2;1750:9;1741:7;1737:23;1733:32;1730:52;;;1778:1;1775;1768:12;1730:52;1817:9;1804:23;1836:31;1861:5;1836:31;:::i;:::-;1886:5;-1:-1:-1;1943:2:1;1928:18;;1915:32;1956:30;1915:32;1956:30;:::i;2023:315::-;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:1:o;2343:241::-;2399:6;2452:2;2440:9;2431:7;2427:23;2423:32;2420:52;;;2468:1;2465;2458:12;2420:52;2507:9;2494:23;2526:28;2548:5;2526:28;:::i;2589:245::-;2656:6;2709:2;2697:9;2688:7;2684:23;2680:32;2677:52;;;2725:1;2722;2715:12;2677:52;2757:9;2751:16;2776:28;2798:5;2776:28;:::i;3514:673::-;3583:6;3636:2;3624:9;3615:7;3611:23;3607:32;3604:52;;;3652:1;3649;3642:12;3604:52;3692:9;3679:23;3725:18;3717:6;3714:30;3711:50;;;3757:1;3754;3747:12;3711:50;3780:22;;3833:4;3825:13;;3821:27;-1:-1:-1;3811:55:1;;3862:1;3859;3852:12;3811:55;3898:2;3885:16;3923:49;3939:32;3968:2;3939:32;:::i;:::-;3923:49;:::i;:::-;3995:2;3988:5;3981:17;4035:7;4030:2;4025;4021;4017:11;4013:20;4010:33;4007:53;;;4056:1;4053;4046:12;4007:53;4111:2;4106;4102;4098:11;4093:2;4086:5;4082:14;4069:45;4155:1;4134:14;;;4150:2;4130:23;4123:34;;;;4138:5;3514:673;-1:-1:-1;;;;3514:673:1:o;4192:636::-;4272:6;4325:2;4313:9;4304:7;4300:23;4296:32;4293:52;;;4341:1;4338;4331:12;4293:52;4374:9;4368:16;4407:18;4399:6;4396:30;4393:50;;;4439:1;4436;4429:12;4393:50;4462:22;;4515:4;4507:13;;4503:27;-1:-1:-1;4493:55:1;;4544:1;4541;4534:12;4493:55;4573:2;4567:9;4598:49;4614:32;4643:2;4614:32;:::i;4598:49::-;4670:2;4663:5;4656:17;4710:7;4705:2;4700;4696;4692:11;4688:20;4685:33;4682:53;;;4731:1;4728;4721:12;4682:53;4744:54;4795:2;4790;4783:5;4779:14;4774:2;4770;4766:11;4744:54;:::i;4833:180::-;4892:6;4945:2;4933:9;4924:7;4920:23;4916:32;4913:52;;;4961:1;4958;4951:12;4913:52;-1:-1:-1;4984:23:1;;4833:180;-1:-1:-1;4833:180:1:o;5018:184::-;5088:6;5141:2;5129:9;5120:7;5116:23;5112:32;5109:52;;;5157:1;5154;5147:12;5109:52;-1:-1:-1;5180:16:1;;5018:184;-1:-1:-1;5018:184:1:o;5207:306::-;5295:6;5303;5311;5364:2;5352:9;5343:7;5339:23;5335:32;5332:52;;;5380:1;5377;5370:12;5332:52;5409:9;5403:16;5393:26;;5459:2;5448:9;5444:18;5438:25;5428:35;;5503:2;5492:9;5488:18;5482:25;5472:35;;5207:306;;;;;:::o;5518:258::-;5560:3;5598:5;5592:12;5625:6;5620:3;5613:19;5641:63;5697:6;5690:4;5685:3;5681:14;5674:4;5667:5;5663:16;5641:63;:::i;:::-;5758:2;5737:15;-1:-1:-1;;5733:29:1;5724:39;;;;5765:4;5720:50;;5518:258;-1:-1:-1;;5518:258:1:o;5781:274::-;5910:3;5948:6;5942:13;5964:53;6010:6;6005:3;5998:4;5990:6;5986:17;5964:53;:::i;:::-;6033:16;;;;;5781:274;-1:-1:-1;;5781:274:1:o;7074:317::-;-1:-1:-1;;;;;7251:32:1;;7233:51;;7320:2;7315;7300:18;;7293:30;;;-1:-1:-1;;7340:45:1;;7366:18;;7358:6;7340:45;:::i;8945:220::-;9094:2;9083:9;9076:21;9057:4;9114:45;9155:2;9144:9;9140:18;9132:6;9114:45;:::i;9589:399::-;9791:2;9773:21;;;9830:2;9810:18;;;9803:30;9869:34;9864:2;9849:18;;9842:62;-1:-1:-1;;;9935:2:1;9920:18;;9913:33;9978:3;9963:19;;9589:399::o;9993:337::-;10195:2;10177:21;;;10234:2;10214:18;;;10207:30;-1:-1:-1;;;10268:2:1;10253:18;;10246:43;10321:2;10306:18;;9993:337::o;12268:344::-;12470:2;12452:21;;;12509:2;12489:18;;;12482:30;-1:-1:-1;;;12543:2:1;12528:18;;12521:50;12603:2;12588:18;;12268:344::o;12617:402::-;12819:2;12801:21;;;12858:2;12838:18;;;12831:30;12897:34;12892:2;12877:18;;12870:62;-1:-1:-1;;;12963:2:1;12948:18;;12941:36;13009:3;12994:19;;12617:402::o;14631:407::-;14833:2;14815:21;;;14872:2;14852:18;;;14845:30;14911:34;14906:2;14891:18;;14884:62;-1:-1:-1;;;14977:2:1;14962:18;;14955:41;15028:3;15013:19;;14631:407::o;19555:356::-;19757:2;19739:21;;;19776:18;;;19769:30;19835:34;19830:2;19815:18;;19808:62;19902:2;19887:18;;19555:356::o;19916:401::-;20118:2;20100:21;;;20157:2;20137:18;;;20130:30;20196:34;20191:2;20176:18;;20169:62;-1:-1:-1;;;20262:2:1;20247:18;;20240:35;20307:3;20292:19;;19916:401::o;22511:980::-;22773:4;22821:3;22810:9;22806:19;22852:6;22841:9;22834:25;22878:2;22916:6;22911:2;22900:9;22896:18;22889:34;22959:3;22954:2;22943:9;22939:18;22932:31;22983:6;23018;23012:13;23049:6;23041;23034:22;23087:3;23076:9;23072:19;23065:26;;23126:2;23118:6;23114:15;23100:29;;23147:1;23157:195;23171:6;23168:1;23165:13;23157:195;;;23236:13;;-1:-1:-1;;;;;23232:39:1;23220:52;;23327:15;;;;23292:12;;;;23268:1;23186:9;23157:195;;;-1:-1:-1;;;;;;;23408:32:1;;;;23403:2;23388:18;;23381:60;-1:-1:-1;;;23472:3:1;23457:19;23450:35;23369:3;22511:980;-1:-1:-1;;;22511:980:1:o;24009:275::-;24080:2;24074:9;24145:2;24126:13;;-1:-1:-1;;24122:27:1;24110:40;;24180:18;24165:34;;24201:22;;;24162:62;24159:88;;;24227:18;;:::i;:::-;24263:2;24256:22;24009:275;;-1:-1:-1;24009:275:1:o;24289:187::-;24338:4;24371:18;24363:6;24360:30;24357:56;;;24393:18;;:::i;:::-;-1:-1:-1;24459:2:1;24438:15;-1:-1:-1;;24434:29:1;24465:4;24430:40;;24289:187::o;24481:128::-;24521:3;24552:1;24548:6;24545:1;24542:13;24539:39;;;24558:18;;:::i;:::-;-1:-1:-1;24594:9:1;;24481:128::o;24614:217::-;24654:1;24680;24670:132;;24724:10;24719:3;24715:20;24712:1;24705:31;24759:4;24756:1;24749:15;24787:4;24784:1;24777:15;24670:132;-1:-1:-1;24816:9:1;;24614:217::o;24836:168::-;24876:7;24942:1;24938;24934:6;24930:14;24927:1;24924:21;24919:1;24912:9;24905:17;24901:45;24898:71;;;24949:18;;:::i;:::-;-1:-1:-1;24989:9:1;;24836:168::o;25009:125::-;25049:4;25077:1;25074;25071:8;25068:34;;;25082:18;;:::i;:::-;-1:-1:-1;25119:9:1;;25009:125::o;25139:258::-;25211:1;25221:113;25235:6;25232:1;25229:13;25221:113;;;25311:11;;;25305:18;25292:11;;;25285:39;25257:2;25250:10;25221:113;;;25352:6;25349:1;25346:13;25343:48;;;-1:-1:-1;;25387:1:1;25369:16;;25362:27;25139:258::o;25402:380::-;25481:1;25477:12;;;;25524;;;25545:61;;25599:4;25591:6;25587:17;25577:27;;25545:61;25652:2;25644:6;25641:14;25621:18;25618:38;25615:161;;;25698:10;25693:3;25689:20;25686:1;25679:31;25733:4;25730:1;25723:15;25761:4;25758:1;25751:15;25615:161;;25402:380;;;:::o;25787:127::-;25848:10;25843:3;25839:20;25836:1;25829:31;25879:4;25876:1;25869:15;25903:4;25900:1;25893:15;25919:127;25980:10;25975:3;25971:20;25968:1;25961:31;26011:4;26008:1;26001:15;26035:4;26032:1;26025:15;26051:127;26112:10;26107:3;26103:20;26100:1;26093:31;26143:4;26140:1;26133:15;26167:4;26164:1;26157:15;26183:131;-1:-1:-1;;;;;26258:31:1;;26248:42;;26238:70;;26304:1;26301;26294:12;26238:70;26183:131;:::o;26319:118::-;26405:5;26398:13;26391:21;26384:5;26381:32;26371:60;;26427:1;26424;26417:12

Swarm Source

ipfs://10bab493d99aee04215b6b672f29af3c45a9ac3fbb800e28a9cc439482ab7c2c

Block Transaction Gas Used Reward
view all blocks ##produced##

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading

OVERVIEW

Thor has been designed to open the doors of DeFi to anyone, through a multi-chain Yield Processing Node.

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.