Contract 0xad7ae11c82a89cd8f262710eb18a6213464ebca3

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x02c0a69a28a5a757ed545916c075274bab122b2b4208f9875dbb96ad6f192f3bBatch Trade293990602022-11-29 13:09:32116 days 13 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308150012.250000018
0x7fed26e47160ea00f122062185552e2d7b56d19c6607c6e884ec9632e72333e2Batch Trade293989992022-11-29 13:04:26116 days 18 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000015
0x798118c1806cbc7f827b54789f84e60db7a15ef68fd86a8a634aaf2f753106f6Batch Trade293989392022-11-29 12:59:25116 days 23 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000013
0x7190651dddff87c20c6df74596ed6f4c92c380637ee52f8df3a867a19ab09c95Batch Trade293988792022-11-29 12:54:24116 days 28 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000013
0xe87f5454ad310f5e9056864081ff4978722e0c248323ec56c78852c2d3f4c6ccBatch Trade293988192022-11-29 12:49:23116 days 33 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000015
0x1295bddb402be69630bdb175921bbf1a10032c62723fa32cc3b555ab60063a16Batch Trade293987592022-11-29 12:44:22116 days 38 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000013
0x78ea2e6c4a80cb9b12c932d4e379ca798ffd019b9140107ef1bfefd1f9d64336Batch Trade293986992022-11-29 12:39:21116 days 43 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000012
0x56bbc8266e461420f79698e1c11421f8308c56767bb710c477c6e7667550f805Batch Trade293986392022-11-29 12:34:20116 days 48 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000013
0x7038b409b57d6ab771eded6fe7ece5b0000d40034ab30b30ccf4c83c3c5ebcb2Batch Trade293985792022-11-29 12:29:19116 days 53 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000015
0xa062253fa12f70598112ab861b70426e8ee82fa08a0b02faa0548572b4c1b259Batch Trade293985192022-11-29 12:24:18116 days 58 mins ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000015
0x8835cf9869590ad71cf4dd2ec1670679622b99f7e91f7809cfc22914a266bffaBatch Trade293984592022-11-29 12:19:17116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000015
0x24800ef4940e74bcc49cf637582be5b83009a0b5a07d5c6aeac25c177c516573Batch Trade293983992022-11-29 12:14:16116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000016
0x55108f46bf266a3926651b4129279885c254e3ce3443739e9c12e05af45f9acfBatch Trade293983392022-11-29 12:09:16116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000015
0xf0fdab187edae175c4ac75c024ec19fe64bb2e5d63794ce82d4a417d9371b8b7Batch Trade293982792022-11-29 12:04:15116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000013
0xd4513370016b811fd3d2c6b2482002543cde98f62278025a8ac716400c5090d7Batch Trade293982192022-11-29 11:59:14116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000012
0xb23d39ccb01bac8b1dfd96f6091d3213ecc653f6180f15d5d78dd8f4ff5933bcBatch Trade293981592022-11-29 11:54:13116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000013
0x6d5ca937f392c9147c6ac485b197fa9a4433520f349db2a0e4ce04cac27eaa31Batch Trade293980992022-11-29 11:49:12116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000012
0x90cc6599d2b36e7eb7e5c33827fabb8dd9919d7da26dba306b4e10daf43bb518Batch Trade293980402022-11-29 11:44:16116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000015
0x5db861fc165d87f363f71dbbcca11c0f4b2f5168549d367661645d3d443d4265Batch Trade293979802022-11-29 11:39:15116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000012
0x2a032772fcb43b6209fddd019c77b3702d29c6564724063e064b6807b00688efBatch Trade293979192022-11-29 11:34:09116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000015
0xcb05e737d35cb391d58f6c7fcdb27b334b928b56c0dfc9b68f7c9f9f253a1c2dBatch Trade293978592022-11-29 11:29:08116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000012
0xfc37075e5185af91a63a6f82cabb890d3bde6aa32e458583ecc86baba62d575cBatch Trade293977992022-11-29 11:24:07116 days 1 hr ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000012
0x941b17fc142ac156b6b89b5bc07a22baa56bb36a31d4cbafe7634a21704e22d3Batch Trade293977392022-11-29 11:19:06116 days 2 hrs ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000012
0xab645c279e950d225ef865b05a2ac8d3e40fecb73360049e9270e3f6c0830800Batch Trade293976792022-11-29 11:14:05116 days 2 hrs ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000012
0x42aff57725d3363cb780de5d53a225b92c28cf70ae1b611328442ac6edd166bbBatch Trade293976192022-11-29 11:09:04116 days 2 hrs ago0x82ecf0843e4dae55fdc7748c73913a8f10abc939 IN  0xad7ae11c82a89cd8f262710eb18a6213464ebca30 MATIC0.0001308152.250000013
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DexilonTest_v12

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-07-04
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

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

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

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

    function decimals() external view returns (uint16);

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

/**
 * @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
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return 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);
            }
        }
    }
}

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

/**
 * @dev Partial interface for a Chainlink Aggregator.
 */
interface AggregatorV3Interface {
    // latestRoundData should raise "No data present"
    // if he do not have data to report, instead of returning unset values
    // which could be misinterpreted as actual reported values.
    function latestRoundData()
        external
        view
        returns (
            uint160 roundId,
            int answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint160 answeredInRound
        );
}

contract DexilonTest_v12 {
    using SafeERC20 for IERC20;
    
    struct userAssetParameters {
        string assetName;
        int256 assetBalance;
        uint256 assetLockedBalance;
        uint256 assetPrice;
        uint256 assetLeverage;
    }

    struct tradingArrayIndexed {
        bool isBuy;
        uint32 makerIndex;
        uint32 takerIndex;
        uint32 assetIndex;
        uint256 assetAmount;
        uint256 assetRate;
        uint256 tradeFee;
        uint16 makerLeverage;
        uint16 takerLeverage;
        string tradeId;
    }

    struct tradingArray {
        bool isBuy;
        address makerAddress;
        address takerAddress;
        string assetName;
        uint256 assetAmount;
        uint256 assetRate;
        uint256 tradeFee;
        uint16 makerLeverage;
        uint16 takerLeverage;
        string tradeId;
    }

    struct FeesArray {
        address userAddress;
        int feeAmount;
    }

    mapping(address => uint256) internal usersAvailableBalances;
    mapping(address => mapping (string => userAssetParameters)) internal usersAssetsData;
    
    mapping(address => uint256) public usersIndex;
    mapping(uint256 => address) public indexedAddresses;
    
    mapping(string => bool) internal checkAsset;

    uint256 public usersCount;
    string[] internal assetsNames;
    
    address payable public owner;
    
    
    event Deposit(
        address indexed depositor,
        uint256 amountUSDC,
        uint256 timestamp
    );
    
    event Withdraw(
        address indexed user,
        uint256 amountUSDC,
        uint256 timestamp
    );
    
    event Trade(
        bool isBuy,
        address indexed maker,
        address indexed taker,
        string asset,
        uint256 assetAmount,
        uint256 assetRate,
        uint256 tradeFee,
        uint16 makerLeverage,
        uint16 takerLeverage,
        string tradeId,
        uint256 timestamp
    );
    
    uint8 internal constant DECIMALS_USDC = 6;
    uint8 internal constant DECIMALS_ETH = 18;
    
    int internal constant ETH_UNIT_FACTOR = int(10**DECIMALS_ETH);
    int internal constant ROUNDING_FACTOR = int(10**(DECIMALS_ETH-DECIMALS_USDC));
    
    // Chainlink price feed for ETH/USD
    AggregatorV3Interface internal btcToUsdPriceFeed = AggregatorV3Interface(0x007A22900a3B98143368Bd5906f8E17e9867581b);
    // Chainlink price feed for USDC/USD
    AggregatorV3Interface internal usdcToUsdPriceFeed = AggregatorV3Interface(0x572dDec9087154dC5dfBB1546Bb62713147e0Ab0);
    
    // USDC test token (Mumbai Testnet)
    IERC20 internal depositToken = IERC20(0x7592A72A46D3165Dcc7BF0802D70812Af19471B3); 
    
    constructor(address USDC_address) {
        owner = payable(msg.sender);
        // Base stable coin
        depositToken = IERC20(USDC_address);
        // Supported assets
        assetsNames = ['BTC', 'ETH', 'SOL', 'ADA', 'NEAR', 'MATIC', 'LUNA', 'DOGE'];
        
        for (uint16 i=0; i<assetsNames.length; i++) {
            checkAsset[assetsNames[i]] = true;
        }
        // Initiating user index
        usersIndex[owner] = 0;
        indexedAddresses[0] = owner;
        usersCount = 1;
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

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

    /**
     * @dev Add new assets to supported names.
     * Can only be called by the current owner.
     */
    function addNewSupportedAsset(string memory _newAssetName) public onlyOwner returns (bool) {

        require(checkAsset[_newAssetName] == false, "Asset already exists!");

        assetsNames.push(_newAssetName);
        checkAsset[_newAssetName] = true;
        return true;
    }

    /**
    * @notice Convert btc to usdc by Chainlink market price
    */
    function btcToUsdcMarketConvert(int assetAmount) public view returns (int) {
        (, int signedBtcToUsdPrice, , , ) = btcToUsdPriceFeed.latestRoundData();
        (, int signedUsdcToUsdPrice, , , ) = usdcToUsdPriceFeed.latestRoundData();
        
        return (signedBtcToUsdPrice*assetAmount/signedUsdcToUsdPrice)/int(10**(DECIMALS_ETH - DECIMALS_USDC));
    }

    /**
     * @dev Deposit token into contract and open user account
     * @param amountUSDC Amount of token in smallest units
     */
    function deposit(uint256 amountUSDC) public {
        depositToken.safeTransferFrom(msg.sender, address(this), amountUSDC);
        
        usersAvailableBalances[msg.sender] += amountUSDC * uint(ROUNDING_FACTOR);

        /// indexing users
        if (usersIndex[msg.sender] == 0 && msg.sender != owner) {
            usersIndex[msg.sender] = usersCount;
            indexedAddresses[usersCount] = msg.sender;
            usersCount += 1;
        }

        emit Deposit(msg.sender, amountUSDC, block.timestamp);
    }
    

    /**
     * @dev Read all balances for the user
     * @param user Address of the user is the id of account
     */
    function getUserBalances(address user) public view 
        returns (uint256 , uint256 , userAssetParameters[] memory ) 
    {
        uint256 availableBalance = usersAvailableBalances[user] / uint(ROUNDING_FACTOR);
        uint256 lockedBalance;

        userAssetParameters[] memory userAssets = new userAssetParameters[](assetsNames.length);

        for (uint256 i=0; i < assetsNames.length; i++) {
            userAssets[i] = _setOutputDecimalsForAsset(assetsNames[i], usersAssetsData[user][assetsNames[i]]);
            lockedBalance += userAssets[i].assetLockedBalance;
        }
        // rounding error correction
        if (lockedBalance % 10 !=0){
            lockedBalance += 10 - lockedBalance % 10;
        }
        
        return (availableBalance, lockedBalance, userAssets);

    }

    /**
     * @dev convert locked balance and asset price to USDC decimals
     * @param assetData struct userAssetParameters for current asset of the user
     */
    function _setOutputDecimalsForAsset(string memory assetName, userAssetParameters memory assetData) internal pure returns (userAssetParameters memory assetDataModified) {
        // struct userAssetParameters {
        // 0 string assetName;
        // 1 int256 assetBalance;
        // 2 uint256 assetLockedBalance;
        // 3 uint256 assetPrice;
        // 4 uint16 assetLeverage; }
        assetDataModified.assetName = assetName;
        assetDataModified.assetBalance = assetData.assetBalance; // ETH decimals

        // assetDataModified.assetLockedBalance = assetData.assetLockedBalance / uint(ROUNDING_FACTOR); // USDC decimals
        if (assetData.assetLeverage !=0) {
            assetDataModified.assetLockedBalance = (uint(abs(assetData.assetBalance)) * assetData.assetPrice / 
            assetData.assetLeverage) / uint(ETH_UNIT_FACTOR * ROUNDING_FACTOR); // USDC decimals
        } 


        assetDataModified.assetPrice = assetData.assetPrice / uint(ROUNDING_FACTOR); // USDC decimals
        assetDataModified.assetLeverage = assetData.assetLeverage; 
    }

    /**
     * @dev transfer amount to the user
     * @param userAddress transfer to this address 
     * @param amountUSDC amount of the deposited token in smallest units
     */
    function withdraw(address userAddress, uint256 amountUSDC) public onlyOwner {
        
        require(usersAvailableBalances[userAddress] >= amountUSDC * uint(ROUNDING_FACTOR), 'Insufficient balance!');

        depositToken.safeTransfer(userAddress, amountUSDC);
        usersAvailableBalances[userAddress] -= amountUSDC * uint(ROUNDING_FACTOR);
        
        emit Withdraw(userAddress, amountUSDC, block.timestamp);
    }

    /// @dev development ONLY
    function withdrawAll() public onlyOwner {
        depositToken.safeTransfer(owner, depositToken.balanceOf(address(this)));
        
        if (address(this).balance > 0) {
            owner.transfer(address(this).balance);
        }
    }

    /// @dev development ONLY
    function resetUserAccount(address userAddress, 
                              uint256 userAvailableBalance,
                              uint256 userLockedBalance,
                              string memory asset,
                              int256 userAssetBalance,
                              uint16 leverage) public onlyOwner {
        usersAvailableBalances[userAddress] = userAvailableBalance;
        
        userAssetParameters memory zeroParameters;
        zeroParameters.assetName = '';
        zeroParameters.assetBalance = 0;
        zeroParameters.assetLockedBalance = 0;
        zeroParameters.assetPrice = 0;
        zeroParameters.assetLeverage = 1;

        for (uint16 i=0; i<assetsNames.length; i++) {
            usersAssetsData[userAddress][assetsNames[i]] = zeroParameters;
            usersAssetsData[userAddress][assetsNames[i]].assetLeverage = leverage;
        }

        usersAssetsData[userAddress][asset].assetBalance = userAssetBalance;
        usersAssetsData[userAddress][asset].assetLockedBalance = userLockedBalance;
        if (userAssetBalance != 0){
            usersAssetsData[userAddress][asset].assetPrice = uint((int(userLockedBalance * leverage)  * ETH_UNIT_FACTOR) / 
            abs(userAssetBalance));}

    }
       
    /**
    * @dev trade between a maker and a taker
    * @param isBuy true if this is a buy order trade, false if a sell order trade
    * @param maker the address of the user who created the order
    * @param taker the address of the user who accepted the order
    * @param asset string id of the supported asset ('ETH','ETH','XRP','SOL')
    * @param assetAmount the amount of the asset in Wei (smallest unit)
    * @param assetRate price of 1 asset coin in the smallest unit of USDC
    * @param tradeFee absolute fee amount in the smallest unit of USDC from taker to maker
    * @param makerLeverage leverage of the maker for the asset
    * @param takerLeverage leverage of the taker for the asset
    * @param tradeId incoming id of the trade as as string
    **/
    function trade(
        bool isBuy,
        address maker,
        address taker,
        string memory asset,
        uint256 assetAmount,
        uint256 assetRate,
        uint256 tradeFee,
        uint16 makerLeverage,
        uint16 takerLeverage,
        string memory tradeId
    ) public onlyOwner {
        
        require(checkAsset[asset], string(abi.encodePacked('Unknown Asset! TradeId:', tradeId)));

        updateUserLeverage(maker, asset, makerLeverage, tradeId);
        updateUserLeverage(taker, asset, takerLeverage, tradeId);
        
        updateUserBalances(maker, asset, (isBuy ? int(1) : int(-1))*int(assetAmount), int(assetRate), int(tradeFee), tradeId);
        updateUserBalances(taker, asset, (isBuy ? int(-1) : int(1))*int(assetAmount), int(assetRate), -int(tradeFee), tradeId);
        
        emit Trade(isBuy, maker, taker, asset, assetAmount, assetRate, tradeFee, makerLeverage, takerLeverage, tradeId, block.timestamp);
    }
    
    /**
    * @dev update the balances of one of the traders
    * @param user user address whose balances are updated
    * @param asset string id of the supported asset ('ETH','ETH','XRP','SOL')
    * @param assetAmount the amount of the asset in Wei (smallest unit)
    * @param assetRate price of 1 asset coin in the smallest unit of USDC
    * @param tradeFee absolute fee amount in the smallest unit of USDC
    * @param tradeId incoming id of the trade as as string
    **/
    function updateUserBalances(
        address user,
        string memory asset,
        int assetAmount,
        int assetRate,
        int tradeFee,
        string memory tradeId
    ) internal {
        int assetBalance = usersAssetsData[user][asset].assetBalance;
        int assetPrice = int(usersAssetsData[user][asset].assetPrice);
        int leverage = int(uint256(usersAssetsData[user][asset].assetLeverage)) * ETH_UNIT_FACTOR;
        int availableBalance = int(usersAvailableBalances[user]) + tradeFee * ROUNDING_FACTOR;
        // int lockedBalance = int(usersAssetsData[user][asset].assetLockedBalance);
        int lockedBalance = ((abs(assetBalance)) * assetPrice / leverage);

        assetRate = assetRate * ROUNDING_FACTOR;

        require(assetRate > 0, string(abi.encodePacked('Zero Rate! TradeId:', tradeId)));
        
        if (((assetAmount > 0 && assetBalance < 0) || 
              (assetAmount < 0 && assetBalance > 0)) &&
                abs(assetAmount) > abs(assetBalance)) {
            
            availableBalance = availableBalance  
                + abs(assetBalance)*assetPrice/(leverage) 
                - assetBalance*(assetPrice - assetRate)/(ETH_UNIT_FACTOR);
            lockedBalance = lockedBalance - abs(assetBalance*assetPrice/(leverage));
            assetAmount = assetAmount + assetBalance;
            assetBalance = 0;
        }
        
                
        if (assetBalance == 0  
                || (assetBalance < 0 && assetAmount < 0) 
                || (assetBalance > 0 && assetAmount > 0)) {

            availableBalance = availableBalance
                - abs(assetAmount*assetRate/(leverage));
            lockedBalance = lockedBalance + abs(assetAmount*assetRate/(leverage));
            assetPrice = (assetBalance*assetPrice + assetAmount*assetRate) / (assetBalance + assetAmount);

        } else {
            // (assetBalance > 0 && assetAmount < 0)
            // (assetBalance < 0 && assetAmount > 0)
            availableBalance = availableBalance 
                + abs(assetAmount)*assetPrice/(leverage)
                + assetAmount*(assetPrice - assetRate)/(ETH_UNIT_FACTOR);
            lockedBalance = lockedBalance - abs(assetAmount*assetPrice/(leverage));
        }
        
        require(availableBalance >= 0, string(abi.encodePacked('Insufficient balance! TradeId:', tradeId)));
        require(lockedBalance >= 0, string(abi.encodePacked('LockedBalance < 0! TradeId:', tradeId)));
        
        usersAvailableBalances[user] = uint256(availableBalance);
        // usersAssetsData[user][asset].assetLockedBalance = uint256(lockedBalance);
        usersAssetsData[user][asset].assetPrice = uint256(assetPrice);
        usersAssetsData[user][asset].assetBalance = assetBalance + assetAmount;
    }

    /**
    * @dev update available balance and asset locked balance for new leverage
    * @param user user address whose balances are updated
    * @param asset string id of the supported asset ('ETH','ETH','XRP','SOL')
    * @param assetLeverage leverage of the user for the asset
    * @param tradeId incoming id of the trade as as string
    **/
    function updateUserLeverage(
        address user,
        string memory asset,
        uint16 assetLeverage,
        string memory tradeId
    ) internal {

        int lockedBalance;
        int newLockedBalance;
        int newAvailableBalance;  
                
        require(assetLeverage > 0, string(abi.encodePacked('Zero Leverage! TradeId:', tradeId)));

        if (usersAssetsData[user][asset].assetBalance == 0) {
            usersAssetsData[user][asset].assetLeverage = assetLeverage;
        }


        if (usersAssetsData[user][asset].assetLeverage != assetLeverage){

            lockedBalance = ((int(usersAssetsData[user][asset].assetPrice) 
                * abs(int(usersAssetsData[user][asset].assetBalance))) 
                / int(usersAssetsData[user][asset].assetLeverage));
            newLockedBalance = ((int(usersAssetsData[user][asset].assetPrice) 
                * abs(int(usersAssetsData[user][asset].assetBalance))) 
                / int(uint256(assetLeverage)));
                
            newAvailableBalance = int(usersAvailableBalances[user]) 
                - (newLockedBalance - lockedBalance) / ETH_UNIT_FACTOR;

            require(newAvailableBalance >= 0, string(abi.encodePacked('Insufficient balance! TradeId:', tradeId))); 

            usersAvailableBalances[user] = uint256(newAvailableBalance);
            // usersAssetsData[user][asset].assetLockedBalance = uint256(newLockedBalance);
            usersAssetsData[user][asset].assetLeverage = assetLeverage;
        }
    }

    // struct tradingArrayIndexed {
    //     bool isBuy;
    //     uint32 makerIndex;
    //     uint32 takerIndex;
    //     uint32 assetIndex;
    //     uint256 assetAmount;
    //     uint256 assetRate;
    //     uint256 tradeFee;
    //     uint16 makerLeverage;
    //     uint16 takerLeverage;
    //     string tradeId;
    // } 

    /**
    * @dev Batch trading with indexes for users
    * @param batchTradingArray array of structs tradingArrayIndexed
    **/
    function batchTradeIndexed(tradingArrayIndexed[] memory batchTradingArray) public onlyOwner {

        uint256 max = batchTradingArray.length;

        for (uint256 i=0; i < max; i++) {
            trade(
                batchTradingArray[i].isBuy,
                indexedAddresses[batchTradingArray[i].makerIndex],
                indexedAddresses[batchTradingArray[i].takerIndex],
                assetsNames[batchTradingArray[i].assetIndex],
                batchTradingArray[i].assetAmount,
                batchTradingArray[i].assetRate,
                batchTradingArray[i].tradeFee,
                batchTradingArray[i].makerLeverage,
                batchTradingArray[i].takerLeverage,
                batchTradingArray[i].tradeId
                );
        }
    }

    // struct tradingArray {
    //     bool isBuy;
    //     address makerAddress;
    //     address takerAddress;
    //     string assetName;
    //     uint256 assetAmount;
    //     uint256 assetRate;
    //     uint256 tradeFee;
    //     uint16 makerLeverage;
    //     uint16 takerLeverage;
    //     string tradeId;
    // }
    /**
    * @dev Batch trading with addresses
    * @param batchTradingArray array of structs tradingArray
    **/
    function batchTrade(tradingArray[] memory batchTradingArray) public onlyOwner {

        uint256 max = batchTradingArray.length;

        for (uint256 i=0; i < max; i++) {
            trade(
                batchTradingArray[i].isBuy,
                batchTradingArray[i].makerAddress,
                batchTradingArray[i].takerAddress,
                batchTradingArray[i].assetName,
                batchTradingArray[i].assetAmount,
                batchTradingArray[i].assetRate,
                batchTradingArray[i].tradeFee,
                batchTradingArray[i].makerLeverage,
                batchTradingArray[i].takerLeverage,
                batchTradingArray[i].tradeId
                );
        }
    }

    /**
    * @notice Batch pay funding rate fees
    * @dev feeAmount should have 18 decimals
    * @param batchFees array of structs feesArray (userAddress, feeAmount)
    **/
    function batchFundingRateFees(FeesArray[] memory batchFees) public onlyOwner {

        uint256 max = batchFees.length;

        for (uint256 i=0; i < max; i++) {
            if (batchFees[i].feeAmount < 0 ) {
                // negative fee
                if (usersAvailableBalances[batchFees[i].userAddress] >= uint(-batchFees[i].feeAmount)) {
                    // enough available to pay fee
                    usersAvailableBalances[batchFees[i].userAddress] -= uint(-batchFees[i].feeAmount);
                } else {
                    // not enough available to pay fee
                    usersAvailableBalances[batchFees[i].userAddress] = 0;
                }

            } else {
                // positive fee
                usersAvailableBalances[batchFees[i].userAddress] += uint(batchFees[i].feeAmount);
            }
        }
    }

    function abs(int x) private pure returns (int) {
        return x >= 0 ? x : -x;
    }

}

Contract ABI

[{"inputs":[{"internalType":"address","name":"USDC_address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUSDC","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isBuy","type":"bool"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":true,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"string","name":"asset","type":"string"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradeFee","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"indexed":false,"internalType":"string","name":"tradeId","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUSDC","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"string","name":"_newAssetName","type":"string"}],"name":"addNewSupportedAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"int256","name":"feeAmount","type":"int256"}],"internalType":"struct DexilonTest_v12.FeesArray[]","name":"batchFees","type":"tuple[]"}],"name":"batchFundingRateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"address","name":"makerAddress","type":"address"},{"internalType":"address","name":"takerAddress","type":"address"},{"internalType":"string","name":"assetName","type":"string"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"internalType":"struct DexilonTest_v12.tradingArray[]","name":"batchTradingArray","type":"tuple[]"}],"name":"batchTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"uint32","name":"makerIndex","type":"uint32"},{"internalType":"uint32","name":"takerIndex","type":"uint32"},{"internalType":"uint32","name":"assetIndex","type":"uint32"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"internalType":"struct DexilonTest_v12.tradingArrayIndexed[]","name":"batchTradingArray","type":"tuple[]"}],"name":"batchTradeIndexed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"assetAmount","type":"int256"}],"name":"btcToUsdcMarketConvert","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountUSDC","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"int256","name":"assetBalance","type":"int256"},{"internalType":"uint256","name":"assetLockedBalance","type":"uint256"},{"internalType":"uint256","name":"assetPrice","type":"uint256"},{"internalType":"uint256","name":"assetLeverage","type":"uint256"}],"internalType":"struct DexilonTest_v12.userAssetParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indexedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"userAvailableBalance","type":"uint256"},{"internalType":"uint256","name":"userLockedBalance","type":"uint256"},{"internalType":"string","name":"asset","type":"string"},{"internalType":"int256","name":"userAssetBalance","type":"int256"},{"internalType":"uint16","name":"leverage","type":"uint16"}],"name":"resetUserAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"string","name":"asset","type":"string"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"name":"trade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amountUSDC","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600880546001600160a01b0319908116727a22900a3b98143368bd5906f8e17e9867581b1790915560098054821673572ddec9087154dc5dfbb1546bb62713147e0ab0179055600a8054909116737592a72a46d3165dcc7bf0802d70812af19471b31790553480156200007657600080fd5b50604051620036223803806200362283398101604081905262000099916200041b565b60078054336001600160a01b031991821617909155600a80549091166001600160a01b0383161790556040805161014081018252600361010082018181526242544360e81b6101208401528252825180840184528181526208aa8960eb1b60208083019190915280840191909152835180850185528281526214d3d360ea1b8183015283850152835180850185529182526241444160e81b828201526060830191909152825180840184526004808252632722a0a960e11b8284015260808401919091528351808501855260058152644d4154494360d81b8184015260a084015283518085018552818152634c554e4160e01b8184015260c08401528351808501909452835263444f474560e01b9083015260e0810191909152620001c3906006906008620002b2565b5060005b60065461ffff8216101562000242576001600460068361ffff1681548110620001f457620001f46200044d565b906000526020600020016040516200020d91906200049f565b908152604051908190036020019020805491151560ff1990921691909117905580620002398162000542565b915050620001c7565b5050600780546001600160a01b0390811660009081526002602090815260408220829055925490805260039092527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff80546001600160a01b03191692909116919091179055600160055562000572565b82805482825590600052602060002090810192821562000304579160200282015b82811115620003045782518051620002f391849160209091019062000316565b5091602001919060010190620002d3565b5062000312929150620003a1565b5090565b828054620003249062000463565b90600052602060002090601f01602090048101928262000348576000855562000393565b82601f106200036357805160ff191683800117855562000393565b8280016001018555821562000393579182015b828111156200039357825182559160200191906001019062000376565b5062000312929150620003c2565b8082111562000312576000620003b88282620003d9565b50600101620003a1565b5b80821115620003125760008155600101620003c3565b508054620003e79062000463565b6000825580601f10620003f8575050565b601f016020900490600052602060002090810190620004189190620003c2565b50565b6000602082840312156200042e57600080fd5b81516001600160a01b03811681146200044657600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200047857607f821691505b6020821081036200049957634e487b7160e01b600052602260045260246000fd5b50919050565b600080835481600182811c915080831680620004bc57607f831692505b60208084108203620004dc57634e487b7160e01b86526022600452602486fd5b818015620004f35760018114620005055762000534565b60ff1986168952848901965062000534565b60008a81526020902060005b868110156200052c5781548b82015290850190830162000511565b505084890196505b509498975050505050505050565b600061ffff8083168181036200056857634e487b7160e01b600052601160045260246000fd5b6001019392505050565b6130a080620005826000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063abd3f61211610097578063c845d9b711610066578063c845d9b714610243578063e4de0f5a14610256578063f2fde38b14610269578063f3fef3a31461027c57600080fd5b8063abd3f612146101d8578063b6b55f25146101fa578063bb7661b71461020d578063bec321a41461023057600080fd5b8063853828b6116100d3578063853828b61461018a5780638a82fac5146101925780638da5cb5b146101a55780638e2f229f146101b857600080fd5b80632972a2481461010557806363c7b3dc1461011a5780636ba13a82146101605780637022002b14610177575b600080fd5b610118610113366004612322565b61028f565b005b61014361012836600461249e565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61016960055481565b604051908152602001610157565b6101186101853660046124d7565b610503565b6101186107ae565b6101186101a0366004612553565b610890565b600754610143906001600160a01b031681565b6101696101c6366004612629565b60026020526000908152604090205481565b6101eb6101e6366004612629565b6109e6565b6040516101579392919061269e565b61011861020836600461249e565b610d1e565b61022061021b366004612741565b610e31565b6040519015158152602001610157565b61011861023e366004612776565b610f32565b6101186102513660046128f1565b610ff5565b61016961026436600461249e565b6111f6565b610118610277366004612629565b611335565b61011861028a3660046129a5565b6113d3565b6007546001600160a01b031633146102a657600080fd5b805160005b818110156104fe576104ec8382815181106102c8576102c86129d1565b602002602001015160000151600360008685815181106102ea576102ea6129d1565b60200260200101516020015163ffffffff16815260200190815260200160002060009054906101000a90046001600160a01b031660036000878681518110610334576103346129d1565b60200260200101516040015163ffffffff16815260200190815260200160002060009054906101000a90046001600160a01b0316600687868151811061037c5761037c6129d1565b60200260200101516060015163ffffffff168154811061039e5761039e6129d1565b9060005260206000200180546103b3906129e7565b80601f01602080910402602001604051908101604052809291908181526020018280546103df906129e7565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050878681518110610443576104436129d1565b602002602001015160800151888781518110610461576104616129d1565b602002602001015160a0015189888151811061047f5761047f6129d1565b602002602001015160c001518a898151811061049d5761049d6129d1565b602002602001015160e001518b8a815181106104bb576104bb6129d1565b602002602001015161010001518c8b815181106104da576104da6129d1565b60200260200101516101200151610890565b806104f681612a37565b9150506102ab565b505050565b6007546001600160a01b0316331461051a57600080fd5b6001600160a01b038616600090815260208181526040808320889055805160a08101825260608082528184018581528284018681529183018681526080840187815285519687019095528686529483528590528490529183905260019052905b60065461ffff821610156106a6576001600160a01b0388166000908152600160205260409020600680548492919061ffff85169081106105bc576105bc6129d1565b906000526020600020016040516105d39190612a50565b908152602001604051809103902060008201518160000190805190602001906105fd929190612122565b50602082015181600101556040820151816002015560608201518160030155608082015181600401559050508261ffff16600160008a6001600160a01b03166001600160a01b0316815260200190815260200160002060068361ffff168154811061066a5761066a6129d1565b906000526020600020016040516106819190612a50565b908152604051908190036020019020600401558061069e81612aeb565b91505061057a565b506001600160a01b0387166000908152600160205260409081902090518491906106d1908790612b0c565b9081526020016040518091039020600101819055508460016000896001600160a01b03166001600160a01b031681526020019081526020016000208560405161071a9190612b0c565b9081526040519081900360200190206002015582156107a55761073c83611516565b6107486012600a612c0c565b61075661ffff851688612c1b565b6107609190612c3a565b61076a9190612cd5565b6001600160a01b038816600090815260016020526040908190209051610791908790612b0c565b908152604051908190036020019020600301555b50505050505050565b6007546001600160a01b031633146107c557600080fd5b600754600a546040516370a0823160e01b815230600482015261084d926001600160a01b039081169216906370a0823190602401602060405180830381865afa158015610816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083a9190612d03565b600a546001600160a01b03169190611536565b471561088e576007546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561088c573d6000803e3d6000fd5b505b565b6007546001600160a01b031633146108a757600080fd5b6004876040516108b79190612b0c565b908152604051602091819003820181205460ff16916108d891849101612d1c565b6040516020818303038152906040529061090e5760405162461bcd60e51b81526004016109059190612d61565b60405180910390fd5b5061091b89888584611599565b61092788888484611599565b61094f8988888d61093a5760001961093d565b60015b6109479190612c3a565b8888866118e8565b61097f8888888d610961576001610965565b6000195b61096f9190612c3a565b8861097989612d74565b866118e8565b876001600160a01b0316896001600160a01b03167fa725452d7afd3dff5a0c9925ebcf78f3eafb33c3f2460f8f7d2c057897e020fa8c8a8a8a8a8a8a8a426040516109d299989796959493929190612d90565b60405180910390a350505050505050505050565b6000806060816109f860066012612dfe565b610a0390600a612c0c565b6001600160a01b038616600090815260208190526040902054610a269190612e21565b905060008060068054905067ffffffffffffffff811115610a4957610a496121bb565b604051908082528060200260200182016040528015610aac57816020015b610a996040518060a0016040528060608152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081610a675790505b50905060005b600654811015610cdd57610c8360068281548110610ad257610ad26129d1565b906000526020600020018054610ae7906129e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b13906129e7565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b5050506001600160a01b038c16600090815260016020526040902060068054919350915085908110610b9457610b946129d1565b90600052602060002001604051610bab9190612a50565b90815260200160405180910390206040518060a0016040529081600082018054610bd4906129e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c00906129e7565b8015610c4d5780601f10610c2257610100808354040283529160200191610c4d565b820191906000526020600020905b815481529060010190602001808311610c3057829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481525050611daa565b828281518110610c9557610c956129d1565b6020026020010181905250818181518110610cb257610cb26129d1565b60200260200101516040015183610cc99190612e35565b925080610cd581612a37565b915050610ab2565b50610ce9600a83612e4d565b15610d1157610cf9600a83612e4d565b610d0490600a612e61565b610d0e9083612e35565b91505b9196909550909350915050565b600a54610d36906001600160a01b0316333084611e98565b610d4260066012612dfe565b610d4d90600a612c0c565b610d579082612c1b565b3360009081526020819052604081208054909190610d76908490612e35565b909155505033600090815260026020526040902054158015610da357506007546001600160a01b03163314155b15610df457600580543360008181526002602090815260408083208590559382526003905291822080546001600160a01b031916909117905581546001929190610dee908490612e35565b90915550505b6040805182815242602082015233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a250565b6007546000906001600160a01b03163314610e4b57600080fd5b600482604051610e5b9190612b0c565b9081526040519081900360200190205460ff1615610eb35760405162461bcd60e51b8152602060048201526015602482015274417373657420616c7265616479206578697374732160581b6044820152606401610905565b600680546001810182556000919091528251610ef6917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01906020850190612122565b506001600483604051610f099190612b0c565b908152604051908190036020019020805491151560ff199092169190911790555060015b919050565b6007546001600160a01b03163314610f4957600080fd5b805160005b818110156104fe57610fe3838281518110610f6b57610f6b6129d1565b602002602001015160000151848381518110610f8957610f896129d1565b602002602001015160200151858481518110610fa757610fa76129d1565b602002602001015160400151868581518110610fc557610fc56129d1565b602002602001015160600151878681518110610443576104436129d1565b80610fed81612a37565b915050610f4e565b6007546001600160a01b0316331461100c57600080fd5b805160005b818110156104fe57600083828151811061102d5761102d6129d1565b602002602001015160200151121561117057828181518110611051576110516129d1565b60200260200101516020015161106690612d74565b60008085848151811061107b5761107b6129d1565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020541061112f578281815181106110bf576110bf6129d1565b6020026020010151602001516110d490612d74565b6000808584815181106110e9576110e96129d1565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546111249190612e61565b909155506111e49050565b6000806000858481518110611146576111466129d1565b602090810291909101810151516001600160a01b03168252810191909152604001600020556111e4565b828181518110611182576111826129d1565b6020026020010151602001516000808584815181106111a3576111a36129d1565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546111de9190612e35565b90915550505b806111ee81612a37565b915050611011565b600080600860009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561124c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112709190612e78565b5050509150506000600960009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612e78565b505050915050600660126113039190612dfe565b61130e90600a612c0c565b816113198685612c3a565b6113239190612cd5565b61132d9190612cd5565b949350505050565b6007546001600160a01b0316331461134c57600080fd5b6001600160a01b0381166113b15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610905565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146113ea57600080fd5b6113f660066012612dfe565b61140190600a612c0c565b61140b9082612c1b565b6001600160a01b038316600090815260208190526040902054101561146a5760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e742062616c616e63652160581b6044820152606401610905565b600a54611481906001600160a01b03168383611536565b61148d60066012612dfe565b61149890600a612c0c565b6114a29082612c1b565b6001600160a01b038316600090815260208190526040812080549091906114ca908490612e61565b9091555050604080518281524260208201526001600160a01b038416917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a25050565b60008082121561152e5761152982612d74565b611530565b815b92915050565b6040516001600160a01b0383166024820152604481018290526104fe90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ed6565b6000806000808561ffff1611846040516020016115b69190612ed0565b604051602081830303815290604052906115e35760405162461bcd60e51b81526004016109059190612d61565b506001600160a01b03871660009081526001602052604090819020905161160b908890612b0c565b908152602001604051809103902060010154600003611666576001600160a01b03871660009081526001602052604090819020905161ffff87169190611652908990612b0c565b908152604051908190036020019020600401555b6001600160a01b03871660009081526001602052604090819020905161ffff87169190611694908990612b0c565b908152602001604051809103902060040154146107a5576001600160a01b0387166000908152600160205260409081902090516116d2908890612b0c565b908152602001604051809103902060040154611731600160008a6001600160a01b03166001600160a01b031681526020019081526020016000208860405161171a9190612b0c565b908152602001604051809103902060010154611516565b6001600160a01b038916600090815260016020526040908190209051611758908a90612b0c565b9081526020016040518091039020600301546117749190612c3a565b61177e9190612cd5565b92508461ffff166117bb600160008a6001600160a01b03166001600160a01b031681526020019081526020016000208860405161171a9190612b0c565b6001600160a01b0389166000908152600160205260409081902090516117e2908a90612b0c565b9081526020016040518091039020600301546117fe9190612c3a565b6118089190612cd5565b91506118166012600a612c0c565b6118208484612f08565b61182a9190612cd5565b6001600160a01b03881660009081526020819052604090205461184d9190612f08565b90506000811215846040516020016118659190612f47565b604051602081830303815290604052906118925760405162461bcd60e51b81526004016109059190612d61565b506001600160a01b038716600090815260208181526040808320849055600190915290819020905161ffff871691906118cc908990612b0c565b9081526040519081900360200190206004015550505050505050565b6001600160a01b038616600090815260016020526040808220905161190e908890612b0c565b9081526020016040518091039020600101549050600060016000896001600160a01b03166001600160a01b03168152602001908152602001600020876040516119579190612b0c565b908152604051908190036020019020600301549050600061197a6012600a612c0c565b6001600160a01b038a166000908152600160205260409081902090516119a1908b90612b0c565b9081526020016040518091039020600401546119bd9190612c3a565b905060006119cd60066012612dfe565b6119d890600a612c0c565b6119e29087612c3a565b6001600160a01b038b16600090815260208190526040902054611a059190612f8c565b905060008284611a1487611516565b611a1e9190612c3a565b611a289190612cd5565b9050611a3660066012612dfe565b611a4190600a612c0c565b611a4b9089612c3a565b97506000881386604051602001611a629190612fcd565b60405160208183030381529060405290611a8f5760405162461bcd60e51b81526004016109059190612d61565b50600089138015611aa05750600085125b80611ab65750600089128015611ab65750600085135b8015611ad15750611ac685611516565b611acf8a611516565b135b15611b6f57611ae26012600a612c0c565b611aec8986612f08565b611af69087612c3a565b611b009190612cd5565b8385611b0b88611516565b611b159190612c3a565b611b1f9190612cd5565b611b299084612f8c565b611b339190612f08565b9150611b5283611b438688612c3a565b611b4d9190612cd5565b611516565b611b5c9082612f08565b9050611b68858a612f8c565b9850600094505b841580611b875750600085128015611b875750600089125b80611b9d5750600085138015611b9d5750600089135b15611c0f57611bb083611b438a8c612c3a565b611bba9083612f08565b9150611bca83611b438a8c612c3a565b611bd49082612f8c565b9050611be08986612f8c565b611bea898b612c3a565b611bf48688612c3a565b611bfe9190612f8c565b611c089190612cd5565b9350611c89565b611c1b6012600a612c0c565b611c258986612f08565b611c2f908b612c3a565b611c399190612cd5565b8385611c448c611516565b611c4e9190612c3a565b611c589190612cd5565b611c629084612f8c565b611c6c9190612f8c565b9150611c7c83611b43868c612c3a565b611c869082612f08565b90505b600082121586604051602001611c9f9190612f47565b60405160208183030381529060405290611ccc5760405162461bcd60e51b81526004016109059190612d61565b50600081121586604051602001611ce39190613008565b60405160208183030381529060405290611d105760405162461bcd60e51b81526004016109059190612d61565b506001600160a01b038b166000908152602081815260408083208590556001909152908190209051859190611d46908d90612b0c565b90815260405190819003602001902060030155611d638986612f8c565b6001600160a01b038c16600090815260016020526040908190209051611d8a908d90612b0c565b908152604051908190036020019020600101555050505050505050505050565b611ddc6040518060a0016040528060608152602001600081526020016000815260200160008152602001600081525090565b82815260208083015190820152608082015115611e5b57611dff60066012612dfe565b611e0a90600a612c0c565b611e166012600a612c0c565b611e209190612c3a565b82608001518360600151611e378560200151611516565b611e419190612c1b565b611e4b9190612e21565b611e559190612e21565b60408201525b611e6760066012612dfe565b611e7290600a612c0c565b8260600151611e819190612e21565b606082015260809182015191810191909152919050565b6040516001600160a01b0380851660248301528316604482015260648101829052611ed09085906323b872dd60e01b90608401611562565b50505050565b6000611f2b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fa89092919063ffffffff16565b8051909150156104fe5780806020019051810190611f49919061304d565b6104fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610905565b6060611fb78484600085611fc1565b90505b9392505050565b6060824710156120225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610905565b843b6120705760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610905565b600080866001600160a01b0316858760405161208c9190612b0c565b60006040518083038185875af1925050503d80600081146120c9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ce565b606091505b50915091506120de8282866120e9565b979650505050505050565b606083156120f8575081611fba565b8251156121085782518084602001fd5b8160405162461bcd60e51b81526004016109059190612d61565b82805461212e906129e7565b90600052602060002090601f0160209004810192826121505760008555612196565b82601f1061216957805160ff1916838001178555612196565b82800160010185558215612196579182015b8281111561219657825182559160200191906001019061217b565b506121a29291506121a6565b5090565b5b808211156121a257600081556001016121a7565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff811182821017156121f5576121f56121bb565b60405290565b6040805190810167ffffffffffffffff811182821017156121f5576121f56121bb565b604051601f8201601f1916810167ffffffffffffffff81118282101715612247576122476121bb565b604052919050565b600067ffffffffffffffff821115612269576122696121bb565b5060051b60200190565b801515811461088c57600080fd5b8035610f2d81612273565b803563ffffffff81168114610f2d57600080fd5b803561ffff81168114610f2d57600080fd5b600082601f8301126122c357600080fd5b813567ffffffffffffffff8111156122dd576122dd6121bb565b6122f0601f8201601f191660200161221e565b81815284602083860101111561230557600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561233557600080fd5b823567ffffffffffffffff8082111561234d57600080fd5b818501915085601f83011261236157600080fd5b813561237461236f8261224f565b61221e565b81815260059190911b8301840190848101908883111561239357600080fd5b8585015b83811015612491578035858111156123af5760008081fd5b8601610140818c03601f19018113156123c85760008081fd5b6123d06121d1565b6123db8a8401612281565b815260406123ea81850161228c565b8b83015260606123fb81860161228c565b828401526080915061240e82860161228c565b818401525060a0808501358284015260c0915081850135818401525060e0808501358284015261010091506124448286016122a0565b908301526101206124568582016122a0565b8383015292840135928984111561246f57600091508182fd5b61247d8f8d868801016122b2565b908301525085525050918601918601612397565b5098975050505050505050565b6000602082840312156124b057600080fd5b5035919050565b6001600160a01b038116811461088c57600080fd5b8035610f2d816124b7565b60008060008060008060c087890312156124f057600080fd5b86356124fb816124b7565b95506020870135945060408701359350606087013567ffffffffffffffff81111561252557600080fd5b61253189828a016122b2565b9350506080870135915061254760a088016122a0565b90509295509295509295565b6000806000806000806000806000806101408b8d03121561257357600080fd5b61257c8b612281565b995061258a60208c016124cc565b985061259860408c016124cc565b975060608b013567ffffffffffffffff808211156125b557600080fd5b6125c18e838f016122b2565b985060808d0135975060a08d0135965060c08d013595506125e460e08e016122a0565b94506125f36101008e016122a0565b93506101208d013591508082111561260a57600080fd5b506126178d828e016122b2565b9150509295989b9194979a5092959850565b60006020828403121561263b57600080fd5b8135611fba816124b7565b60005b83811015612661578181015183820152602001612649565b83811115611ed05750506000910152565b6000815180845261268a816020860160208601612646565b601f01601f19169290920160200192915050565b600060608083018684526020868186015260408381870152828751808552608094508488019150848160051b890101848a0160005b8381101561272f57607f198b8403018552815160a081518186526126f982870182612672565b838b0151878c0152898401518a8801528c8401518d880152928b0151958b019590955250948701949250908601906001016126d3565b50909c9b505050505050505050505050565b60006020828403121561275357600080fd5b813567ffffffffffffffff81111561276a57600080fd5b61132d848285016122b2565b6000602080838503121561278957600080fd5b823567ffffffffffffffff808211156127a157600080fd5b818501915085601f8301126127b557600080fd5b81356127c361236f8261224f565b81815260059190911b830184019084810190888311156127e257600080fd5b8585015b83811015612491578035858111156127fd57600080fd5b8601610140818c03601f190181131561281557600080fd5b61281d6121d1565b6128288a8401612281565b8152612836604084016124cc565b8a820152612846606084016124cc565b60408201526080808401358981111561285f5760008081fd5b61286d8f8d838801016122b2565b60608401525060a0808501358284015260c0915081850135818401525060e0808501358284015261010091506128a48286016122a0565b908301526101206128b68582016122a0565b838301529284013592898411156128cf57600091508182fd5b6128dd8f8d868801016122b2565b9083015250855250509186019186016127e6565b6000602080838503121561290457600080fd5b823567ffffffffffffffff81111561291b57600080fd5b8301601f8101851361292c57600080fd5b803561293a61236f8261224f565b81815260069190911b8201830190838101908783111561295957600080fd5b928401925b828410156120de57604084890312156129775760008081fd5b61297f6121fb565b843561298a816124b7565b8152848601358682015282526040909301929084019061295e565b600080604083850312156129b857600080fd5b82356129c3816124b7565b946020939093013593505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806129fb57607f821691505b602082108103612a1b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600060018201612a4957612a49612a21565b5060010190565b600080835481600182811c915080831680612a6c57607f831692505b60208084108203612a8b57634e487b7160e01b86526022600452602486fd5b818015612a9f5760018114612ab057612add565b60ff19861689528489019650612add565b60008a81526020902060005b86811015612ad55781548b820152908501908301612abc565b505084890196505b509498975050505050505050565b600061ffff808316818103612b0257612b02612a21565b6001019392505050565b60008251612b1e818460208701612646565b9190910192915050565b600181815b80851115612b63578160001904821115612b4957612b49612a21565b80851615612b5657918102915b93841c9390800290612b2d565b509250929050565b600082612b7a57506001611530565b81612b8757506000611530565b8160018114612b9d5760028114612ba757612bc3565b6001915050611530565b60ff841115612bb857612bb8612a21565b50506001821b611530565b5060208310610133831016604e8410600b8410161715612be6575081810a611530565b612bf08383612b28565b8060001904821115612c0457612c04612a21565b029392505050565b6000611fba60ff841683612b6b565b6000816000190483118215151615612c3557612c35612a21565b500290565b60006001600160ff1b0381841382841380821686840486111615612c6057612c60612a21565b600160ff1b6000871282811687830589121615612c7f57612c7f612a21565b60008712925087820587128484161615612c9b57612c9b612a21565b87850587128184161615612cb157612cb1612a21565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b600082612ce457612ce4612cbf565b600160ff1b821460001984141615612cfe57612cfe612a21565b500590565b600060208284031215612d1557600080fd5b5051919050565b7f556e6b6e6f776e2041737365742120547261646549643a000000000000000000815260008251612d54816017850160208701612646565b9190910160170192915050565b602081526000611fba6020830184612672565b6000600160ff1b8201612d8957612d89612a21565b5060000390565b60006101208b15158352806020840152612dac8184018c612672565b905089604084015288606084015287608084015261ffff80881660a085015280871660c08501525082810360e0840152612de68186612672565b915050826101008301529a9950505050505050505050565b600060ff821660ff841680821015612e1857612e18612a21565b90039392505050565b600082612e3057612e30612cbf565b500490565b60008219821115612e4857612e48612a21565b500190565b600082612e5c57612e5c612cbf565b500690565b600082821015612e7357612e73612a21565b500390565b600080600080600060a08688031215612e9057600080fd5b8551612e9b816124b7565b809550506020860151935060408601519250606086015191506080860151612ec2816124b7565b809150509295509295909350565b7f5a65726f204c657665726167652120547261646549643a000000000000000000815260008251612d54816017850160208701612646565b60008083128015600160ff1b850184121615612f2657612f26612a21565b6001600160ff1b0384018313811615612f4157612f41612a21565b50500390565b7f496e73756666696369656e742062616c616e63652120547261646549643a0000815260008251612f7f81601e850160208701612646565b91909101601e0192915050565b600080821280156001600160ff1b0384900385131615612fae57612fae612a21565b600160ff1b8390038412811615612fc757612fc7612a21565b50500190565b722d32b937902930ba3290902a3930b232a4b21d60691b815260008251612ffb816013850160208701612646565b9190910160130192915050565b7f4c6f636b656442616c616e6365203c20302120547261646549643a000000000081526000825161304081601b850160208701612646565b91909101601b0192915050565b60006020828403121561305f57600080fd5b8151611fba8161227356fea2646970667358221220b296139f90aad166ee04b57b9eca0ce6581734a9950c4a6815b19c1b501b904e64736f6c634300080e00330000000000000000000000007592a72a46d3165dcc7bf0802d70812af19471b3

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

0000000000000000000000007592a72a46d3165dcc7bf0802d70812af19471b3

-----Decoded View---------------
Arg [0] : USDC_address (address): 0x7592a72a46d3165dcc7bf0802d70812af19471b3

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007592a72a46d3165dcc7bf0802d70812af19471b3


Deployed ByteCode Sourcemap

13403:20486:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30720:791;;;;;;:::i;:::-;;:::i;:::-;;14612:51;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;14612:51:0;;;;;;-1:-1:-1;;;;;5092:32:1;;;5074:51;;5062:2;5047:18;14612:51:0;;;;;;;;14728:25;;;;;;;;;5282::1;;;5270:2;5255:18;14728:25:0;5136:177:1;21860:1287:0;;;;;;:::i;:::-;;:::i;21576:245::-;;;:::i;23949:986::-;;;;;;:::i;:::-;;:::i;14802:28::-;;;;;-1:-1:-1;;;;;14802:28:0;;;14560:45;;;;;;:::i;:::-;;;;;;;;;;;;;;18813:821;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;18142:534::-;;;;;;:::i;:::-;;:::i;17247:289::-;;;;;;:::i;:::-;;:::i;:::-;;;10414:14:1;;10407:22;10389:41;;10377:2;10362:18;17247:289:0;10249:187:1;31992:731:0;;;;;;:::i;:::-;;:::i;32914:874::-;;;;;;:::i;:::-;;:::i;17622:371::-;;;;;;:::i;:::-;;:::i;16934:190::-;;;;;;:::i;:::-;;:::i;21102:435::-;;;;;;:::i;:::-;;:::i;30720:791::-;16753:5;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;30839:24;;30825:11:::1;30876:628;30898:3;30894:1;:7;30876:628;;;30923:569;30947:17;30965:1;30947:20;;;;;;;;:::i;:::-;;;;;;;:26;;;30992:16;:49;31009:17;31027:1;31009:20;;;;;;;;:::i;:::-;;;;;;;:31;;;30992:49;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30992:49:0::1;31060:16;:49;31077:17;31095:1;31077:20;;;;;;;;:::i;:::-;;;;;;;:31;;;31060:49;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;31060:49:0::1;31128:11;31140:17;31158:1;31140:20;;;;;;;;:::i;:::-;;;;;;;:31;;;31128:44;;;;;;;;;;:::i;:::-;;;;;;;;30923:569;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31191:17;31209:1;31191:20;;;;;;;;:::i;:::-;;;;;;;:32;;;31242:17;31260:1;31242:20;;;;;;;;:::i;:::-;;;;;;;:30;;;31291:17;31309:1;31291:20;;;;;;;;:::i;:::-;;;;;;;:29;;;31339:17;31357:1;31339:20;;;;;;;;:::i;:::-;;;;;;;:34;;;31392:17;31410:1;31392:20;;;;;;;;:::i;:::-;;;;;;;:34;;;31445:17;31463:1;31445:20;;;;;;;;:::i;:::-;;;;;;;:28;;;30923:5;:569::i;:::-;30903:3:::0;::::1;::::0;::::1;:::i;:::-;;;;30876:628;;;;30812:699;30720:791:::0;:::o;21860:1287::-;16753:5;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;-1:-1:-1;;;;;22211:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;;:58;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22342:29:0;;;;::::1;::::0;;;;;;;;;22382:31;;;22424:37;;;22472:29;;;;22543:1:::1;22512:32:::0;;-1:-1:-1;22557:216:0::1;22576:11;:18:::0;22574:20:::1;::::0;::::1;;22557:216;;;-1:-1:-1::0;;;;;22616:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;22645:11:::1;:14:::0;;22663;;22616:28;22645:11;:14:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;22616:44;;;;;;:::i;:::-;;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22753:8;22692:69;;:15;:28;22708:11;-1:-1:-1::0;;;;;22692:28:0::1;-1:-1:-1::0;;;;;22692:28:0::1;;;;;;;;;;;;22721:11;22733:1;22721:14;;;;;;;;;;:::i;:::-;;;;;;;;22692:44;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:58:::1;;:69:::0;22596:3;::::1;::::0;::::1;:::i;:::-;;;;22557:216;;;-1:-1:-1::0;;;;;;22785:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;:35;;22836:16;;22785:28;:35:::1;::::0;22814:5;;22785:35:::1;:::i;:::-;;;;;;;;;;;;;:48;;:67;;;;22920:17;22863:15;:28;22879:11;-1:-1:-1::0;;;;;22863:28:0::1;-1:-1:-1::0;;;;;22863:28:0::1;;;;;;;;;;;;22892:5;22863:35;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:54:::1;;:74:::0;22952:21;;22948:190:::1;;23114:21;23118:16;23114:3;:21::i;:::-;15582:16;15523:2;15582;:16;:::i;:::-;23048:28;;::::0;::::1;:17:::0;:28:::1;:::i;:::-;23044:52;;;;:::i;:::-;23043:92;;;;:::i;:::-;-1:-1:-1::0;;;;;22989:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;:35;;::::1;::::0;23018:5;;22989:35:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:46:::1;;:147:::0;22948:190:::1;22200:947;21860:1287:::0;;;;;;:::o;21576:245::-;16753:5;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;21653:5:::1;::::0;21660:12:::1;::::0;:37:::1;::::0;-1:-1:-1;;;21660:37:0;;21691:4:::1;21660:37;::::0;::::1;5074:51:1::0;21627:71:0::1;::::0;-1:-1:-1;;;;;21653:5:0;;::::1;::::0;21660:12:::1;::::0;:22:::1;::::0;5047:18:1;;21660:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21627:12;::::0;-1:-1:-1;;;;;21627:12:0::1;::::0;:71;:25:::1;:71::i;:::-;21723:21;:25:::0;21719:95:::1;;21765:5;::::0;:37:::1;::::0;-1:-1:-1;;;;;21765:5:0;;::::1;::::0;21780:21:::1;21765:37:::0;::::1;;;::::0;:5:::1;:37:::0;:5;:37;21780:21;21765:5;:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21719:95;21576:245::o:0;23949:986::-;16753:5;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;24295:10:::1;24306:5;24295:17;;;;;;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;;::::0;24321:52:::1;::::0;24365:7;;24321:52:::1;;:::i;:::-;;;;;;;;;;;;;24287:88;;;;;-1:-1:-1::0;;;24287:88:0::1;;;;;;;;:::i;:::-;;;;;;;;;;24388:56;24407:5;24414;24421:13;24436:7;24388:18;:56::i;:::-;24455;24474:5;24481;24488:13;24503:7;24455:18;:56::i;:::-;24532:117;24551:5;24558;24596:11;24566:5;:24;;-1:-1:-1::0;;24566:24:0::1;;;24578:1;24566:24;24565:43;;;;:::i;:::-;24614:9;24630:8;24641:7;24532:18;:117::i;:::-;24660:118;24679:5;24686;24724:11;24694:5;:24;;24716:1;24694:24;;;-1:-1:-1::0;;24694:24:0::1;24693:43;;;;:::i;:::-;24742:9:::0;24754:14:::1;24759:8:::0;24754:14:::1;:::i;:::-;24770:7;24660:18;:118::i;:::-;24824:5;-1:-1:-1::0;;;;;24804:123:0::1;24817:5;-1:-1:-1::0;;;;;24804:123:0::1;;24810:5;24831;24838:11;24851:9;24862:8;24872:13;24887;24902:7;24911:15;24804:123;;;;;;;;;;;;;;:::i;:::-;;;;;;;;23949:986:::0;;;;;;;;;;:::o;18813:821::-;18883:7;;18903:28;18883:7;15655:26;15476:1;15523:2;15655:26;:::i;:::-;15650:32;;:2;:32;:::i;:::-;-1:-1:-1;;;;;18978:28:0;;:22;:28;;;;;;;;;;;:52;;;;:::i;:::-;18951:79;;19041:21;19075:39;19143:11;:18;;;;19117:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19117:45:0;;;;;;;;;;;;;;;;;19075:87;;19180:9;19175:235;19197:11;:18;19193:22;;19175:235;;;19253:81;19280:11;19292:1;19280:14;;;;;;;;:::i;:::-;;;;;;;;19253:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;19296:21:0;;;;;;:15;:21;;;;;19318:11;:14;;19296:21;;-1:-1:-1;19318:11:0;-1:-1:-1;19330:1:0;;19318:14;;;;;;:::i;:::-;;;;;;;;19296:37;;;;;;:::i;:::-;;;;;;;;;;;;;19253:81;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;:81::i;:::-;19237:10;19248:1;19237:13;;;;;;;;:::i;:::-;;;;;;:97;;;;19366:10;19377:1;19366:13;;;;;;;;:::i;:::-;;;;;;;:32;;;19349:49;;;;;:::i;:::-;;-1:-1:-1;19217:3:0;;;;:::i;:::-;;;;19175:235;;;-1:-1:-1;19462:18:0;19478:2;19462:13;:18;:::i;:::-;:22;19458:94;;19522:18;19538:2;19522:13;:18;:::i;:::-;19517:23;;:2;:23;:::i;:::-;19500:40;;;;:::i;:::-;;;19458:94;19580:16;;19598:13;;-1:-1:-1;19580:16:0;;-1:-1:-1;18813:821:0;-1:-1:-1;;18813:821:0:o;18142:534::-;18197:12;;:68;;-1:-1:-1;;;;;18197:12:0;18227:10;18247:4;18254:10;18197:29;:68::i;:::-;15655:26;15476:1;15523:2;15655:26;:::i;:::-;15650:32;;:2;:32;:::i;:::-;18324:34;;:10;:34;:::i;:::-;18309:10;18286:22;:34;;;;;;;;;;:72;;:34;;:22;:72;;;;;:::i;:::-;;;;-1:-1:-1;;18414:10:0;18403:22;;;;:10;:22;;;;;;:27;:50;;;;-1:-1:-1;18448:5:0;;-1:-1:-1;;;;;18448:5:0;18434:10;:19;;18403:50;18399:204;;;18495:10;;;18481;18470:22;;;;:10;:22;;;;;;;;:35;;;18520:28;;;:16;:28;;;;;:41;;-1:-1:-1;;;;;;18520:41:0;;;;;;18576:15;;18520:41;;18495:10;18470:22;18576:15;;18520:41;;18576:15;:::i;:::-;;;;-1:-1:-1;;18399:204:0;18620:48;;;22669:25:1;;;18652:15:0;22725:2:1;22710:18;;22703:34;18628:10:0;;18620:48;;22642:18:1;18620:48:0;;;;;;;18142:534;:::o;17247:289::-;16753:5;;17332:4;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;17359:10:::1;17370:13;17359:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;:34;17351:68;;;::::0;-1:-1:-1;;;17351:68:0;;22950:2:1;17351:68:0::1;::::0;::::1;22932:21:1::0;22989:2;22969:18;;;22962:30;-1:-1:-1;;;23008:18:1;;;23001:51;23069:18;;17351:68:0::1;22748:345:1::0;17351:68:0::1;17432:11;:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;17432:31:0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;17502:4;17474:10;17485:13;17474:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:32;;;::::1;;-1:-1:-1::0;;17474:32:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;17474:32:0;16770:1:::1;17247:289:::0;;;:::o;31992:731::-;16753:5;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;32097:24;;32083:11:::1;32134:582;32156:3;32152:1;:7;32134:582;;;32181:523;32205:17;32223:1;32205:20;;;;;;;;:::i;:::-;;;;;;;:26;;;32250:17;32268:1;32250:20;;;;;;;;:::i;:::-;;;;;;;:33;;;32302:17;32320:1;32302:20;;;;;;;;:::i;:::-;;;;;;;:33;;;32354:17;32372:1;32354:20;;;;;;;;:::i;:::-;;;;;;;:30;;;32403:17;32421:1;32403:20;;;;;;;;:::i;32181:523::-;32161:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32134:582;;32914:874:::0;16753:5;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;33018:16;;33004:11:::1;33047:734;33069:3;33065:1;:7;33047:734;;;33123:1;33098:9;33108:1;33098:12;;;;;;;;:::i;:::-;;;;;;;:22;;;:26;33094:676;;;33241:9;33251:1;33241:12;;;;;;;;:::i;:::-;;;;;;;:22;;;33240:23;;;:::i;:::-;33183:22;:48:::0;33206:9:::1;33216:1;33206:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;33183:48:0::1;-1:-1:-1::0;;;;;33183:48:0::1;;;;;;;;;;;;;:81;33179:420;;33399:9;33409:1;33399:12;;;;;;;;:::i;:::-;;;;;;;:22;;;33398:23;;;:::i;:::-;33341:22;:48:::0;33364:9:::1;33374:1;33364:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;33341:48:0::1;-1:-1:-1::0;;;;;33341:48:0::1;;;;;;;;;;;;;:81;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;33094:676:0::1;::::0;-1:-1:-1;33094:676:0::1;33179:420;33578:1;33527:22:::0;:48:::1;33550:9;33560:1;33550:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:24;-1:-1:-1;;;;;33527:48:0::1;::::0;;;::::1;::::0;;;;;;33550:24:::1;33527:48:::0;:52;33094:676:::1;;;33731:9;33741:1;33731:12;;;;;;;;:::i;:::-;;;;;;;:22;;;33674;:48:::0;33697:9:::1;33707:1;33697:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;33674:48:0::1;-1:-1:-1::0;;;;;33674:48:0::1;;;;;;;;;;;;;:80;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;33094:676:0::1;33074:3:::0;::::1;::::0;::::1;:::i;:::-;;;;33047:734;;17622:371:::0;17692:3;17711:23;17744:17;;;;;;;;;-1:-1:-1;;;;;17744:17:0;-1:-1:-1;;;;;17744:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17708:71;;;;;;17793:24;17827:18;;;;;;;;;-1:-1:-1;;;;;17827:18:0;-1:-1:-1;;;;;17827:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17790:73;;;;;;15476:1;15523:2;17955:28;;;;:::i;:::-;17950:34;;:2;:34;:::i;:::-;17924:20;17892:31;17912:11;17892:19;:31;:::i;:::-;:52;;;;:::i;:::-;17891:94;;;;:::i;:::-;17884:101;17622:371;-1:-1:-1;;;;17622:371:0:o;16934:190::-;16753:5;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;-1:-1:-1;;;;;17015:22:0;::::1;17007:73;;;::::0;-1:-1:-1;;;17007:73:0;;23874:2:1;17007:73:0::1;::::0;::::1;23856:21:1::0;23913:2;23893:18;;;23886:30;23952:34;23932:18;;;23925:62;-1:-1:-1;;;24003:18:1;;;23996:36;24049:19;;17007:73:0::1;23672:402:1::0;17007:73:0::1;17091:5;:25:::0;;-1:-1:-1;;;;;;17091:25:0::1;-1:-1:-1::0;;;;;17091:25:0;;;::::1;::::0;;;::::1;::::0;;16934:190::o;21102:435::-;16753:5;;-1:-1:-1;;;;;16753:5:0;16739:10;:19;16731:28;;;;;;15655:26:::1;15476:1;15523:2;15655:26;:::i;:::-;15650:32;::::0;:2:::1;:32;:::i;:::-;21246:34;::::0;:10;:34:::1;:::i;:::-;-1:-1:-1::0;;;;;21207:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;;:73:::1;;21199:107;;;::::0;-1:-1:-1;;;21199:107:0;;24281:2:1;21199:107:0::1;::::0;::::1;24263:21:1::0;24320:2;24300:18;;;24293:30;-1:-1:-1;;;24339:18:1;;;24332:51;24400:18;;21199:107:0::1;24079:345:1::0;21199:107:0::1;21319:12;::::0;:50:::1;::::0;-1:-1:-1;;;;;21319:12:0::1;21345:11:::0;21358:10;21319:25:::1;:50::i;:::-;15655:26;15476:1;15523:2;15655:26;:::i;:::-;15650:32;::::0;:2:::1;:32;:::i;:::-;21419:34;::::0;:10;:34:::1;:::i;:::-;-1:-1:-1::0;;;;;21380:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;:73;;:35;;:22;:73:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;21479:50:0::1;::::0;;22669:25:1;;;21513:15:0::1;22725:2:1::0;22710:18;;22703:34;-1:-1:-1;;;;;21479:50:0;::::1;::::0;::::1;::::0;22642:18:1;21479:50:0::1;;;;;;;21102:435:::0;;:::o;33796:88::-;33838:3;33866:1;33861;:6;;:15;;33874:2;33875:1;33874:2;:::i;:::-;33861:15;;;33870:1;33861:15;33854:22;33796:88;-1:-1:-1;;33796:88:0:o;9555:211::-;9699:58;;-1:-1:-1;;;;;24621:32:1;;9699:58:0;;;24603:51:1;24670:18;;;24663:34;;;9672:86:0;;9692:5;;-1:-1:-1;;;9722:23:0;24576:18:1;;9699:58:0;;;;-1:-1:-1;;9699:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9699:58:0;-1:-1:-1;;;;;;9699:58:0;;;;;;;;;;9672:19;:86::i;28652:1567::-;28825:17;28853:20;28884:23;28962:1;28946:13;:17;;;29016:7;28972:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;28938:88;;;;;-1:-1:-1;;;28938:88:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;29043:21:0;;;;;;:15;:21;;;;;;;:28;;;;29065:5;;29043:28;:::i;:::-;;;;;;;;;;;;;:41;;;29088:1;29043:46;29039:137;;-1:-1:-1;;;;;29106:21:0;;;;;;:15;:21;;;;;;;:28;;:58;;;;:21;:28;;29128:5;;29106:28;:::i;:::-;;;;;;;;;;;;;;:42;;:58;29039:137;-1:-1:-1;;;;;29194:21:0;;;;;;:15;:21;;;;;;;:28;;:59;;;;:21;:28;;29216:5;;29194:28;:::i;:::-;;;;;;;;;;;;;:42;;;:59;29190:1022;;-1:-1:-1;;;;;29431:21:0;;;;;;:15;:21;;;;;;;:28;;;;29453:5;;29431:28;:::i;:::-;;;;;;;;;;;;;:42;;;29354:51;29362:15;:21;29378:4;-1:-1:-1;;;;;29362:21:0;-1:-1:-1;;;;;29362:21:0;;;;;;;;;;;;29384:5;29362:28;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;29354:3;:51::i;:::-;-1:-1:-1;;;;;29293:21:0;;;;;;:15;:21;;;;;;;:28;;;;29315:5;;29293:28;:::i;:::-;;;;;;;;;;;;;:39;;;29289:116;;;;:::i;:::-;29288:186;;;;:::i;:::-;29271:204;;29661:13;29653:22;;29576:51;29584:15;:21;29600:4;-1:-1:-1;;;;;29584:21:0;-1:-1:-1;;;;;29584:21:0;;;;;;;;;;;;29606:5;29584:28;;;;;;:::i;29576:51::-;-1:-1:-1;;;;;29515:21:0;;;;;;:15;:21;;;;;;;:28;;;;29537:5;;29515:28;:::i;:::-;;;;;;;;;;;;;:39;;;29511:116;;;;:::i;:::-;29510:166;;;;:::i;:::-;29490:187;-1:-1:-1;15582:16:0;15523:2;15582;:16;:::i;:::-;29787:32;29806:13;29787:16;:32;:::i;:::-;29786:52;;;;:::i;:::-;-1:-1:-1;;;;;29736:28:0;;:22;:28;;;;;;;;;;;29732:106;;;;:::i;:::-;29710:128;;29886:1;29863:19;:24;;29947:7;29896:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;29855:102;;;;;-1:-1:-1;;;29855:102:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;29975:28:0;;:22;:28;;;;;;;;;;;:59;;;30142:15;:21;;;;;;;:28;;:58;;;;:21;:28;;30164:5;;30142:28;:::i;:::-;;;;;;;;;;;;;;:42;;:58;28812:1407;;;28652:1567;;;;:::o;25437:2849::-;-1:-1:-1;;;;;25669:21:0;;25650:16;25669:21;;;:15;:21;;;;;;:28;;;;25691:5;;25669:28;:::i;:::-;;;;;;;;;;;;;:41;;;25650:60;;25721:14;25742:15;:21;25758:4;-1:-1:-1;;;;;25742:21:0;-1:-1:-1;;;;;25742:21:0;;;;;;;;;;;;25764:5;25742:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;-1:-1:-1;25793:12:0;15582:16;15523:2;15582;:16;:::i;:::-;-1:-1:-1;;;;;25820:21:0;;;;;;:15;:21;;;;;;;:28;;;;25842:5;;25820:28;:::i;:::-;;;;;;;;;;;;;:42;;;25808:74;;;;:::i;:::-;25793:89;-1:-1:-1;25893:20:0;15655:26;15476:1;15523:2;15655:26;:::i;:::-;15650:32;;:2;:32;:::i;:::-;25952:26;;:8;:26;:::i;:::-;-1:-1:-1;;;;;25920:28:0;;:22;:28;;;;;;;;;;;25916:62;;;;:::i;:::-;25893:85;;26075:17;26131:8;26118:10;26097:17;26101:12;26097:3;:17::i;:::-;26096:32;;;;:::i;:::-;:43;;;;:::i;:::-;26075:65;-1:-1:-1;15655:26:0;15476:1;15523:2;15655:26;:::i;:::-;15650:32;;:2;:32;:::i;:::-;26165:27;;:9;:27;:::i;:::-;26153:39;;26225:1;26213:9;:13;26275:7;26235:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;26205:80;;;;;-1:-1:-1;;;26205:80:0;;;;;;;;:::i;:::-;;26326:1;26312:11;:15;:35;;;;;26346:1;26331:12;:16;26312:35;26311:94;;;;26383:1;26369:11;:15;:35;;;;;26403:1;26388:12;:16;26369:35;26310:153;;;;;26446:17;26450:12;26446:3;:17::i;:::-;26427:16;26431:11;26427:3;:16::i;:::-;:36;26310:153;26306:544;;;15582:16;15523:2;15582;:16;:::i;:::-;26625:22;26638:9;26625:10;:22;:::i;:::-;26611:37;;:12;:37;:::i;:::-;:55;;;;:::i;:::-;26581:8;26569:10;26551:17;26555:12;26551:3;:17::i;:::-;:28;;;;:::i;:::-;:39;;;;:::i;:::-;26513:77;;:16;:77;:::i;:::-;:153;;;;:::i;:::-;26494:172;-1:-1:-1;26713:39:0;26742:8;26717:23;26730:10;26717:12;:23;:::i;:::-;:34;;;;:::i;:::-;26713:3;:39::i;:::-;26697:55;;:13;:55;:::i;:::-;26681:71;-1:-1:-1;26781:26:0;26795:12;26781:11;:26;:::i;:::-;26767:40;;26837:1;26822:16;;26306:544;26892:17;;;:77;;;26948:1;26933:12;:16;:35;;;;;26967:1;26953:11;:15;26933:35;26892:136;;;;27007:1;26992:12;:16;:35;;;;;27026:1;27012:11;:15;26992:35;26888:851;;;27102:37;27129:8;27106:21;27118:9;27106:11;:21;:::i;27102:37::-;27066:73;;:16;:73;:::i;:::-;27047:92;-1:-1:-1;27186:37:0;27213:8;27190:21;27202:9;27190:11;:21;:::i;27186:37::-;27170:53;;:13;:53;:::i;:::-;27154:69;-1:-1:-1;27304:26:0;27319:11;27304:12;:26;:::i;:::-;27278:21;27290:9;27278:11;:21;:::i;:::-;27252:23;27265:10;27252:12;:23;:::i;:::-;:47;;;;:::i;:::-;27251:80;;;;:::i;:::-;27238:93;;26888:851;;;15582:16;15523:2;15582;:16;:::i;:::-;27601:22;27614:9;27601:10;:22;:::i;:::-;27588:36;;:11;:36;:::i;:::-;:54;;;;:::i;:::-;27559:8;27547:10;27530:16;27534:11;27530:3;:16::i;:::-;:27;;;;:::i;:::-;:38;;;;:::i;:::-;27493:75;;:16;:75;:::i;:::-;:149;;;;:::i;:::-;27474:168;-1:-1:-1;27689:38:0;27717:8;27693:22;27705:10;27693:11;:22;:::i;27689:38::-;27673:54;;:13;:54;:::i;:::-;27657:70;;26888:851;27787:1;27767:16;:21;;27848:7;27797:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;27759:99;;;;;-1:-1:-1;;;27759:99:0;;;;;;;;:::i;:::-;;27894:1;27877:13;:18;;27952:7;27904:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;27869:93;;;;;-1:-1:-1;;;27869:93:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;27983:28:0;;:22;:28;;;;;;;;;;;:56;;;28136:15;:21;;;;;;;:28;;28186:10;;28136:21;:28;;28158:5;;28136:28;:::i;:::-;;;;;;;;;;;;;;:39;;:61;28252:26;28267:11;28252:12;:26;:::i;:::-;-1:-1:-1;;;;;28208:21:0;;;;;;:15;:21;;;;;;;:28;;;;28230:5;;28208:28;:::i;:::-;;;;;;;;;;;;;;:41;;:70;-1:-1:-1;;;;;;;;;;;25437:2849:0:o;19811:1097::-;19933:44;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19933:44:0;20212:39;;;20295:22;;;;;20262:30;;;:55;20472:23;;;;:27;20468:256;;15655:26;15476:1;15523:2;15655:26;:::i;:::-;15650:32;;:2;:32;:::i;:::-;15582:16;15523:2;15582;:16;:::i;:::-;20661:33;;;;:::i;:::-;20629:9;:23;;;20592:9;:20;;;20561:27;20565:9;:22;;;20561:3;:27::i;:::-;20556:56;;;;:::i;:::-;:96;;;;:::i;:::-;20555:140;;;;:::i;:::-;20516:36;;;:179;20468:256;15655:26;15476:1;15523:2;15655:26;:::i;:::-;15650:32;;:2;:32;:::i;:::-;20770:9;:20;;;:44;;;;:::i;:::-;20739:28;;;:75;20876:23;;;;;20842:31;;;:57;;;;20739:17;19811:1097;-1:-1:-1;19811:1097:0:o;9774:248::-;9945:68;;-1:-1:-1;;;;;27303:15:1;;;9945:68:0;;;27285:34:1;27355:15;;27335:18;;;27328:43;27387:18;;;27380:34;;;9918:96:0;;9938:5;;-1:-1:-1;;;9968:27:0;27220:18:1;;9945:68:0;27045:375:1;9918:96:0;9774:248;;;;:::o;12128:716::-;12552:23;12578:69;12606:4;12578:69;;;;;;;;;;;;;;;;;12586:5;-1:-1:-1;;;;;12578:27:0;;;:69;;;;;:::i;:::-;12662:17;;12552:95;;-1:-1:-1;12662:21:0;12658:179;;12759:10;12748:30;;;;;;;;;;;;:::i;:::-;12740:85;;;;-1:-1:-1;;;12740:85:0;;27877:2:1;12740:85:0;;;27859:21:1;27916:2;27896:18;;;27889:30;27955:34;27935:18;;;27928:62;-1:-1:-1;;;28006:18:1;;;27999:40;28056:19;;12740:85:0;27675:406:1;4504:229:0;4641:12;4673:52;4695:6;4703:4;4709:1;4712:12;4673:21;:52::i;:::-;4666:59;;4504:229;;;;;;:::o;5624:510::-;5794:12;5852:5;5827:21;:30;;5819:81;;;;-1:-1:-1;;;5819:81:0;;28288:2:1;5819:81:0;;;28270:21:1;28327:2;28307:18;;;28300:30;28366:34;28346:18;;;28339:62;-1:-1:-1;;;28417:18:1;;;28410:36;28463:19;;5819:81:0;28086:402:1;5819:81:0;2021:20;;5911:60;;;;-1:-1:-1;;;5911:60:0;;28695:2:1;5911:60:0;;;28677:21:1;28734:2;28714:18;;;28707:30;28773:31;28753:18;;;28746:59;28822:18;;5911:60:0;28493:353:1;5911:60:0;5985:12;5999:23;6026:6;-1:-1:-1;;;;;6026:11:0;6045:5;6052:4;6026:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5984:73;;;;6075:51;6092:7;6101:10;6113:12;6075:16;:51::i;:::-;6068:58;5624:510;-1:-1:-1;;;;;;;5624:510:0:o;8310:712::-;8460:12;8489:7;8485:530;;;-1:-1:-1;8520:10:0;8513:17;;8485:530;8634:17;;:21;8630:374;;8832:10;8826:17;8893:15;8880:10;8876:2;8872:19;8865:44;8630:374;8975:12;8968:20;;-1:-1:-1;;;8968:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:255;218:2;212:9;260:6;248:19;;297:18;282:34;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:2;373:22;146:255;:::o;406:257::-;478:4;472:11;;;510:17;;557:18;542:34;;578:22;;;539:62;536:88;;;604:18;;:::i;668:275::-;739:2;733:9;804:2;785:13;;-1:-1:-1;;781:27:1;769:40;;839:18;824:34;;860:22;;;821:62;818:88;;;886:18;;:::i;:::-;922:2;915:22;668:275;;-1:-1:-1;668:275:1:o;948:202::-;1027:4;1060:18;1052:6;1049:30;1046:56;;;1082:18;;:::i;:::-;-1:-1:-1;1127:1:1;1123:14;1139:4;1119:25;;948:202::o;1155:118::-;1241:5;1234:13;1227:21;1220:5;1217:32;1207:60;;1263:1;1260;1253:12;1278:128;1343:20;;1372:28;1343:20;1372:28;:::i;1411:163::-;1478:20;;1538:10;1527:22;;1517:33;;1507:61;;1564:1;1561;1554:12;1579:159;1646:20;;1706:6;1695:18;;1685:29;;1675:57;;1728:1;1725;1718:12;1743:531;1786:5;1839:3;1832:4;1824:6;1820:17;1816:27;1806:55;;1857:1;1854;1847:12;1806:55;1893:6;1880:20;1919:18;1915:2;1912:26;1909:52;;;1941:18;;:::i;:::-;1985:55;2028:2;2009:13;;-1:-1:-1;;2005:27:1;2034:4;2001:38;1985:55;:::i;:::-;2065:2;2056:7;2049:19;2111:3;2104:4;2099:2;2091:6;2087:15;2083:26;2080:35;2077:55;;;2128:1;2125;2118:12;2077:55;2193:2;2186:4;2178:6;2174:17;2167:4;2158:7;2154:18;2141:55;2241:1;2216:16;;;2234:4;2212:27;2205:38;;;;2220:7;1743:531;-1:-1:-1;;;1743:531:1:o;2279:2459::-;2399:6;2430:2;2473;2461:9;2452:7;2448:23;2444:32;2441:52;;;2489:1;2486;2479:12;2441:52;2529:9;2516:23;2558:18;2599:2;2591:6;2588:14;2585:34;;;2615:1;2612;2605:12;2585:34;2653:6;2642:9;2638:22;2628:32;;2698:7;2691:4;2687:2;2683:13;2679:27;2669:55;;2720:1;2717;2710:12;2669:55;2756:2;2743:16;2779:79;2795:62;2854:2;2795:62;:::i;:::-;2779:79;:::i;:::-;2892:15;;;2974:1;2970:10;;;;2962:19;;2958:28;;;2923:12;;;;2998:19;;;2995:39;;;3030:1;3027;3020:12;2995:39;3062:2;3058;3054:11;3074:1634;3090:6;3085:3;3082:15;3074:1634;;;3176:3;3163:17;3212:2;3199:11;3196:19;3193:109;;;3256:1;3285:2;3281;3274:14;3193:109;3325:20;;3368:6;3398:16;;;-1:-1:-1;;3394:30:1;3390:39;-1:-1:-1;3387:129:1;;;3470:1;3499:2;3495;3488:14;3387:129;3542:22;;:::i;:::-;3591:28;3615:2;3611;3607:11;3591:28;:::i;:::-;3584:5;3577:43;3643:2;3681:30;3707:2;3703;3699:11;3681:30;:::i;:::-;3676:2;3669:5;3665:14;3658:54;3736:2;3774:31;3800:3;3796:2;3792:12;3774:31;:::i;:::-;3769:2;3762:5;3758:14;3751:55;3830:3;3819:14;;3870:31;3896:3;3892:2;3888:12;3870:31;:::i;:::-;3864:3;3857:5;3853:15;3846:56;;3926:3;3987;3983:2;3979:12;3966:26;3960:3;3953:5;3949:15;3942:51;4017:3;4006:14;;4078:3;4074:2;4070:12;4057:26;4051:3;4044:5;4040:15;4033:51;;4108:3;4169;4165:2;4161:12;4148:26;4142:3;4135:5;4131:15;4124:51;4199:3;4188:14;;4239:31;4265:3;4261:2;4257:12;4239:31;:::i;:::-;4222:15;;;4215:56;4295:3;4335:31;4353:12;;;4335:31;:::i;:::-;4318:15;;;4311:56;4409:11;;;4396:25;;4437:16;;;4434:109;;;4495:1;4484:12;;4525:3;4520;4513:16;4434:109;4580:54;4626:7;4621:2;4610:8;4606:2;4602:17;4598:26;4580:54;:::i;:::-;4563:15;;;4556:79;-1:-1:-1;4648:18:1;;-1:-1:-1;;4686:12:1;;;;3107;;3074:1634;;;-1:-1:-1;4727:5:1;2279:2459;-1:-1:-1;;;;;;;;2279:2459:1:o;4743:180::-;4802:6;4855:2;4843:9;4834:7;4830:23;4826:32;4823:52;;;4871:1;4868;4861:12;4823:52;-1:-1:-1;4894:23:1;;4743:180;-1:-1:-1;4743:180:1:o;5318:131::-;-1:-1:-1;;;;;5393:31:1;;5383:42;;5373:70;;5439:1;5436;5429:12;5454:134;5522:20;;5551:31;5522:20;5551:31;:::i;5593:735::-;5705:6;5713;5721;5729;5737;5745;5798:3;5786:9;5777:7;5773:23;5769:33;5766:53;;;5815:1;5812;5805:12;5766:53;5854:9;5841:23;5873:31;5898:5;5873:31;:::i;:::-;5923:5;-1:-1:-1;5975:2:1;5960:18;;5947:32;;-1:-1:-1;6026:2:1;6011:18;;5998:32;;-1:-1:-1;6081:2:1;6066:18;;6053:32;6108:18;6097:30;;6094:50;;;6140:1;6137;6130:12;6094:50;6163;6205:7;6196:6;6185:9;6181:22;6163:50;:::i;:::-;6153:60;;;6260:3;6249:9;6245:19;6232:33;6222:43;;6284:38;6317:3;6306:9;6302:19;6284:38;:::i;:::-;6274:48;;5593:735;;;;;;;;:::o;6333:1114::-;6488:6;6496;6504;6512;6520;6528;6536;6544;6552;6560;6613:3;6601:9;6592:7;6588:23;6584:33;6581:53;;;6630:1;6627;6620:12;6581:53;6653:26;6669:9;6653:26;:::i;:::-;6643:36;;6698:38;6732:2;6721:9;6717:18;6698:38;:::i;:::-;6688:48;;6755:38;6789:2;6778:9;6774:18;6755:38;:::i;:::-;6745:48;;6844:2;6833:9;6829:18;6816:32;6867:18;6908:2;6900:6;6897:14;6894:34;;;6924:1;6921;6914:12;6894:34;6947:50;6989:7;6980:6;6969:9;6965:22;6947:50;:::i;:::-;6937:60;;7044:3;7033:9;7029:19;7016:33;7006:43;;7096:3;7085:9;7081:19;7068:33;7058:43;;7148:3;7137:9;7133:19;7120:33;7110:43;;7172:38;7205:3;7194:9;7190:19;7172:38;:::i;:::-;7162:48;;7229:38;7262:3;7251:9;7247:19;7229:38;:::i;:::-;7219:48;;7320:3;7309:9;7305:19;7292:33;7276:49;;7350:2;7340:8;7337:16;7334:36;;;7366:1;7363;7356:12;7334:36;;7389:52;7433:7;7422:8;7411:9;7407:24;7389:52;:::i;:::-;7379:62;;;6333:1114;;;;;;;;;;;;;:::o;7676:247::-;7735:6;7788:2;7776:9;7767:7;7763:23;7759:32;7756:52;;;7804:1;7801;7794:12;7756:52;7843:9;7830:23;7862:31;7887:5;7862:31;:::i;7928:258::-;8000:1;8010:113;8024:6;8021:1;8018:13;8010:113;;;8100:11;;;8094:18;8081:11;;;8074:39;8046:2;8039:10;8010:113;;;8141:6;8138:1;8135:13;8132:48;;;-1:-1:-1;;8176:1:1;8158:16;;8151:27;7928:258::o;8191:::-;8233:3;8271:5;8265:12;8298:6;8293:3;8286:19;8314:63;8370:6;8363:4;8358:3;8354:14;8347:4;8340:5;8336:16;8314:63;:::i;:::-;8431:2;8410:15;-1:-1:-1;;8406:29:1;8397:39;;;;8438:4;8393:50;;8191:258;-1:-1:-1;;8191:258:1:o;8454:1463::-;8724:4;8753:2;8793;8782:9;8778:18;8823:6;8812:9;8805:25;8849:2;8887:6;8882:2;8871:9;8867:18;8860:34;8913:2;8951;8946;8935:9;8931:18;8924:30;8974:6;9009;9003:13;9040:6;9032;9025:22;9066:3;9056:13;;9100:2;9089:9;9085:18;9078:25;;9162:2;9152:6;9149:1;9145:14;9134:9;9130:30;9126:39;9200:2;9192:6;9188:15;9221:1;9231:657;9245:6;9242:1;9239:13;9231:657;;;9338:3;9334:8;9322:9;9314:6;9310:22;9306:37;9301:3;9294:50;9373:6;9367:13;9403:4;9446:2;9440:9;9477:2;9469:6;9462:18;9507:48;9551:2;9543:6;9539:15;9525:12;9507:48;:::i;:::-;9598:11;;;9592:18;9575:15;;;9568:43;9654:11;;;9648:18;9631:15;;;9624:43;9710:11;;;9704:18;9687:15;;;9680:43;9766:11;;;9760:18;9743:15;;;9736:43;;;;-1:-1:-1;9866:12:1;;;;9493:62;-1:-1:-1;9831:15:1;;;;9267:1;9260:9;9231:657;;;-1:-1:-1;9905:6:1;;8454:1463;-1:-1:-1;;;;;;;;;;;;8454:1463:1:o;9922:322::-;9991:6;10044:2;10032:9;10023:7;10019:23;10015:32;10012:52;;;10060:1;10057;10050:12;10012:52;10100:9;10087:23;10133:18;10125:6;10122:30;10119:50;;;10165:1;10162;10155:12;10119:50;10188;10230:7;10221:6;10210:9;10206:22;10188:50;:::i;10441:2452::-;10554:6;10585:2;10628;10616:9;10607:7;10603:23;10599:32;10596:52;;;10644:1;10641;10634:12;10596:52;10684:9;10671:23;10713:18;10754:2;10746:6;10743:14;10740:34;;;10770:1;10767;10760:12;10740:34;10808:6;10797:9;10793:22;10783:32;;10853:7;10846:4;10842:2;10838:13;10834:27;10824:55;;10875:1;10872;10865:12;10824:55;10911:2;10898:16;10934:79;10950:62;11009:2;10950:62;:::i;10934:79::-;11047:15;;;11129:1;11125:10;;;;11117:19;;11113:28;;;11078:12;;;;11153:19;;;11150:39;;;11185:1;11182;11175:12;11150:39;11217:2;11213;11209:11;11229:1634;11245:6;11240:3;11237:15;11229:1634;;;11331:3;11318:17;11367:2;11354:11;11351:19;11348:39;;;11383:1;11380;11373:12;11348:39;11410:20;;11453:6;11483:16;;;-1:-1:-1;;11479:30:1;11475:39;-1:-1:-1;11472:59:1;;;11527:1;11524;11517:12;11472:59;11557:22;;:::i;:::-;11606:28;11630:2;11626;11622:11;11606:28;:::i;:::-;11599:5;11592:43;11671:31;11698:2;11694;11690:11;11671:31;:::i;:::-;11666:2;11659:5;11655:14;11648:55;11739:31;11766:2;11762;11758:11;11739:31;:::i;:::-;11734:2;11727:5;11723:14;11716:55;11794:3;11847:2;11843;11839:11;11826:25;11880:2;11870:8;11867:16;11864:106;;;11924:1;11953:2;11949;11942:14;11864:106;12006:54;12052:7;12047:2;12036:8;12032:2;12028:17;12024:26;12006:54;:::i;:::-;12001:2;11994:5;11990:14;11983:78;;12084:3;12144:2;12140;12136:11;12123:25;12118:2;12111:5;12107:14;12100:49;12173:3;12162:14;;12233:3;12229:2;12225:12;12212:26;12207:2;12200:5;12196:14;12189:50;;12263:3;12324;12320:2;12316:12;12303:26;12297:3;12290:5;12286:15;12279:51;12354:3;12343:14;;12394:31;12420:3;12416:2;12412:12;12394:31;:::i;:::-;12377:15;;;12370:56;12450:3;12490:31;12508:12;;;12490:31;:::i;:::-;12473:15;;;12466:56;12564:11;;;12551:25;;12592:16;;;12589:109;;;12650:1;12639:12;;12680:3;12675;12668:16;12589:109;12735:54;12781:7;12776:2;12765:8;12761:2;12757:17;12753:26;12735:54;:::i;:::-;12718:15;;;12711:79;-1:-1:-1;12803:18:1;;-1:-1:-1;;12841:12:1;;;;11262;;11229:1634;;12898:1294;13008:6;13039:2;13082;13070:9;13061:7;13057:23;13053:32;13050:52;;;13098:1;13095;13088:12;13050:52;13138:9;13125:23;13171:18;13163:6;13160:30;13157:50;;;13203:1;13200;13193:12;13157:50;13226:22;;13279:4;13271:13;;13267:27;-1:-1:-1;13257:55:1;;13308:1;13305;13298:12;13257:55;13344:2;13331:16;13367:79;13383:62;13442:2;13383:62;:::i;13367:79::-;13480:15;;;13562:1;13558:10;;;;13550:19;;13546:28;;;13511:12;;;;13586:19;;;13583:39;;;13618:1;13615;13608:12;13583:39;13642:11;;;;13662:500;13678:6;13673:3;13670:15;13662:500;;;13760:4;13754:3;13745:7;13741:17;13737:28;13734:118;;;13806:1;13835:2;13831;13824:14;13734:118;13878:22;;:::i;:::-;13941:3;13928:17;13958:33;13983:7;13958:33;:::i;:::-;14004:22;;14075:12;;;14062:26;14046:14;;;14039:50;14102:18;;13704:4;13695:14;;;;14140:12;;;;13662:500;;14561:315;14629:6;14637;14690:2;14678:9;14669:7;14665:23;14661:32;14658:52;;;14706:1;14703;14696:12;14658:52;14745:9;14732:23;14764:31;14789:5;14764:31;:::i;:::-;14814:5;14866:2;14851:18;;;;14838:32;;-1:-1:-1;;;14561:315:1:o;14881:127::-;14942:10;14937:3;14933:20;14930:1;14923:31;14973:4;14970:1;14963:15;14997:4;14994:1;14987:15;15013:380;15092:1;15088:12;;;;15135;;;15156:61;;15210:4;15202:6;15198:17;15188:27;;15156:61;15263:2;15255:6;15252:14;15232:18;15229:38;15226:161;;15309:10;15304:3;15300:20;15297:1;15290:31;15344:4;15341:1;15334:15;15372:4;15369:1;15362:15;15226:161;;15013:380;;;:::o;15398:127::-;15459:10;15454:3;15450:20;15447:1;15440:31;15490:4;15487:1;15480:15;15514:4;15511:1;15504:15;15530:135;15569:3;15590:17;;;15587:43;;15610:18;;:::i;:::-;-1:-1:-1;15657:1:1;15646:13;;15530:135::o;15796:1099::-;15924:3;15953:1;15986:6;15980:13;16016:3;16038:1;16066:9;16062:2;16058:18;16048:28;;16126:2;16115:9;16111:18;16148;16138:61;;16192:4;16184:6;16180:17;16170:27;;16138:61;16218:2;16266;16258:6;16255:14;16235:18;16232:38;16229:165;;-1:-1:-1;;;16293:33:1;;16349:4;16346:1;16339:15;16379:4;16300:3;16367:17;16229:165;16410:18;16437:104;;;;16555:1;16550:320;;;;16403:467;;16437:104;-1:-1:-1;;16470:24:1;;16458:37;;16515:16;;;;-1:-1:-1;16437:104:1;;16550:320;15743:1;15736:14;;;15780:4;15767:18;;16645:1;16659:165;16673:6;16670:1;16667:13;16659:165;;;16751:14;;16738:11;;;16731:35;16794:16;;;;16688:10;;16659:165;;;16663:3;;16853:6;16848:3;16844:16;16837:23;;16403:467;-1:-1:-1;16886:3:1;;15796:1099;-1:-1:-1;;;;;;;;15796:1099:1:o;16900:197::-;16938:3;16966:6;17007:2;17000:5;16996:14;17034:2;17025:7;17022:15;17019:41;;17040:18;;:::i;:::-;17089:1;17076:15;;16900:197;-1:-1:-1;;;16900:197:1:o;17102:276::-;17233:3;17271:6;17265:13;17287:53;17333:6;17328:3;17321:4;17313:6;17309:17;17287:53;:::i;:::-;17356:16;;;;;17102:276;-1:-1:-1;;17102:276:1:o;17383:422::-;17472:1;17515:5;17472:1;17529:270;17550:7;17540:8;17537:21;17529:270;;;17609:4;17605:1;17601:6;17597:17;17591:4;17588:27;17585:53;;;17618:18;;:::i;:::-;17668:7;17658:8;17654:22;17651:55;;;17688:16;;;;17651:55;17767:22;;;;17727:15;;;;17529:270;;;17533:3;17383:422;;;;;:::o;17810:806::-;17859:5;17889:8;17879:80;;-1:-1:-1;17930:1:1;17944:5;;17879:80;17978:4;17968:76;;-1:-1:-1;18015:1:1;18029:5;;17968:76;18060:4;18078:1;18073:59;;;;18146:1;18141:130;;;;18053:218;;18073:59;18103:1;18094:10;;18117:5;;;18141:130;18178:3;18168:8;18165:17;18162:43;;;18185:18;;:::i;:::-;-1:-1:-1;;18241:1:1;18227:16;;18256:5;;18053:218;;18355:2;18345:8;18342:16;18336:3;18330:4;18327:13;18323:36;18317:2;18307:8;18304:16;18299:2;18293:4;18290:12;18286:35;18283:77;18280:159;;;-1:-1:-1;18392:19:1;;;18424:5;;18280:159;18471:34;18496:8;18490:4;18471:34;:::i;:::-;18541:6;18537:1;18533:6;18529:19;18520:7;18517:32;18514:58;;;18552:18;;:::i;:::-;18590:20;;17810:806;-1:-1:-1;;;17810:806:1:o;18621:140::-;18679:5;18708:47;18749:4;18739:8;18735:19;18729:4;18708:47;:::i;18766:168::-;18806:7;18872:1;18868;18864:6;18860:14;18857:1;18854:21;18849:1;18842:9;18835:17;18831:45;18828:71;;;18879:18;;:::i;:::-;-1:-1:-1;18919:9:1;;18766:168::o;18939:553::-;18978:7;-1:-1:-1;;;;;19048:9:1;;;19076;;;19101:11;;;19120:10;;;19114:17;;19097:35;19094:61;;;19135:18;;:::i;:::-;-1:-1:-1;;;19211:1:1;19204:9;;19229:11;;;19249;;;19242:19;;19225:37;19222:63;;;19265:18;;:::i;:::-;19311:1;19308;19304:9;19294:19;;19358:1;19354:2;19349:11;19346:1;19342:19;19337:2;19333;19329:11;19325:37;19322:63;;;19365:18;;:::i;:::-;19430:1;19426:2;19421:11;19418:1;19414:19;19409:2;19405;19401:11;19397:37;19394:63;;;19437:18;;:::i;:::-;-1:-1:-1;;;19477:9:1;;;;;18939:553;-1:-1:-1;;;18939:553:1:o;19497:127::-;19558:10;19553:3;19549:20;19546:1;19539:31;19589:4;19586:1;19579:15;19613:4;19610:1;19603:15;19629:193;19668:1;19694;19684:35;;19699:18;;:::i;:::-;-1:-1:-1;;;19735:18:1;;-1:-1:-1;;19755:13:1;;19731:38;19728:64;;;19772:18;;:::i;:::-;-1:-1:-1;19806:10:1;;19629:193::o;19827:184::-;19897:6;19950:2;19938:9;19929:7;19925:23;19921:32;19918:52;;;19966:1;19963;19956:12;19918:52;-1:-1:-1;19989:16:1;;19827:184;-1:-1:-1;19827:184:1:o;20016:442::-;20278:25;20273:3;20266:38;20248:3;20333:6;20327:13;20349:62;20404:6;20399:2;20394:3;20390:12;20383:4;20375:6;20371:17;20349:62;:::i;:::-;20431:16;;;;20449:2;20427:25;;20016:442;-1:-1:-1;;20016:442:1:o;20463:220::-;20612:2;20601:9;20594:21;20575:4;20632:45;20673:2;20662:9;20658:18;20650:6;20632:45;:::i;20688:136::-;20723:3;-1:-1:-1;;;20744:22:1;;20741:48;;20769:18;;:::i;:::-;-1:-1:-1;20809:1:1;20805:13;;20688:136::o;20829:956::-;21175:4;21204:3;21248:6;21241:14;21234:22;21223:9;21216:41;21293:2;21288;21277:9;21273:18;21266:30;21319:45;21360:2;21349:9;21345:18;21337:6;21319:45;:::i;:::-;21305:59;;21400:6;21395:2;21384:9;21380:18;21373:34;21443:6;21438:2;21427:9;21423:18;21416:34;21487:6;21481:3;21470:9;21466:19;21459:35;21513:6;21568:2;21560:6;21556:15;21550:3;21539:9;21535:19;21528:44;21621:2;21613:6;21609:15;21603:3;21592:9;21588:19;21581:44;;21674:9;21666:6;21662:22;21656:3;21645:9;21641:19;21634:51;21702:33;21728:6;21720;21702:33;:::i;:::-;21694:41;;;21772:6;21766:3;21755:9;21751:19;21744:35;20829:956;;;;;;;;;;;;:::o;21790:195::-;21828:4;21865;21862:1;21858:12;21897:4;21894:1;21890:12;21922:3;21917;21914:12;21911:38;;;21929:18;;:::i;:::-;21966:13;;;21790:195;-1:-1:-1;;;21790:195:1:o;21990:120::-;22030:1;22056;22046:35;;22061:18;;:::i;:::-;-1:-1:-1;22095:9:1;;21990:120::o;22115:128::-;22155:3;22186:1;22182:6;22179:1;22176:13;22173:39;;;22192:18;;:::i;:::-;-1:-1:-1;22228:9:1;;22115:128::o;22248:112::-;22280:1;22306;22296:35;;22311:18;;:::i;:::-;-1:-1:-1;22345:9:1;;22248:112::o;22365:125::-;22405:4;22433:1;22430;22427:8;22424:34;;;22438:18;;:::i;:::-;-1:-1:-1;22475:9:1;;22365:125::o;23098:569::-;23203:6;23211;23219;23227;23235;23288:3;23276:9;23267:7;23263:23;23259:33;23256:53;;;23305:1;23302;23295:12;23256:53;23337:9;23331:16;23356:31;23381:5;23356:31;:::i;:::-;23406:5;23396:15;;;23451:2;23440:9;23436:18;23430:25;23420:35;;23495:2;23484:9;23480:18;23474:25;23464:35;;23539:2;23528:9;23524:18;23518:25;23508:35;;23588:3;23577:9;23573:19;23567:26;23602:33;23627:7;23602:33;:::i;:::-;23654:7;23644:17;;;23098:569;;;;;;;;:::o;24708:442::-;24970:25;24965:3;24958:38;24940:3;25025:6;25019:13;25041:62;25096:6;25091:2;25086:3;25082:12;25075:4;25067:6;25063:17;25041:62;:::i;25155:267::-;25194:4;25223:9;;;25248:10;;-1:-1:-1;;;25267:19:1;;25260:27;;25244:44;25241:70;;;25291:18;;:::i;:::-;-1:-1:-1;;;;;25338:27:1;;25331:35;;25323:44;;25320:70;;;25370:18;;:::i;:::-;-1:-1:-1;;25407:9:1;;25155:267::o;25427:449::-;25689:32;25684:3;25677:45;25659:3;25751:6;25745:13;25767:62;25822:6;25817:2;25812:3;25808:12;25801:4;25793:6;25789:17;25767:62;:::i;:::-;25849:16;;;;25867:2;25845:25;;25427:449;-1:-1:-1;;25427:449:1:o;25881:265::-;25920:3;25948:9;;;25973:10;;-1:-1:-1;;;;;25992:27:1;;;25985:35;;25969:52;25966:78;;;26024:18;;:::i;:::-;-1:-1:-1;;;26071:19:1;;;26064:27;;26056:36;;26053:62;;;26095:18;;:::i;:::-;-1:-1:-1;;26131:9:1;;25881:265::o;26151:438::-;-1:-1:-1;;;26408:3:1;26401:34;26383:3;26464:6;26458:13;26480:62;26535:6;26530:2;26525:3;26521:12;26514:4;26506:6;26502:17;26480:62;:::i;:::-;26562:16;;;;26580:2;26558:25;;26151:438;-1:-1:-1;;26151:438:1:o;26594:446::-;26856:29;26851:3;26844:42;26826:3;26915:6;26909:13;26931:62;26986:6;26981:2;26976:3;26972:12;26965:4;26957:6;26953:17;26931:62;:::i;:::-;27013:16;;;;27031:2;27009:25;;26594:446;-1:-1:-1;;26594:446:1:o;27425:245::-;27492:6;27545:2;27533:9;27524:7;27520:23;27516:32;27513:52;;;27561:1;27558;27551:12;27513:52;27593:9;27587:16;27612:28;27634:5;27612:28;:::i

Swarm Source

ipfs://b296139f90aad166ee04b57b9eca0ce6581734a9950c4a6815b19c1b501b904e
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading