Contract 0xCAEc650502F15c1a6bFf1C2288fC8F819776B2eC 1

 

Contract Overview

CAP Finance: Trading
Balance:
14.66267117244123982 ETH

ETH Value:
$26,222.43 (@ $1,788.38/ETH)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xeb28530af3804330eac34efce7d5b5ec4d1d070fe84f66958d3cc46425988427Submit Close Ord...64939262022-02-20 21:14:4694 days 16 hrs ago0x85bd9a7dbe28f97aa157e84ef6b249b9a249fcf0 IN  CAP Finance: Trading0 ETH0.000341123437 ETH
0xb551a71422dd496eebe6e9af8fa742b886a8d646a2a82ed47b9a6c8f4cc85bceSubmit Close Ord...62863422022-02-18 2:33:5097 days 11 hrs ago0xfac7323bcd5fb95a4ffd9a82d390c1796af65f88 IN  CAP Finance: Trading0 ETH0.000384787898 ETH
0xa54acb0158ea0fbff05959b9d992bffadf04fe84b92b7dc2f55e4daf846399b8Submit Close Ord...62847352022-02-18 1:51:3197 days 11 hrs ago0x811ea488c0a58e08737e67aab42c29fae63a649c IN  CAP Finance: Trading0 ETH0.000363646244 ETH
0x632ed544b1f6c8b289eed49fda3185ab09db30b3d83e01286b6d5ebaceaf75c2Submit Close Ord...62361802022-02-17 9:56:1398 days 3 hrs ago0xf5dcafa051318bdfdb6f5a78ad5086b1538322c5 IN  CAP Finance: Trading0 ETH0.000341027089 ETH
0x4378adba1b4c4b6c73690da544434cd3b8c85c5184e67e4e35707dd33231304aSubmit Close Ord...61970932022-02-16 19:47:1298 days 17 hrs ago0x349048fdc56f6ffd3fa511a300b69de7069a11bd IN  CAP Finance: Trading0 ETH0.000374379087 ETH
0x51dfc7faa5325077b365a888d93aa0d134ca03e3a4f5dbdc3d1dde468a827297Submit Close Ord...61687822022-02-16 9:48:1299 days 3 hrs ago0x1dd410550cae26e5d28560f77f8757b8ccf0e4dc IN  CAP Finance: Trading0 ETH0.000337318682 ETH
0x3d8a0d4cf2227d001890857139c9d629de10b34eed41ce84e6a66646c623c14cSubmit Close Ord...61353442022-02-15 22:25:1299 days 15 hrs ago0x92b1b677728e36734d59067a4ce53e5bf1f3a2ab IN  CAP Finance: Trading0 ETH0.000309178847 ETH
0xdcd4dfa32dce1852f5fb9c21150d6af9212a7d31366631bcd0562568ab098d8fSubmit Close Ord...60083502022-02-14 0:03:36101 days 13 hrs ago0x96942e59d8f8b5b92c257bc9c8e6c36b73ebb50d IN  CAP Finance: Trading0 ETH0.000315377214 ETH
0x2c9d359f662147f38fe90a60b84cf65ff98b1e77365c30575ed4484040ec638eSubmit Close Ord...60040392022-02-13 22:08:52101 days 15 hrs ago0xbbc3205297617d52eb78e89331134df27487b381 IN  CAP Finance: Trading0 ETH0.000321097164 ETH
0x71ebb374fa1cb9a379051f8ca9f4f48dca0409005101b999c40198bc4d17fd1bSubmit Close Ord...58862702022-02-11 23:33:58103 days 14 hrs ago0xefd0199657b444856e3259ed8e3c39ee43cf51dc IN  CAP Finance: Trading0 ETH0.000439480788 ETH
0xa2bd587b99f21df1a97538d313f6c4520e86d6fdcae6e585a502bb58aaea89d4Submit Close Ord...58843022022-02-11 22:51:26103 days 14 hrs ago0xb96eb6e9e7bb57c1e9e6d7837914114f4dd0d682 IN  CAP Finance: Trading0 ETH0.000413811659 ETH
0xf7a960cf3dc6f0b513186231de62a69bd1037626c9fd968b50a593a7a0911fb0Submit Close Ord...58814722022-02-11 21:58:35103 days 15 hrs ago0xf5dcafa051318bdfdb6f5a78ad5086b1538322c5 IN  CAP Finance: Trading0 ETH0.000398995712 ETH
0x406b1d7b023e592eacfc983688b33d5c834ae65db37387a29c9b0a7bf61003c9Submit Close Ord...58784002022-02-11 20:52:39103 days 16 hrs ago0xf5dcafa051318bdfdb6f5a78ad5086b1538322c5 IN  CAP Finance: Trading0 ETH0.000398995712 ETH
0xe005696f0e74b8e86eb014abff55906760ad3ffb670d5a75a0010ed5b931be98Submit Close Ord...58731092022-02-11 19:18:53103 days 18 hrs ago0xf5dcafa051318bdfdb6f5a78ad5086b1538322c5 IN  CAP Finance: Trading0 ETH0.000402547535 ETH
0xda332c3e9f7ad0a479e795eb68ec077f7e2b58c512c45368721b46bb0e3cdc7cSubmit Close Ord...58535042022-02-11 12:03:19104 days 1 hr ago0xf5dcafa051318bdfdb6f5a78ad5086b1538322c5 IN  CAP Finance: Trading0 ETH0.000404549537 ETH
0x3b6c7518e6e235b8aa52212e19bda906a3dd6c92b63d921045af6885a6b97f74Submit Close Ord...58534802022-02-11 12:02:51104 days 1 hr ago0xf5dcafa051318bdfdb6f5a78ad5086b1538322c5 IN  CAP Finance: Trading0 ETH0.000404549537 ETH
0xe71de13ca3a04b864378ec8cb28c0226dfe57cb732c5b7c1e23477a69b2a3264Submit Close Ord...58531232022-02-11 11:52:40104 days 1 hr ago0xf5dcafa051318bdfdb6f5a78ad5086b1538322c5 IN  CAP Finance: Trading0 ETH0.00040352122 ETH
0x1b7c93862c4d5a1b61fececbd6fdf30d51a8e4ad2f17a3afa82a024100d6f15dSubmit Close Ord...58066392022-02-10 17:49:47104 days 19 hrs ago0x45da535f21331dcb238f6e8fe2e9715028249d74 IN  CAP Finance: Trading0 ETH0.000446086188 ETH
0xadd213808aab09441f9aa034ed1ce17df1694b4493c6ea5efd40763f84fd3686Submit Close Ord...58043422022-02-10 17:00:30104 days 20 hrs ago0x45da535f21331dcb238f6e8fe2e9715028249d74 IN  CAP Finance: Trading0 ETH0.000418592579 ETH
0xc213b2de09794aea1f9f265a271923f44541f134761ff899146f44ad7005707fSubmit Close Ord...57975122022-02-10 15:03:58104 days 22 hrs ago0x441b4e0c78e944ee9125f0a932f9128b9d0b923f IN  CAP Finance: Trading0 ETH0.000371283565 ETH
0x6723a2c262515932c89a73684a58b13ce5b5503dff8fe8983665a0a3695cfe8cSubmit Close Ord...57925762022-02-10 13:44:53104 days 23 hrs ago0xc7978fc247c84ae009148de9914a38114f6aeb9b IN  CAP Finance: Trading0 ETH0.000402242385 ETH
0x9e0b06cd9bf07fb1068c5c3d1332a4a8be23bb403af6f99f1232f5559097f96aSubmit Close Ord...57665582022-02-10 3:21:35105 days 10 hrs ago0x45da535f21331dcb238f6e8fe2e9715028249d74 IN  CAP Finance: Trading0 ETH0.000453249295 ETH
0x10a2218d139ea58ff48564efd3c11006a6224e8c439a9196e7cf9096d4721398Submit Close Ord...57426002022-02-09 19:41:16105 days 17 hrs ago0x7dc1d4fb88b00bc26849ec2ea4d58e77e2d970c5 IN  CAP Finance: Trading0 ETH0.000423994752 ETH
0x99222b82a28ff9ec49d2a17c3402b600bef1959eca0ea98b439ef7fa38773a0aSubmit Close Ord...57425172022-02-09 19:38:27105 days 17 hrs ago0xf199f2c9db81d8359c9eaed16d7df8a1857d3fc3 IN  CAP Finance: Trading0 ETH0.000426116669 ETH
0x480bd8faf47dbcf2cb2b59494d1ce9899e94a5755732fc72c3b702cd351eb8adSubmit Close Ord...57412302022-02-09 19:08:52105 days 18 hrs ago0xefd0199657b444856e3259ed8e3c39ee43cf51dc IN  CAP Finance: Trading0 ETH0.00042886978 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x19c857fc7997ee4b9b5a29c064dab75a264a2146d7d862ed54c741b92c48f6ff64524272022-02-20 11:46:5295 days 1 hr ago CAP Finance: CAP Rewards ETH CAP Finance: Trading0 ETH
0x0999d104f2273f83094547a138b0567ac2e5a9d4f210f6de9d0c3961c52e0cb264524112022-02-20 11:46:5295 days 1 hr ago CAP Finance: Trading CAP Finance: Treasury0 ETH
0x0999d104f2273f83094547a138b0567ac2e5a9d4f210f6de9d0c3961c52e0cb264524112022-02-20 11:46:5295 days 1 hr ago CAP Finance: Trading CAP Finance: Treasury0.002 ETH
0x0999d104f2273f83094547a138b0567ac2e5a9d4f210f6de9d0c3961c52e0cb264524112022-02-20 11:46:5295 days 1 hr ago CAP Finance: Trading CAP Finance: Router0 ETH
0x0999d104f2273f83094547a138b0567ac2e5a9d4f210f6de9d0c3961c52e0cb264524112022-02-20 11:46:5295 days 1 hr ago CAP Finance: CAP Rewards USDC CAP Finance: Trading0 ETH
0x0999d104f2273f83094547a138b0567ac2e5a9d4f210f6de9d0c3961c52e0cb264524112022-02-20 11:46:5295 days 1 hr ago CAP Finance: CAP Rewards ETH CAP Finance: Trading0 ETH
0x0858fff07f048ff27832185bf467bc1a27cec02c5ba19e95a65cc3939d2d363c64427012022-02-20 9:04:4695 days 4 hrs ago CAP Finance: Trading CAP Finance: ETH Pool0 ETH
0x0858fff07f048ff27832185bf467bc1a27cec02c5ba19e95a65cc3939d2d363c64427012022-02-20 9:04:4695 days 4 hrs ago CAP Finance: Trading CAP Finance: Router0 ETH
0x0858fff07f048ff27832185bf467bc1a27cec02c5ba19e95a65cc3939d2d363c64427012022-02-20 9:04:4695 days 4 hrs ago CAP Finance: Trading CAP Finance: ETH Pool0.008 ETH
0x0858fff07f048ff27832185bf467bc1a27cec02c5ba19e95a65cc3939d2d363c64427012022-02-20 9:04:4695 days 4 hrs ago CAP Finance: Trading CAP Finance: Router0 ETH
0x0858fff07f048ff27832185bf467bc1a27cec02c5ba19e95a65cc3939d2d363c64427012022-02-20 9:04:4695 days 4 hrs ago CAP Finance: Trading CAP Finance: Router0 ETH
0x0858fff07f048ff27832185bf467bc1a27cec02c5ba19e95a65cc3939d2d363c64427012022-02-20 9:04:4695 days 4 hrs ago CAP Finance: Oracle CAP Finance: Trading0 ETH
0xb1c6cc1d21a47bdb18fb3b6ea2e05303846bb66cad14aa4818da666370724e3b64260522022-02-20 4:00:0495 days 9 hrs ago CAP Finance: ETH Rewards Pool CAP Finance: Trading0 ETH
0x6e268ca5c51c30895b481004111e1cd4765c2ccb4cdf10aa0139937007b9005763999642022-02-19 17:54:4795 days 19 hrs ago CAP Finance: CAP Rewards ETH CAP Finance: Trading0 ETH
0x25d39b62d81eaac11634d2bd592a0ac872060651b0c656bfbeeb531745eb749c63797162022-02-19 12:07:5196 days 1 hr ago CAP Finance: CAP Rewards USDC CAP Finance: Trading0 ETH
0x25d39b62d81eaac11634d2bd592a0ac872060651b0c656bfbeeb531745eb749c63797162022-02-19 12:07:5196 days 1 hr ago CAP Finance: CAP Rewards ETH CAP Finance: Trading0 ETH
0xa816f4e12d6d2961736dc581b3e4754386834bb4dc5d58f818829f336c4d92f363796552022-02-19 12:06:5096 days 1 hr ago CAP Finance: CAP Rewards ETH CAP Finance: Trading0 ETH
0x197e5f76ba38257947903a2af84f82806ff271ec87a3d8a46290a8acfa2017a463517132022-02-19 1:15:5696 days 12 hrs ago CAP Finance: CAP Rewards USDC CAP Finance: Trading0 ETH
0x24726583b961229b03ac27888b0f1fa0a8dd96148bfe5dfa51b1ac4e8f19f99463517062022-02-19 1:15:5696 days 12 hrs ago CAP Finance: CAP Rewards USDC CAP Finance: Trading0 ETH
0x24726583b961229b03ac27888b0f1fa0a8dd96148bfe5dfa51b1ac4e8f19f99463517062022-02-19 1:15:5696 days 12 hrs ago CAP Finance: CAP Rewards ETH CAP Finance: Trading0 ETH
0x7ff04c6e61fb633bde20744ac6d77bdbb66444000957281f54a355008e6e2a5f63450652022-02-18 22:38:5696 days 14 hrs ago CAP Finance: USDC Rewards Pool CAP Finance: Trading0 ETH
0xfd50fd18e62d95dade793815e86e3929daf6c0827905006f48f230e0d8019a1863411832022-02-18 21:09:2696 days 16 hrs ago CAP Finance: CAP Rewards ETH CAP Finance: Trading0 ETH
0x82a302d5e192d311301f4e93eab9ebfb0b74fdd9ae8b67e63662c2d752619cb763411702022-02-18 21:09:0696 days 16 hrs ago CAP Finance: CAP Rewards USDC CAP Finance: Trading0 ETH
0x82a302d5e192d311301f4e93eab9ebfb0b74fdd9ae8b67e63662c2d752619cb763411702022-02-18 21:09:0696 days 16 hrs ago CAP Finance: CAP Rewards ETH CAP Finance: Trading0 ETH
0xf4a7b0fd1a4b57f5291cd0c81fd38f23bd64702cf84cbab0b49cb37cf3ad52c263243062022-02-18 15:32:2896 days 22 hrs ago CAP Finance: USDC Rewards Pool CAP Finance: Trading0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Trading

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2021-11-18
*/

// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
 * @dev 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");
        }
    }
}

interface IRouter {
    function trading() external view returns (address);

    function capPool() external view returns (address);

    function oracle() external view returns (address);

    function treasury() external view returns (address);

    function darkOracle() external view returns (address);

    function isSupportedCurrency(address currency) external view returns (bool);

    function currencies(uint256 index) external view returns (address);

    function currenciesLength() external view returns (uint256);

    function getDecimals(address currency) external view returns(uint8);

    function getPool(address currency) external view returns (address);

    function getPoolShare(address currency) external view returns(uint256);

    function getCapShare(address currency) external view returns(uint256);

    function getPoolRewards(address currency) external view returns (address);

    function getCapRewards(address currency) external view returns (address);
}

interface ITreasury {
    function fundOracle(address destination, uint256 amount) external;

    function notifyFeeReceived(address currency, uint256 amount) external;
}

interface IPool {
    function totalSupply() external view returns (uint256);

    function creditUserProfit(address destination, uint256 amount) external;
    
    function updateOpenInterest(uint256 amount, bool isDecrease) external;

    function getUtilization() external view returns (uint256);

    function getBalance(address account) external view returns (uint256);

}
contract Trading {

	// All amounts in 8 decimals unless otherwise indicated

	using SafeERC20 for IERC20;
    using Address for address payable;

	// Structs

	struct Product {
		uint64 maxLeverage; // set to 0 to deactivate product
		uint64 liquidationThreshold; // in bps. 8000 = 80%
		uint64 fee; // In sbps (10^6). 0.5% = 5000. 0.025% = 250
		uint64 interest; // For 360 days, in bps. 5.35% = 535
	}

	struct Position {
		uint64 size;
		uint64 margin;
		uint64 timestamp;
		uint64 price;
	}

	struct Order {
		bool isClose;
		uint64 size;
		uint64 margin;
	}

	// Contracts
	address public owner;
	address public router;
	address public treasury;
	address public oracle;

	uint256 public nextPositionId; // Incremental
	uint256 public nextCloseOrderId; // Incremental

	mapping(bytes32 => Product) private products;
	mapping(bytes32 => Position) private positions; // key = currency,user,product,direction
	mapping(bytes32 => Order) private orders; // position key => Order

	mapping(address => uint256) minMargin; // currency => amount

	mapping(address => uint256) pendingFees; // currency => amount

	uint256 public constant UNIT_DECIMALS = 8;
	uint256 public constant UNIT = 10**UNIT_DECIMALS;

	uint256 public constant PRICE_DECIMALS = 8;

	// Events
	event NewOrder(
		bytes32 indexed key,
		address indexed user,
		bytes32 indexed productId,
		address currency,
		bool isLong,
		uint256 margin,
		uint256 size,
		bool isClose
	);

	event PositionUpdated(
		bytes32 indexed key,
		address indexed user,
		bytes32 indexed productId,
		address currency,
		bool isLong,
		uint256 margin,
		uint256 size,
		uint256 price,
		uint256 fee
	);

	event ClosePosition(
		bytes32 indexed key,
		address indexed user,
		bytes32 indexed productId,
		address currency,
		bool isLong,
		uint256 price,
		uint256 margin,
		uint256 size,
		uint256 fee,
		int256 pnl,
		bool wasLiquidated
	);

	constructor() {
		owner = msg.sender;
	}

	// Governance methods

	function setOwner(address newOwner) external onlyOwner {
		owner = newOwner;
	}

	function setRouter(address _router) external onlyOwner {
		router = _router;
		treasury = IRouter(router).treasury();
		oracle = IRouter(router).oracle();
	}

	function setMinMargin(
		address currency,
		uint256 _minMargin
	) external onlyOwner {
		minMargin[currency] = _minMargin;
	}

	function addProduct(bytes32 productId, Product memory _product) external onlyOwner {
		
		Product memory product = products[productId];
		
		require(product.liquidationThreshold == 0, "!product-exists");
		require(_product.liquidationThreshold > 0, "!liqThreshold");

		products[productId] = Product({
			maxLeverage: _product.maxLeverage,
			fee: _product.fee,
			interest: _product.interest,
			liquidationThreshold: _product.liquidationThreshold
		});

	}

	function updateProduct(bytes32 productId, Product memory _product) external onlyOwner {

		Product storage product = products[productId];

		require(product.liquidationThreshold > 0, "!product-does-not-exist");

		product.maxLeverage = _product.maxLeverage;
		product.fee = _product.fee;
		product.interest = _product.interest;
		product.liquidationThreshold = _product.liquidationThreshold;

	}

	// Methods

	function distributeFees(address currency) external {
		uint256 pendingFee = pendingFees[currency];
		if (pendingFee > 0) {
			pendingFees[currency] = 0;
			_transferOut(currency, treasury, pendingFee);
			ITreasury(treasury).notifyFeeReceived(currency, pendingFee * 10**(18-UNIT_DECIMALS));
		}
	}

	function submitOrder(
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 margin,
		uint256 size
	) external payable {

		if (currency == address(0)) { // User is sending ETH
			margin = msg.value / 10**(18 - UNIT_DECIMALS);
		} else {
			require(IRouter(router).isSupportedCurrency(currency), "!currency");
		}

		// Check params
		require(margin > 0, "!margin");
		require(size > 0, "!size");

		bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong);

		Order memory order = orders[key];
		require(order.size == 0, "!order"); // existing order

		Product memory product = products[productId];
		uint256 fee = size * product.fee / 10**6;

		if (currency == address(0)) {
			require(margin > fee, "!margin<fee");
			margin -= fee;
		} else {
			_transferIn(currency, margin + fee);
		}

		require(margin >= minMargin[currency], "!min-margin");

		uint256 leverage = UNIT * size / margin;
		require(leverage >= UNIT, "!leverage");
		require(leverage <= product.maxLeverage, "!max-leverage");

		// Update and check pool utlization
		_updateOpenInterest(currency, size, false);
		address pool = IRouter(router).getPool(currency);
		uint256 utilization = IPool(pool).getUtilization();
		require(utilization < 10**4, "!utilization");

		orders[key] = Order({
			isClose: false,
			size: uint64(size),
			margin: uint64(margin)
		});

		emit NewOrder(
			key,
			msg.sender,
			productId,
			currency,
			isLong,
			margin,
			size,
			false
		);

	}

	function submitCloseOrder(
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 size
	) external payable {

		require(size > 0, "!size");

		bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong);

		Order memory order = orders[key];
		require(order.size == 0, "!order"); // existing order

		// Check position
		Position storage position = positions[key];
		require(position.margin > 0, "!position");

		if (size > position.size) {
			size = position.size;
		}

		Product memory product = products[productId];
		uint256 fee = size * product.fee / 10**6;

		if (currency == address(0)) {
			uint256 fee_units = fee * 10**(18-UNIT_DECIMALS);
			require(msg.value >= fee_units && msg.value <= fee_units * (10**6 + 1)/10**6, "!fee");
		} else {
			_transferIn(currency, fee);
		}

		uint256 margin = size * uint256(position.margin) / uint256(position.size);

		orders[key] = Order({
			isClose: true,
			size: uint64(size),
			margin: uint64(margin)
		});

		emit NewOrder(
			key,
			msg.sender,
			productId,
			currency,
			isLong,
			margin,
			size,
			true
		);

	}

	function cancelOrder(
		bytes32 productId,
		address currency,
		bool isLong
	) external {

		bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong);

		Order memory order = orders[key];
		require(order.size > 0, "!exists");

		Product memory product = products[productId];
		uint256 fee = order.size * product.fee / 10**6;

		_updateOpenInterest(currency, order.size, true);

		delete orders[key];

		// Refund margin + fee
		uint256 marginPlusFee = order.margin + fee;
		_transferOut(currency, msg.sender, marginPlusFee);

	}

	// Set price for newly submitted order (oracle)
	function settleOrder(
		address user,
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 price
	) external onlyOracle {

		bytes32 key = _getPositionKey(user, productId, currency, isLong);

		Order storage order = orders[key];
		require(order.size > 0, "!exists");

		// fee
		Product memory product = products[productId];
		uint256 fee = order.size * product.fee / 10**6;
		pendingFees[currency] += fee;

		if (order.isClose) {
			
			{
				(uint256 margin, uint256 size, int256 pnl) = _settleCloseOrder(user, productId, currency, isLong, price);

				address pool = IRouter(router).getPool(currency);

				if (pnl < 0) {
					{
						uint256 positivePnl = uint256(-1 * pnl);
						_transferOut(currency, pool, positivePnl);
						if (positivePnl < margin) {
							_transferOut(currency, user, margin - positivePnl);
						}
					}
				} else {
					IPool(pool).creditUserProfit(user, uint256(pnl) * 10**(18-UNIT_DECIMALS));
					_transferOut(currency, user, margin);
				}

				_updateOpenInterest(currency, size, true);

				emit ClosePosition(
					key, 
					user,
					productId,
					currency,
					isLong,
					price,
					margin,
					size,
					fee,
					pnl,
					false
				);

			}

		} else {

			// Validate price, returns 8 decimals
			price = _validatePrice(price);

			Position storage position = positions[key];

			uint256 averagePrice = (uint256(position.size) * uint256(position.price) + uint256(order.size) * uint256(price)) / (uint256(position.size) + uint256(order.size));

			if (position.timestamp == 0) {
				position.timestamp = uint64(block.timestamp);
			}

			position.size += uint64(order.size);
			position.margin += uint64(order.margin);
			position.price = uint64(averagePrice);

			delete orders[key];

			emit PositionUpdated(
				key,
				user,
				productId,
				currency,
				isLong,
				position.margin,
				position.size,
				position.price,
				fee
			);

		}

	}

	function _settleCloseOrder(
		address user,
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 price
	) internal returns(uint256, uint256, int256) {

		bytes32 key = _getPositionKey(user, productId, currency, isLong);

		// Check order and params
		Order memory order = orders[key];
		uint256 size = order.size;
		uint256 margin = order.margin;

		Position storage position = positions[key];
		require(position.margin > 0, "!position");

		Product memory product = products[productId];

		price = _validatePrice(price);

		int256 pnl = _getPnL(isLong, price, position.price, size, product.interest, position.timestamp);

		// Check if it's a liquidation
		if (pnl <= -1 * int256(uint256(position.margin) * uint256(product.liquidationThreshold) / 10**4)) {
			pnl = -1 * int256(uint256(position.margin));
			margin = position.margin;
			size = position.size;
			position.margin = 0;
		} else {
			position.margin -= uint64(margin);
			position.size -= uint64(size);
		}
		
		if (position.margin == 0) {
			delete positions[key];
		}

		delete orders[key];

		return (margin, size, pnl);

	}

	// Liquidate positionIds (oracle)
	function liquidatePosition(
		address user,
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 price
	) external onlyOracle {

		bytes32 key = _getPositionKey(user, productId, currency, isLong);

		Position memory position = positions[key];

		if (position.margin == 0 || position.size == 0) {
			return;
		}

		Product storage product = products[productId];

		price = _validatePrice(price);

		int256 pnl = _getPnL(isLong, price, position.price, position.size, product.interest, position.timestamp);

		uint256 threshold = position.margin * product.liquidationThreshold / 10**4;

		if (pnl <= -1 * int256(threshold)) {

			uint256 fee = position.margin - threshold;
			address pool = IRouter(router).getPool(currency);

			_transferOut(currency, pool, threshold);
			_updateOpenInterest(currency, position.size, true);
			pendingFees[currency] += fee;

			emit ClosePosition(
				key, 
				user,
				productId,
				currency,
				isLong,
				price,
				position.margin,
				position.size,
				fee,
				-1 * int256(uint256(position.margin)),
				true
			);

			delete positions[key];

		}

	}

	function releaseMargin(
		address user,
		bytes32 productId,
		address currency,
		bool isLong, 
		bool includeFee
	) external onlyOwner {

		bytes32 key = _getPositionKey(user, productId, currency, isLong);

		Position storage position = positions[key];
		require(position.margin > 0, "!position");

		uint256 margin = position.margin;

		emit ClosePosition(
			key, 
			user,
			productId,
			currency,
			isLong,
			position.price,
			margin,
			position.size,
			0,
			0,
			false
		);

		delete orders[key];

		if (includeFee) {
			Product memory product = products[productId];
			uint256 fee = position.size * product.fee / 10**6;
			margin += fee;
		}

		_updateOpenInterest(currency, position.size, true);
		
		delete positions[key];

		_transferOut(currency, user, margin);

	}

	// To receive ETH
	fallback() external payable {}
	receive() external payable {}

	// Internal methods

	function _getPositionKey(address user, bytes32 productId, address currency, bool isLong) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(user, productId, currency, isLong));
    }

	function _updateOpenInterest(address currency, uint256 amount, bool isDecrease) internal {
		address pool = IRouter(router).getPool(currency);
		IPool(pool).updateOpenInterest(amount * 10**(18 - UNIT_DECIMALS), isDecrease);
	}

	function _transferIn(address currency, uint256 amount) internal {
		if (amount == 0 || currency == address(0)) return;
		// adjust decimals
		uint256 decimals = IRouter(router).getDecimals(currency);
		amount = amount * (10**decimals) / (10**UNIT_DECIMALS);
		IERC20(currency).safeTransferFrom(msg.sender, address(this), amount);
	}

	function _transferOut(address currency, address to, uint256 amount) internal {
		if (amount == 0 || to == address(0)) return;
		// adjust decimals
		uint256 decimals = IRouter(router).getDecimals(currency);
		amount = amount * (10**decimals) / (10**UNIT_DECIMALS);
		if (currency == address(0)) {
			payable(to).sendValue(amount);
		} else {
			IERC20(currency).safeTransfer(to, amount);
		}
	}

	function _validatePrice(
		uint256 price // 8 decimals
	) internal pure returns(uint256) {
		require(price > 0, "!price");
		return price * 10**(UNIT_DECIMALS - PRICE_DECIMALS);
	}
	
	function _getPnL(
		bool isLong,
		uint256 price,
		uint256 positionPrice,
		uint256 size,
		uint256 interest,
		uint256 timestamp
	) internal view returns(int256 _pnl) {

		bool pnlIsNegative;
		uint256 pnl;

		if (isLong) {
			if (price >= positionPrice) {
				pnl = size * (price - positionPrice) / positionPrice;
			} else {
				pnl = size * (positionPrice - price) / positionPrice;
				pnlIsNegative = true;
			}
		} else {
			if (price > positionPrice) {
				pnl = size * (price - positionPrice) / positionPrice;
				pnlIsNegative = true;
			} else {
				pnl = size * (positionPrice - price) / positionPrice;
			}
		}

		// Subtract interest from P/L
		if (block.timestamp >= timestamp + 15 minutes) {

			uint256 _interest = size * interest * (block.timestamp - timestamp) / (UNIT * 10**4 * 360 days);

			if (pnlIsNegative) {
				pnl += _interest;
			} else if (pnl < _interest) {
				pnl = _interest - pnl;
				pnlIsNegative = true;
			} else {
				pnl -= _interest;
			}

		}

		if (pnlIsNegative) {
			_pnl = -1 * int256(pnl);
		} else {
			_pnl = int256(pnl);
		}

		return _pnl;

	}

	// Getters

	function getProduct(bytes32 productId) external view returns(Product memory) {
		return products[productId];
	}

	function getPosition(
		address user,
		address currency,
		bytes32 productId,
		bool isLong
	) external view returns(Position memory position) {
		bytes32 key = _getPositionKey(user, productId, currency, isLong);
		return positions[key];
	}

	function getOrder(
		address user,
		address currency,
		bytes32 productId,
		bool isLong
	) external view returns(Order memory order) {
		bytes32 key = _getPositionKey(user, productId, currency, isLong);
		return orders[key];
	}

	function getOrders(bytes32[] calldata keys) external view returns(Order[] memory _orders) {
		uint256 length = keys.length;
		_orders = new Order[](length);
		for (uint256 i = 0; i < length; i++) {
			_orders[i] = orders[keys[i]];
		}
		return _orders;
	}

	function getPositions(bytes32[] calldata keys) external view returns(Position[] memory _positions) {
		uint256 length = keys.length;
		_positions = new Position[](length);
		for (uint256 i = 0; i < length; i++) {
			_positions[i] = positions[keys[i]];
		}
		return _positions;
	}

	function getPendingFee(address currency) external view returns(uint256) {
		return pendingFees[currency] * 10**(18-UNIT_DECIMALS);
	}

	// Modifiers

	modifier onlyOracle() {
		require(msg.sender == oracle, "!oracle");
		_;
	}

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

}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"int256","name":"pnl","type":"int256"},{"indexed":false,"internalType":"bool","name":"wasLiquidated","type":"bool"}],"name":"ClosePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isClose","type":"bool"}],"name":"NewOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"PositionUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"PRICE_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"_product","type":"tuple"}],"name":"addProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"getOrder","outputs":[{"components":[{"internalType":"bool","name":"isClose","type":"bool"},{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"}],"internalType":"struct Trading.Order","name":"order","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"keys","type":"bytes32[]"}],"name":"getOrders","outputs":[{"components":[{"internalType":"bool","name":"isClose","type":"bool"},{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"}],"internalType":"struct Trading.Order[]","name":"_orders","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"getPendingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"getPosition","outputs":[{"components":[{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"price","type":"uint64"}],"internalType":"struct Trading.Position","name":"position","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"keys","type":"bytes32[]"}],"name":"getPositions","outputs":[{"components":[{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"price","type":"uint64"}],"internalType":"struct Trading.Position[]","name":"_positions","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"}],"name":"getProduct","outputs":[{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"liquidatePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextCloseOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextPositionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"bool","name":"includeFee","type":"bool"}],"name":"releaseMargin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"_minMargin","type":"uint256"}],"name":"setMinMargin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"settleOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"submitCloseOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"margin","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"submitOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"_product","type":"tuple"}],"name":"updateProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b03191633179055613aa2806100326000396000f3fe60806040526004361061018b5760003560e01c80637dc0d1d0116100e0578063a36dbdd211610084578063f1a640f811610061578063f1a640f814610331578063f84382031461050d578063f887ea401461053a578063fde2832f1461055a57005b8063a36dbdd2146104b7578063c0d78655146104cd578063c972701a146104ed57005b80638da5cb5b116100bd5780638da5cb5b14610442578063904ac4b7146104625780639413f25c146104825780639d8e2177146104a257005b80637dc0d1d0146103ec57806381acdfa61461040c578063899346c71461042c57005b80633a20e9df1161014757806345a4058d1161012457806345a4058d146103545780635ce893051461037457806361d027b3146103945780636b62da40146103cc57005b80633a20e9df1461025d5780633d474866146103045780633de1b3e01461033157005b80630f1dfe871461019457806313af4035146101b457806319e77383146101d457806321465739146101f45780632a26f17f1461021457806339c6e45d1461024a57005b3661019257005b005b3480156101a057600080fd5b506101926101af366004613463565b61056d565b3480156101c057600080fd5b506101926101cf366004613161565b61069e565b3480156101e057600080fd5b506101926101ef366004613387565b6106ea565b34801561020057600080fd5b5061019261020f366004613256565b61085b565b34801561022057600080fd5b5061023461022f3660046132dd565b610ba5565b60405161024191906135d8565b60405180910390f35b610192610258366004613411565b610cd4565b34801561026957600080fd5b506102f761027836600461336e565b60408051608081018252600080825260208201819052918101829052606081019190915250600090815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b90920416606082015290565b60405161024191906136f1565b34801561031057600080fd5b5061032461031f3660046132dd565b611338565b6040516102419190613565565b34801561033d57600080fd5b50610346600881565b604051908152602001610241565b34801561036057600080fd5b5061019261036f3660046131ee565b611446565b34801561038057600080fd5b506102f761038f36600461319b565b611632565b3480156103a057600080fd5b506002546103b4906001600160a01b031681565b6040516001600160a01b039091168152602001610241565b3480156103d857600080fd5b506101926103e7366004613256565b6116c3565b3480156103f857600080fd5b506003546103b4906001600160a01b031681565b34801561041857600080fd5b50610192610427366004613463565b611cf6565b34801561043857600080fd5b5061034660045481565b34801561044e57600080fd5b506000546103b4906001600160a01b031681565b34801561046e57600080fd5b5061019261047d3660046132b1565b611ebc565b34801561048e57600080fd5b5061019261049d366004613161565b611f02565b3480156104ae57600080fd5b50610346611fe1565b3480156104c357600080fd5b5061034660055481565b3480156104d957600080fd5b506101926104e8366004613161565b611ff0565b3480156104f957600080fd5b50610346610508366004613161565b61215a565b34801561051957600080fd5b5061052d61052836600461319b565b612196565b60405161024191906136be565b34801561054657600080fd5b506001546103b4906001600160a01b031681565b6101926105683660046133c9565b612215565b6000546001600160a01b031633146105a05760405162461bcd60e51b81526004016105979061369e565b60405180910390fd5b60008281526006602052604090208054600160401b90046001600160401b031661060c5760405162461bcd60e51b815260206004820152601760248201527f2170726f647563742d646f65732d6e6f742d65786973740000000000000000006044820152606401610597565b81518154604084015160608501516020909501516001600160401b03908116600160401b0267ffffffffffffffff60401b19968216600160c01b029690961677ffffffffffffffff0000000000000000ffffffffffffffff928216600160801b0277ffffffffffffffff0000000000000000ffffffffffffffff19909416919094161791909117161791909117905550565b6000546001600160a01b031633146106c85760405162461bcd60e51b81526004016105979061369e565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006106f83385858561257c565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b90910416928101929092529192509061077b5760405162461bcd60e51b81526020600482015260076024820152662165786973747360c81b6044820152606401610597565b6000858152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811683860152600160801b82048116938301849052600160c01b90910416606082015291840151919291620f4240916107e291613939565b6107ec9190613784565b6001600160401b031690506108108684602001516001600160401b031660016125da565b60008481526008602052604080822080546001600160881b03191690558401516108449083906001600160401b031661372d565b90506108518733836126df565b5050505050505050565b6003546001600160a01b0316331461089f5760405162461bcd60e51b8152602060048201526007602482015266216f7261636c6560c81b6044820152606401610597565b60006108ad8686868661257c565b600081815260076020908152604091829020825160808101845290546001600160401b038082168352600160401b82048116938301849052600160801b8204811694830194909452600160c01b9004909216606083015291925090158061091c575080516001600160401b0316155b15610928575050610b9e565b600086815260066020526040902061093f846127ed565b93506000610998868685606001516001600160401b031686600001516001600160401b03168660000160189054906101000a90046001600160401b03166001600160401b031688604001516001600160401b0316612847565b905060006127108360000160089054906101000a90046001600160401b031685602001516109c69190613939565b6109d09190613784565b6001600160401b031690506109e781600019613895565b8213610b985760008185602001516001600160401b0316610a089190613968565b60015460405163bbe4f6db60e01b81526001600160a01b038c811660048301529293506000929091169063bbe4f6db9060240160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8b919061317e565b9050610a988a82856126df565b610ab18a87600001516001600160401b031660016125da565b6001600160a01b038a166000908152600a602052604081208054849290610ad990849061372d565b9091555050602086015186518c916001600160a01b038f16918a917f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c918f918f918f91908a610b336001600160401b038416600019613895565b604080516001600160a01b0390981688529515156020880152948601939093526001600160401b03918216606086015216608084015260a083015260c0820152600160e08201526101000160405180910390a450506000858152600760205260408120555b50505050505b5050505050565b606081806001600160401b03811115610bc057610bc0613a30565b604051908082528060200260200182016040528015610c1257816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610bde5790505b50915060005b81811015610ccb5760076000868684818110610c3657610c36613a1a565b60209081029290920135835250818101929092526040908101600020815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b8104841692820192909252600160c01b90910490911660608201528351849083908110610cad57610cad613a1a565b60200260200101819052508080610cc3906139d3565b915050610c18565b50505b92915050565b6001600160a01b038416610d0a57610cee60086012613968565b610cf990600a6137ed565b610d039034613770565b9150610dbf565b60015460405163fca8d47160e01b81526001600160a01b0386811660048301529091169063fca8d4719060240160206040518083038186803b158015610d4f57600080fd5b505afa158015610d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d879190613351565b610dbf5760405162461bcd60e51b81526020600482015260096024820152682163757272656e637960b81b6044820152606401610597565b60008211610df95760405162461bcd60e51b815260206004820152600760248201526610b6b0b933b4b760c91b6044820152606401610597565b60008111610e315760405162461bcd60e51b81526020600482015260056024820152642173697a6560d81b6044820152606401610597565b6000610e3f3387878761257c565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b90910416928101929092529192509015610ec25760405162461bcd60e51b815260206004820152600660248201526510b7b93232b960d11b6044820152606401610597565b6000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b90049092166060830152909190620f424090610f2a908761391a565b610f349190613770565b90506001600160a01b038816610f9257808611610f815760405162461bcd60e51b815260206004820152600b60248201526a216d617267696e3c66656560a81b6044820152606401610597565b610f8b8187613968565b9550610fa5565b610fa588610fa0838961372d565b6129ae565b6001600160a01b038816600090815260096020526040902054861015610ffb5760405162461bcd60e51b815260206004820152600b60248201526a10b6b4b716b6b0b933b4b760a91b6044820152606401610597565b6000868661100b6008600a6137ed565b611015919061391a565b61101f9190613770565b905061102d6008600a6137ed565b8110156110685760405162461bcd60e51b8152602060048201526009602482015268216c6576657261676560b81b6044820152606401610597565b82516001600160401b03168111156110b25760405162461bcd60e51b815260206004820152600d60248201526c216d61782d6c6576657261676560981b6044820152606401610597565b6110be898760006125da565b60015460405163bbe4f6db60e01b81526001600160a01b038b81166004830152600092169063bbe4f6db9060240160206040518083038186803b15801561110457600080fd5b505afa158015611118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113c919061317e565b90506000816001600160a01b0316637eb711316040518163ffffffff1660e01b815260040160206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b1919061350d565b905061271081106111f35760405162461bcd60e51b815260206004820152600c60248201526b10baba34b634bd30ba34b7b760a11b6044820152606401610597565b6040518060600160405280600015158152602001896001600160401b031681526020018a6001600160401b03168152506008600089815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160096101000a8154816001600160401b0302191690836001600160401b031602179055509050508b336001600160a01b0316887fe6f0e81a24c1b1c11cfcbbce67e7c5ef361e984c1e4f3528125c93f6f906680d8e8e8e8e60006040516113229594939291906001600160a01b039590951685529215156020850152604084019190915260608301521515608082015260a00190565b60405180910390a4505050505050505050505050565b606081806001600160401b0381111561135357611353613a30565b60405190808252806020026020018201604052801561139e57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816113715790505b50915060005b81811015610ccb57600860008686848181106113c2576113c2613a1a565b602090810292909201358352508181019290925260409081016000208151606081018352905460ff8116151582526001600160401b036101008204811694830194909452600160481b900490921690820152835184908390811061142857611428613a1a565b6020026020010181905250808061143e906139d3565b9150506113a4565b6000546001600160a01b031633146114705760405162461bcd60e51b81526004016105979061369e565b600061147e8686868661257c565b6000818152600760205260409020805491925090600160401b90046001600160401b03166114be5760405162461bcd60e51b81526004016105979061367b565b8054604080516001600160a01b0388811682528715156020830152600160c01b84046001600160401b0390811683850152600160401b850481166060840181905294166080830152600060a0830181905260c0830181905260e0830152915189928b169186917f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c918190036101000190a4600083815260086020526040902080546001600160881b03191690558315611600576000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b9004831660608201528554909392620f4240926115dc92909116613939565b6115e69190613784565b6001600160401b031690506115fb818461372d565b925050505b81546116189087906001600160401b031660016125da565b6000838152600760205260408120556108518689836126df565b6040805160808101825260008082526020820181905291810182905260608101829052906116628685878661257c565b600090815260076020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b9092041660608201529695505050505050565b6003546001600160a01b031633146117075760405162461bcd60e51b8152602060048201526007602482015266216f7261636c6560c81b6044820152606401610597565b60006117158686868661257c565b600081815260086020526040902080549192509061010090046001600160401b031661176d5760405162461bcd60e51b81526020600482015260076024820152662165786973747360c81b6044820152606401610597565b6000868152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b9004831660608201528454909392620f4240926117de92909161010090910416613939565b6117e89190613784565b6001600160401b0316905080600a6000896001600160a01b03166001600160a01b031681526020019081526020016000206000828254611828919061372d565b9091555050825460ff1615611a3e5760008060006118498c8c8c8c8c612a95565b60015460405163bbe4f6db60e01b81526001600160a01b038f81166004830152949750929550909350600092169063bbe4f6db9060240160206040518083038186803b15801561189857600080fd5b505afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d0919061317e565b905060008212156119185760006118e983600019613895565b90506118f68c83836126df565b84811015611912576119128c8f61190d8489613968565b6126df565b506119b2565b6001600160a01b03811663fbbc7d7f8e61193460086012613968565b61193f90600a6137ed565b611949908661391a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561198f57600080fd5b505af11580156119a3573d6000803e3d6000fd5b505050506119b28b8e866126df565b6119be8b8460016125da565b604080516001600160a01b038d811682528c151560208301529181018b9052606081018690526080810185905260a0810187905260c08101849052600060e08201528d918f16908a907f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c906101000160405180910390a450505050611ceb565b611a47856127ed565b6000858152600760205260408120855481549398509092611a79916001600160401b036101009091048116911661372d565b8554611a9490899061010090046001600160401b031661391a565b8354611ab2906001600160401b03600160c01b82048116911661391a565b611abc919061372d565b611ac69190613770565b8254909150600160801b90046001600160401b0316611b0357815467ffffffffffffffff60801b1916600160801b426001600160401b0316021782555b845482546001600160401b036101009092048216918491600091611b2991859116613745565b82546101009290920a6001600160401b0381810219909316918316021790915586548454600160481b909104821692508491600891611b71918591600160401b900416613745565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550808260000160186101000a8154816001600160401b0302191690836001600160401b0316021790555060086000878152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a8154906001600160401b0302191690556000820160096101000a8154906001600160401b0302191690555050898b6001600160a01b0316877f722a60bf2980ad6565c04c8210c55454af895983660b33099a60a0af5e05037b8c8c8760000160089054906101000a90046001600160401b03168860000160009054906101000a90046001600160401b03168960000160189054906101000a90046001600160401b03168b604051611ce0969594939291906001600160a01b0396909616865293151560208601526001600160401b039283166040860152908216606085015216608083015260a082015260c00190565b60405180910390a450505b505050505050505050565b6000546001600160a01b03163314611d205760405162461bcd60e51b81526004016105979061369e565b600082815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b82048116938301849052600160801b8204811694830194909452600160c01b9004909216606083015215611db65760405162461bcd60e51b815260206004820152600f60248201526e2170726f647563742d65786973747360881b6044820152606401610597565b600082602001516001600160401b031611611e035760405162461bcd60e51b815260206004820152600d60248201526c085b1a5c551a1c995cda1bdb19609a1b6044820152606401610597565b506040805160808101825282516001600160401b039081168252602080850151821681840190815285850151831684860190815260609687015184169685019687526000978852600690925293909520915182549351955194518216600160c01b026001600160c01b03958316600160801b02959095166fffffffffffffffffffffffffffffffff968316600160401b026fffffffffffffffffffffffffffffffff199095169190921617929092179390931617179055565b6000546001600160a01b03163314611ee65760405162461bcd60e51b81526004016105979061369e565b6001600160a01b03909116600090815260096020526040902055565b6001600160a01b0381166000908152600a60205260409020548015611fdd576001600160a01b038083166000908152600a6020526040812055600254611f4b91849116836126df565b6002546001600160a01b031663e0062d7983611f6960086012613968565b611f7490600a6137ed565b611f7e908561391a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611fc457600080fd5b505af1158015611fd8573d6000803e3d6000fd5b505050505b5050565b611fed6008600a6137ed565b81565b6000546001600160a01b0316331461201a5760405162461bcd60e51b81526004016105979061369e565b600180546001600160a01b0319166001600160a01b038316908117909155604080516361d027b360e01b815290516361d027b391600480820192602092909190829003018186803b15801561206e57600080fd5b505afa158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a6919061317e565b600280546001600160a01b0319166001600160a01b03928316179055600154604080516307dc0d1d60e41b815290519190921691637dc0d1d0916004808301926020929190829003018186803b1580156120ff57600080fd5b505afa158015612113573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612137919061317e565b600380546001600160a01b0319166001600160a01b039290921691909117905550565b600061216860086012613968565b61217390600a6137ed565b6001600160a01b0383166000908152600a6020526040902054610cce919061391a565b60408051606081018252600080825260208201819052918101829052906121bf8685878661257c565b6000908152600860209081526040918290208251606081018452905460ff8116151582526001600160401b036101008204811693830193909352600160481b900490911691810191909152915050949350505050565b6000811161224d5760405162461bcd60e51b81526020600482015260056024820152642173697a6560d81b6044820152606401610597565b600061225b3386868661257c565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b909104169281019290925291925090156122de5760405162461bcd60e51b815260206004820152600660248201526510b7b93232b960d11b6044820152606401610597565b60008281526007602052604090208054600160401b90046001600160401b031661231a5760405162461bcd60e51b81526004016105979061367b565b80546001600160401b031684111561233a5780546001600160401b031693505b6000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b90049092166060830152909190620f4240906123a2908861391a565b6123ac9190613770565b90506001600160a01b0388166124465760006123ca60086012613968565b6123d590600a6137ed565b6123df908361391a565b905080341015801561240b5750620f42406123fd82620f424161391a565b6124079190613770565b3411155b6124405760405162461bcd60e51b8152600401610597906020808252600490820152632166656560e01b604082015260600190565b50612450565b61245088826129ae565b82546000906001600160401b038082169161247491600160401b909104168961391a565b61247e9190613770565b604080516060808201835260018083526001600160401b038c8116602080860191825287831686880190815260008f815260088352889020965187549351915168ffffffffffffffffff1990941690151568ffffffffffffffff00191617610100918516919091021770ffffffffffffffff0000000000000000001916600160481b92909316919091029190911790935583516001600160a01b038f1681528d15159381019390935292820184905281018a905260808101919091529091508a90339088907fe6f0e81a24c1b1c11cfcbbce67e7c5ef361e984c1e4f3528125c93f6f906680d9060a00160405180910390a450505050505050505050565b6040516bffffffffffffffffffffffff19606086811b821660208401526034830186905284901b16605482015281151560f81b6068820152600090606901604051602081830303815290604052805190602001209050949350505050565b60015460405163bbe4f6db60e01b81526001600160a01b038581166004830152600092169063bbe4f6db9060240160206040518083038186803b15801561262057600080fd5b505afa158015612634573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612658919061317e565b90506001600160a01b03811663532f669061267560086012613968565b61268090600a6137ed565b61268a908661391a565b6040516001600160e01b031960e084901b16815260048101919091528415156024820152604401600060405180830381600087803b1580156126cb57600080fd5b505af1158015610851573d6000803e3d6000fd5b8015806126f357506001600160a01b038216155b156126fd57505050565b60015460405163067aa55560e51b81526001600160a01b038581166004830152600092169063cf54aaa09060240160206040518083038186803b15801561274357600080fd5b505afa158015612757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277b9190613526565b60ff16905061278c6008600a6137ed565b61279782600a6137ed565b6127a1908461391a565b6127ab9190613770565b91506001600160a01b0384166127d3576127ce6001600160a01b03841683612d45565b6127e7565b6127e76001600160a01b0385168484612e5e565b50505050565b60008082116128275760405162461bcd60e51b815260206004820152600660248201526521707269636560d01b6044820152606401610597565b612832600880613968565b61283d90600a6137ed565b610cce908361391a565b600080600088156128a95786881061287f5786612864818a613968565b61286e908861391a565b6128789190613770565b90506128de565b8661288a8982613968565b612894908861391a565b61289e9190613770565b9050600191506128de565b868811156128bc578661288a818a613968565b866128c78982613968565b6128d1908861391a565b6128db9190613770565b90505b6128ea8461038461372d565b42106129855760006128fe6008600a6137ed565b61290a9061271061391a565b612918906301da9c0061391a565b6129228642613968565b61292c888a61391a565b612936919061391a565b6129409190613770565b9050821561295957612952818361372d565b9150612983565b808210156129765761296b8282613968565b915060019250612983565b6129808183613968565b91505b505b811561299e5761299781600019613895565b92506129a2565b8092505b50509695505050505050565b8015806129c257506001600160a01b038216155b156129cb575050565b60015460405163067aa55560e51b81526001600160a01b038481166004830152600092169063cf54aaa09060240160206040518083038186803b158015612a1157600080fd5b505afa158015612a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a499190613526565b60ff169050612a5a6008600a6137ed565b612a6582600a6137ed565b612a6f908461391a565b612a799190613770565b9150612a906001600160a01b038416333085612ec1565b505050565b600080600080612aa78989898961257c565b60008181526008602090815260408083208151606081018352905460ff8116151582526001600160401b0361010082048116838601819052600160481b9092048116838501819052878752600790955292909420805495965090949091600160401b90910416612b295760405162461bcd60e51b81526004016105979061367b565b60008c815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b909204166060820152612b898a6127ed565b82546060830151919b50600091612bc4918e918e916001600160401b03600160c01b82048116928b9290821691600160801b90910416612847565b6020830151845491925061271091612bef916001600160401b0390811691600160401b90041661391a565b612bf99190613770565b612c0590600019613895565b8113612c5b578254612c2990600160401b90046001600160401b0316600019613895565b835467ffffffffffffffff60401b19811685556001600160401b038082169750600160401b9091041694509050612cee565b825484908490600890612c7f908490600160401b90046001600160401b031661397f565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550848360000160008282829054906101000a90046001600160401b0316612cc9919061397f565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b8254600160401b90046001600160401b0316612d14576000878152600760205260408120555b60009687526008602052604090962080546001600160881b031916905550909c919b50929950975050505050505050565b80471015612d955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610597565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612de2576040519150601f19603f3d011682016040523d82523d6000602084013e612de7565b606091505b5050905080612a905760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610597565b6040516001600160a01b038316602482015260448101829052612a9090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ef9565b6040516001600160a01b03808516602483015283166044820152606481018290526127e79085906323b872dd60e01b90608401612e8a565b6000612f4e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fcb9092919063ffffffff16565b805190915015612a905780806020019051810190612f6c9190613351565b612a905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610597565b6060612fda8484600085612fe4565b90505b9392505050565b6060824710156130455760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610597565b843b6130935760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610597565b600080866001600160a01b031685876040516130af9190613549565b60006040518083038185875af1925050503d80600081146130ec576040519150601f19603f3d011682016040523d82523d6000602084013e6130f1565b606091505b509150915061310182828661310c565b979650505050505050565b6060831561311b575081612fdd565b82511561312b5782518084602001fd5b8160405162461bcd60e51b81526004016105979190613648565b80356001600160401b038116811461315c57600080fd5b919050565b60006020828403121561317357600080fd5b8135612fdd81613a46565b60006020828403121561319057600080fd5b8151612fdd81613a46565b600080600080608085870312156131b157600080fd5b84356131bc81613a46565b935060208501356131cc81613a46565b92506040850135915060608501356131e381613a5e565b939692955090935050565b600080600080600060a0868803121561320657600080fd5b853561321181613a46565b945060208601359350604086013561322881613a46565b9250606086013561323881613a5e565b9150608086013561324881613a5e565b809150509295509295909350565b600080600080600060a0868803121561326e57600080fd5b853561327981613a46565b945060208601359350604086013561329081613a46565b925060608601356132a081613a5e565b949793965091946080013592915050565b600080604083850312156132c457600080fd5b82356132cf81613a46565b946020939093013593505050565b600080602083850312156132f057600080fd5b82356001600160401b038082111561330757600080fd5b818501915085601f83011261331b57600080fd5b81358181111561332a57600080fd5b8660208260051b850101111561333f57600080fd5b60209290920196919550909350505050565b60006020828403121561336357600080fd5b8151612fdd81613a5e565b60006020828403121561338057600080fd5b5035919050565b60008060006060848603121561339c57600080fd5b8335925060208401356133ae81613a46565b915060408401356133be81613a5e565b809150509250925092565b600080600080608085870312156133df57600080fd5b8435935060208501356133f181613a46565b9250604085013561340181613a5e565b9396929550929360600135925050565b600080600080600060a0868803121561342957600080fd5b85359450602086013561343b81613a46565b9350604086013561344b81613a5e565b94979396509394606081013594506080013592915050565b60008082840360a081121561347757600080fd5b833592506080601f198201121561348d57600080fd5b50604051608081018181106001600160401b03821117156134be57634e487b7160e01b600052604160045260246000fd5b6040526134cd60208501613145565b81526134db60408501613145565b60208201526134ec60608501613145565b60408201526134fd60808501613145565b6060820152809150509250929050565b60006020828403121561351f57600080fd5b5051919050565b60006020828403121561353857600080fd5b815160ff81168114612fdd57600080fd5b6000825161355b8184602087016139a7565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156135cc576135b98385518051151582526020808201516001600160401b039081169184019190915260409182015116910152565b9284019260609290920191600101613581565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156135cc5761363583855180516001600160401b03908116835260208083015182169084015260408083015182169084015260609182015116910152565b92840192608092909201916001016135f4565b60208152600082518060208401526136678160408501602087016139a7565b601f01601f19169190910160400192915050565b60208082526009908201526810b837b9b4ba34b7b760b91b604082015260600190565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b60608101610cce82848051151582526020808201516001600160401b039081169184019190915260409182015116910152565b60808101610cce828480516001600160401b03908116835260208083015182169084015260408083015182169084015260609182015116910152565b60008219821115613740576137406139ee565b500190565b60006001600160401b03808316818516808303821115613767576137676139ee565b01949350505050565b60008261377f5761377f613a04565b500490565b60006001600160401b038084168061379e5761379e613a04565b92169190910492915050565b600181815b808511156137e55781600019048211156137cb576137cb6139ee565b808516156137d857918102915b93841c93908002906137af565b509250929050565b6000612fdd838360008261380357506001610cce565b8161381057506000610cce565b816001811461382657600281146138305761384c565b6001915050610cce565b60ff841115613841576138416139ee565b50506001821b610cce565b5060208310610133831016604e8410600b841016171561386f575081810a610cce565b61387983836137aa565b806000190482111561388d5761388d6139ee565b029392505050565b60006001600160ff1b03818413828413808216868404861116156138bb576138bb6139ee565b600160ff1b60008712828116878305891216156138da576138da6139ee565b600087129250878205871284841616156138f6576138f66139ee565b8785058712818416161561390c5761390c6139ee565b505050929093029392505050565b6000816000190483118215151615613934576139346139ee565b500290565b60006001600160401b038083168185168183048111821515161561395f5761395f6139ee565b02949350505050565b60008282101561397a5761397a6139ee565b500390565b60006001600160401b038381169083168181101561399f5761399f6139ee565b039392505050565b60005b838110156139c25781810151838201526020016139aa565b838111156127e75750506000910152565b60006000198214156139e7576139e76139ee565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613a5b57600080fd5b50565b8015158114613a5b57600080fdfea264697066735822122019d643651a9363dac49412490c2ce1d0edb1c967ace343759b2766e43c7ee50764736f6c63430008070033

Deployed ByteCode Sourcemap

16345:16328:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19260:406;;;;;;;;;;-1:-1:-1;19260:406:0;;;;;:::i;:::-;;:::i;18395:81::-;;;;;;;;;;-1:-1:-1;18395:81:0;;;;;:::i;:::-;;:::i;22691:565::-;;;;;;;;;;-1:-1:-1;22691:565:0;;;;;:::i;:::-;;:::i;26515:1158::-;;;;;;;;;;-1:-1:-1;26515:1158:0;;;;;:::i;:::-;;:::i;32062:286::-;;;;;;;;;;-1:-1:-1;32062:286:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19995:1538;;;;;;:::i;:::-;;:::i;31181:113::-;;;;;;;;;;-1:-1:-1;31181:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31270:19:0;;;;:8;:19;;;;;;;;;31263:26;;;;;;;;;-1:-1:-1;;;;;31263:26:0;;;;;-1:-1:-1;;;31263:26:0;;;;;;;;;;;-1:-1:-1;;;31263:26:0;;;;;;;;;;;-1:-1:-1;;;31263:26:0;;;;;;;;;31181:113;;;;;;;;:::i;31795:262::-;;;;;;;;;;-1:-1:-1;31795:262:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17500:41::-;;;;;;;;;;;;17540:1;17500:41;;;;;23710:25:1;;;23698:2;23683:18;17500:41:0;23564:177:1;27678:829:0;;;;;;;;;;-1:-1:-1;27678:829:0;;;;;:::i;:::-;;:::i;31299:249::-;;;;;;;;;;-1:-1:-1;31299:249:0;;;;;:::i;:::-;;:::i;17004:23::-;;;;;;;;;;-1:-1:-1;17004:23:0;;;;-1:-1:-1;;;;;17004:23:0;;;;;;-1:-1:-1;;;;;8814:32:1;;;8796:51;;8784:2;8769:18;17004:23:0;8650:203:1;23311:2011:0;;;;;;;;;;-1:-1:-1;23311:2011:0;;;;;:::i;:::-;;:::i;17031:21::-;;;;;;;;;;-1:-1:-1;17031:21:0;;;;-1:-1:-1;;;;;17031:21:0;;;18783:472;;;;;;;;;;-1:-1:-1;18783:472:0;;;;;:::i;:::-;;:::i;17058:29::-;;;;;;;;;;;;;;;;16955:20;;;;;;;;;;-1:-1:-1;16955:20:0;;;;-1:-1:-1;;;;;16955:20:0;;;18647:131;;;;;;;;;;-1:-1:-1;18647:131:0;;;;;:::i;:::-;;:::i;19686:304::-;;;;;;;;;;-1:-1:-1;19686:304:0;;;;;:::i;:::-;;:::i;17545:48::-;;;;;;;;;;;;;:::i;17106:31::-;;;;;;;;;;;;;;;;18481:161;;;;;;;;;;-1:-1:-1;18481:161:0;;;;;:::i;:::-;;:::i;32353:135::-;;;;;;;;;;-1:-1:-1;32353:135:0;;;;;:::i;:::-;;:::i;31553:237::-;;;;;;;;;;-1:-1:-1;31553:237:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16979:21::-;;;;;;;;;;-1:-1:-1;16979:21:0;;;;-1:-1:-1;;;;;16979:21:0;;;21538:1148;;;;;;:::i;:::-;;:::i;19260:406::-;32641:5;;-1:-1:-1;;;;;32641:5:0;32627:10;:19;32619:38;;;;-1:-1:-1;;;32619:38:0;;;;;;;:::i;:::-;;;;;;;;;19353:23:::1;19379:19:::0;;;:8:::1;:19;::::0;;;;19413:28;;-1:-1:-1;;;19413:28:0;::::1;-1:-1:-1::0;;;;;19413:28:0::1;19405:68;;;::::0;-1:-1:-1;;;19405:68:0;;18861:2:1;19405:68:0::1;::::0;::::1;18843:21:1::0;18900:2;18880:18;;;18873:30;18939:25;18919:18;;;18912:53;18982:18;;19405:68:0::1;18659:347:1::0;19405:68:0::1;19502:20:::0;;19480:42;;19541:12:::1;::::0;::::1;::::0;19577:17:::1;::::0;::::1;::::0;19630:29:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;19599:60:0;;::::1;-1:-1:-1::0;;;19599:60:0::1;-1:-1:-1::0;;;;19558:36:0;;::::1;-1:-1:-1::0;;;19558:36:0::1;19599:60:::0;;;;;19527:26;;::::1;-1:-1:-1::0;;;19527:26:0::1;-1:-1:-1::0;;19527:26:0;;;19480:42;;;::::1;19527:26:::0;;;;::::1;19599:60:::0;;;;;::::1;::::0;;-1:-1:-1;19260:406:0:o;18395:81::-;32641:5;;-1:-1:-1;;;;;32641:5:0;32627:10;:19;32619:38;;;;-1:-1:-1;;;32619:38:0;;;;;;;:::i;:::-;18455:5:::1;:16:::0;;-1:-1:-1;;;;;;18455:16:0::1;-1:-1:-1::0;;;;;18455:16:0;;;::::1;::::0;;;::::1;::::0;;18395:81::o;22691:565::-;22791:11;22805:56;22821:10;22833:9;22844:8;22854:6;22805:15;:56::i;:::-;22868:18;22889:11;;;:6;:11;;;;;;;;;22868:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22868:32:0;;;;;;;;;;;-1:-1:-1;;;22868:32:0;;;;;;;;;;;22791:70;;-1:-1:-1;22868:32:0;22905:34;;;;-1:-1:-1;;;22905:34:0;;16323:2:1;22905:34:0;;;16305:21:1;16362:1;16342:18;;;16335:29;-1:-1:-1;;;16380:18:1;;;16373:37;16427:18;;22905:34:0;16121:330:1;22905:34:0;22946:22;22971:19;;;:8;:19;;;;;;;;22946:44;;;;;;;;;-1:-1:-1;;;;;22946:44:0;;;;;-1:-1:-1;;;22946:44:0;;;;;;;;-1:-1:-1;;;22946:44:0;;;;;;;;;;-1:-1:-1;;;22946:44:0;;;;;;;;23009:10;;;;22946:44;;:22;23036:5;;23009:24;;;:::i;:::-;:32;;;;:::i;:::-;-1:-1:-1;;;;;22995:46:0;;;23048:47;23068:8;23078:5;:10;;;-1:-1:-1;;;;;23048:47:0;23090:4;23048:19;:47::i;:::-;23109:11;;;;:6;:11;;;;;;23102:18;;-1:-1:-1;;;;;;23102:18:0;;;23177:12;;;:18;;23192:3;;-1:-1:-1;;;;;23177:18:0;;:::i;:::-;23153:42;;23200:49;23213:8;23223:10;23235:13;23200:12;:49::i;:::-;22784:472;;;;;22691:565;;;:::o;26515:1158::-;32559:6;;-1:-1:-1;;;;;32559:6:0;32545:10;:20;32537:40;;;;-1:-1:-1;;;32537:40:0;;15314:2:1;32537:40:0;;;15296:21:1;15353:1;15333:18;;;15326:29;-1:-1:-1;;;15371:18:1;;;15364:37;15418:18;;32537:40:0;15112:330:1;32537:40:0;26667:11:::1;26681:50;26697:4;26703:9;26714:8;26724:6;26681:15;:50::i;:::-;26738:24;26765:14:::0;;;:9:::1;:14;::::0;;;;;;;;26738:41;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;26738:41:0;;::::1;::::0;;-1:-1:-1;;;26738:41:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;26738:41:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;26738:41:0;::::1;::::0;;::::1;::::0;;;;26667:64;;-1:-1:-1;26738:41:0;26790:20;;:42:::1;;-1:-1:-1::0;26814:13:0;;-1:-1:-1;;;;;26814:18:0::1;::::0;26790:42:::1;26786:66;;;26840:7;;;;26786:66;26858:23;26884:19:::0;;;:8:::1;:19;::::0;;;;26918:21:::1;26933:5:::0;26918:14:::1;:21::i;:::-;26910:29;;26946:10;26959:91;26967:6;26975:5;26982:8;:14;;;-1:-1:-1::0;;;;;26959:91:0::1;26998:8;:13;;;-1:-1:-1::0;;;;;26959:91:0::1;27013:7;:16;;;;;;;;;;-1:-1:-1::0;;;;;27013:16:0::1;-1:-1:-1::0;;;;;26959:91:0::1;27031:8;:18;;;-1:-1:-1::0;;;;;26959:91:0::1;:7;:91::i;:::-;26946:104;;27057:17;27126:5;27095:7;:28;;;;;;;;;;-1:-1:-1::0;;;;;27095:28:0::1;27077:8;:15;;;:46;;;;:::i;:::-;:54;;;;:::i;:::-;-1:-1:-1::0;;;;;27057:74:0::1;::::0;-1:-1:-1;27149:22:0::1;27057:74:::0;-1:-1:-1;;27149:22:0::1;:::i;:::-;27142:3;:29;27138:529;;27181:11;27213:9;27195:8;:15;;;-1:-1:-1::0;;;;;27195:27:0::1;;;;;:::i;:::-;27251:6;::::0;27243:33:::1;::::0;-1:-1:-1;;;27243:33:0;;-1:-1:-1;;;;;8814:32:1;;;27243:33:0::1;::::0;::::1;8796:51:1::0;27181:41:0;;-1:-1:-1;27228:12:0::1;::::0;27251:6;;::::1;::::0;27243:23:::1;::::0;8769:18:1;;27243:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27228:48;;27284:39;27297:8;27307:4;27313:9;27284:12;:39::i;:::-;27329:50;27349:8;27359;:13;;;-1:-1:-1::0;;;;;27329:50:0::1;27374:4;27329:19;:50::i;:::-;-1:-1:-1::0;;;;;27385:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;:28;;27410:3;;27385:21;:28:::1;::::0;27410:3;;27385:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;27524:15:0::1;::::0;::::1;::::0;27546:13;;27468:9;;-1:-1:-1;;;;;27426:204:0;::::1;::::0;27446:3;;27426:204:::1;::::0;27484:8;;27499:6;;27512:5;;27524:15;27566:3;27576:37:::1;-1:-1:-1::0;;;;;27588:24:0;::::1;-1:-1:-1::0;;27576:37:0::1;:::i;:::-;27426:204;::::0;;-1:-1:-1;;;;;10825:32:1;;;10807:51;;10901:14;;10894:22;10889:2;10874:18;;10867:50;10933:18;;;10926:34;;;;-1:-1:-1;;;;;11033:15:1;;;11028:2;11013:18;;11006:43;11086:15;11080:3;11065:19;;11058:44;10845:3;11118:19;;11111:35;11177:3;11162:19;;11155:35;27620:4:0::1;11221:3:1::0;11206:19;;11199:51;10794:3;10779:19;27426:204:0::1;;;;;;;-1:-1:-1::0;;27645:14:0::1;::::0;;;:9:::1;:14;::::0;;;;27638:21;27138:529:::1;26660:1013;;;;;32582:1;26515:1158:::0;;;;;:::o;32062:286::-;32131:28;32183:4;;-1:-1:-1;;;;;32212:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32212:22:0;;-1:-1:-1;;32212:22:0;;;;;;;;;;;;32199:35;;32244:9;32239:83;32263:6;32259:1;:10;32239:83;;;32298:9;:18;32308:4;;32313:1;32308:7;;;;;;;:::i;:::-;;;;;;;;;;32298:18;;-1:-1:-1;32298:18:0;;;;;;;;;;;-1:-1:-1;32298:18:0;32282:34;;;;;;;;;-1:-1:-1;;;;;32282:34:0;;;;;-1:-1:-1;;;32282:34:0;;;;;;;;;;;-1:-1:-1;;;32282:34:0;;;;;;;;;;;-1:-1:-1;;;32282:34:0;;;;;;;;;;:13;;:10;;32293:1;;32282:13;;;;;;:::i;:::-;;;;;;:34;;;;32271:3;;;;;:::i;:::-;;;;32239:83;;;;32326:17;32062:286;;;;;:::o;19995:1538::-;-1:-1:-1;;;;;20143:22:0;;20139:193;;20222:18;17540:1;20222:2;:18;:::i;:::-;20217:24;;:2;:24;:::i;:::-;20205:36;;:9;:36;:::i;:::-;20196:45;;20139:193;;;20275:6;;20267:45;;-1:-1:-1;;;20267:45:0;;-1:-1:-1;;;;;8814:32:1;;;20267:45:0;;;8796:51:1;20275:6:0;;;;20267:35;;8769:18:1;;20267:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20259:67;;;;-1:-1:-1;;;20259:67:0;;17850:2:1;20259:67:0;;;17832:21:1;17889:1;17869:18;;;17862:29;-1:-1:-1;;;17907:18:1;;;17900:39;17956:18;;20259:67:0;17648:332:1;20259:67:0;20374:1;20365:6;:10;20357:30;;;;-1:-1:-1;;;20357:30:0;;19213:2:1;20357:30:0;;;19195:21:1;19252:1;19232:18;;;19225:29;-1:-1:-1;;;19270:18:1;;;19263:37;19317:18;;20357:30:0;19011:330:1;20357:30:0;20407:1;20400:4;:8;20392:26;;;;-1:-1:-1;;;20392:26:0;;18187:2:1;20392:26:0;;;18169:21:1;18226:1;18206:18;;;18199:29;-1:-1:-1;;;18244:18:1;;;18237:35;18289:18;;20392:26:0;17985:328:1;20392:26:0;20425:11;20439:56;20455:10;20467:9;20478:8;20488:6;20439:15;:56::i;:::-;20502:18;20523:11;;;:6;:11;;;;;;;;;20502:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20502:32:0;;;;;;;;;;;-1:-1:-1;;;20502:32:0;;;;;;;;;;;20425:70;;-1:-1:-1;20502:32:0;20547:15;20539:34;;;;-1:-1:-1;;;20539:34:0;;22685:2:1;20539:34:0;;;22667:21:1;22724:1;22704:18;;;22697:29;-1:-1:-1;;;22742:18:1;;;22735:36;22788:18;;20539:34:0;22483:329:1;20539:34:0;20598:22;20623:19;;;:8;:19;;;;;;;;20598:44;;;;;;;;;-1:-1:-1;;;;;20598:44:0;;;;;-1:-1:-1;;;20598:44:0;;;;;;;;;;;-1:-1:-1;;;20598:44:0;;;;;;;;;;-1:-1:-1;;;20598:44:0;;;;;;;;;;;:22;20682:5;;20661:18;;:4;:18;:::i;:::-;:26;;;;:::i;:::-;20647:40;-1:-1:-1;;;;;;20698:22:0;;20694:148;;20745:3;20736:6;:12;20728:36;;;;-1:-1:-1;;;20728:36:0;;14974:2:1;20728:36:0;;;14956:21:1;15013:2;14993:18;;;14986:30;-1:-1:-1;;;15032:18:1;;;15025:41;15083:18;;20728:36:0;14772:335:1;20728:36:0;20770:13;20780:3;20770:13;;:::i;:::-;;;20694:148;;;20801:35;20813:8;20823:12;20832:3;20823:6;:12;:::i;:::-;20801:11;:35::i;:::-;-1:-1:-1;;;;;20866:19:0;;;;;;:9;:19;;;;;;20856:29;;;20848:53;;;;-1:-1:-1;;;20848:53:0;;19548:2:1;20848:53:0;;;19530:21:1;19587:2;19567:18;;;19560:30;-1:-1:-1;;;19606:18:1;;;19599:41;19657:18;;20848:53:0;19346:335:1;20848:53:0;20908:16;20941:6;20934:4;17576:17;17540:1;17576:2;:17;:::i;:::-;20927:11;;;;:::i;:::-;:20;;;;:::i;:::-;20908:39;-1:-1:-1;17576:17:0;17540:1;17576:2;:17;:::i;:::-;20960:8;:16;;20952:38;;;;-1:-1:-1;;;20952:38:0;;20232:2:1;20952:38:0;;;20214:21:1;20271:1;20251:18;;;20244:29;-1:-1:-1;;;20289:18:1;;;20282:39;20338:18;;20952:38:0;20030:332:1;20952:38:0;21015:19;;-1:-1:-1;;;;;21003:31:0;;;;20995:57;;;;-1:-1:-1;;;20995:57:0;;21598:2:1;20995:57:0;;;21580:21:1;21637:2;21617:18;;;21610:30;-1:-1:-1;;;21656:18:1;;;21649:43;21709:18;;20995:57:0;21396:337:1;20995:57:0;21098:42;21118:8;21128:4;21134:5;21098:19;:42::i;:::-;21168:6;;21160:33;;-1:-1:-1;;;21160:33:0;;-1:-1:-1;;;;;8814:32:1;;;21160:33:0;;;8796:51:1;21145:12:0;;21168:6;;21160:23;;8769:18:1;;21160:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21145:48;;21198:19;21226:4;-1:-1:-1;;;;;21220:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21198:50;;21275:5;21261:11;:19;21253:44;;;;-1:-1:-1;;;21253:44:0;;18520:2:1;21253:44:0;;;18502:21:1;18559:2;18539:18;;;18532:30;-1:-1:-1;;;18578:18:1;;;18571:42;18630:18;;21253:44:0;18318:336:1;21253:44:0;21318:84;;;;;;;;21339:5;21318:84;;;;;;21363:4;-1:-1:-1;;;;;21318:84:0;;;;;21389:6;-1:-1:-1;;;;;21318:84:0;;;;21304:6;:11;21311:3;21304:11;;;;;;;;;;;:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21304:98:0;;;;;-1:-1:-1;;;;;21304:98:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21304:98:0;;;;;-1:-1:-1;;;;;21304:98:0;;;;;;;;;21453:9;21437:10;-1:-1:-1;;;;;21414:112:0;21428:3;21414:112;21468:8;21482:6;21494;21506:4;21516:5;21414:112;;;;;;;;;-1:-1:-1;;;;;9503:32:1;;;;9485:51;;9579:14;;9572:22;9567:2;9552:18;;9545:50;9626:2;9611:18;;9604:34;;;;9669:2;9654:18;;9647:34;9725:14;9718:22;9712:3;9697:19;;9690:51;9472:3;9457:19;;9238:509;21414:112:0;;;;;;;;20132:1401;;;;;;;19995:1538;;;;;:::o;31795:262::-;31861:22;31907:4;;-1:-1:-1;;;;;31933:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;31933:19:0;;-1:-1:-1;;31933:19:0;;;;;;;;;;;;31923:29;;31962:9;31957:77;31981:6;31977:1;:10;31957:77;;;32013:6;:15;32020:4;;32025:1;32020:7;;;;;;;:::i;:::-;;;;;;;;;;32013:15;;-1:-1:-1;32013:15:0;;;;;;;;;;;-1:-1:-1;32013:15:0;32000:28;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32000:28:0;;;;;;;;;;;;-1:-1:-1;;;32000:28:0;;;;;;;;;:10;;:7;;32008:1;;32000:10;;;;;;:::i;:::-;;;;;;:28;;;;31989:3;;;;;:::i;:::-;;;;31957:77;;27678:829;32641:5;;-1:-1:-1;;;;;32641:5:0;32627:10;:19;32619:38;;;;-1:-1:-1;;;32619:38:0;;;;;;;:::i;:::-;27828:11:::1;27842:50;27858:4;27864:9;27875:8;27885:6;27842:15;:50::i;:::-;27899:25;27927:14:::0;;;:9:::1;:14;::::0;;;;27954:15;;27927:14;;-1:-1:-1;27927:14:0;-1:-1:-1;;;27954:15:0;::::1;-1:-1:-1::0;;;;;27954:15:0::1;27946:41;;;;-1:-1:-1::0;;;27946:41:0::1;;;;;;;:::i;:::-;28011:15:::0;;28038:155:::1;::::0;;-1:-1:-1;;;;;11623:32:1;;;11605:51;;11699:14;;11692:22;11687:2;11672:18;;11665:50;-1:-1:-1;;;28118:14:0;::::1;-1:-1:-1::0;;;;;28118:14:0;;::::1;11768:18:1::0;;;11761:43;-1:-1:-1;;;28011:15:0;::::1;::::0;::::1;11835:2:1::0;11820:18;;11813:34;;;28150:13:0;::::1;11878:3:1::0;11863:19;;11856:44;-1:-1:-1;11643:3:1;11916:19;;11909:35;;;11975:3;11960:19;;11953:35;;;12019:3;12004:19;;11997:51;28038:155:0;;28077:9;;28038:155;::::1;::::0;28057:3;;28038:155:::1;::::0;;;;11592:3:1;28038:155:0;;::::1;28207:11;::::0;;;:6:::1;:11;::::0;;;;28200:18;;-1:-1:-1;;;;;;28200:18:0;;;28225:146;::::1;;;28247:22;28272:19:::0;;;:8:::1;:19;::::0;;;;;;;28247:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;28247:44:0;;::::1;::::0;;-1:-1:-1;;;28247:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;28247:44:0;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;;;28247:44:0;::::1;::::0;::::1;::::0;;;;28311:13;;28247:44;;:22;28341:5:::1;::::0;28311:27:::1;::::0;28247:44;;28311:13:::1;:27;:::i;:::-;:35;;;;:::i;:::-;-1:-1:-1::0;;;;;28297:49:0::1;::::0;-1:-1:-1;28352:13:0::1;28297:49:::0;28352:13;::::1;:::i;:::-;;;28241:130;;28225:146;28407:13:::0;;28377:50:::1;::::0;28397:8;;-1:-1:-1;;;;;28407:13:0::1;::::0;28377:19:::1;:50::i;:::-;28443:14;::::0;;;:9:::1;:14;::::0;;;;28436:21;28464:36:::1;28477:8:::0;28487:4;28493:6;28464:12:::1;:36::i;31299:249::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31467:50:0;31483:4;31489:9;31500:8;31510:6;31467:15;:50::i;:::-;31529:14;;;;:9;:14;;;;;;;;;31522:21;;;;;;;;;-1:-1:-1;;;;;31522:21:0;;;;;-1:-1:-1;;;31522:21:0;;;;;;;;;;;-1:-1:-1;;;31522:21:0;;;;;;;;;;;-1:-1:-1;;;31522:21:0;;;;;;;;;31299:249;-1:-1:-1;;;;;;31299:249:0:o;23311:2011::-;32559:6;;-1:-1:-1;;;;;32559:6:0;32545:10;:20;32537:40;;;;-1:-1:-1;;;32537:40:0;;15314:2:1;32537:40:0;;;15296:21:1;15353:1;15333:18;;;15326:29;-1:-1:-1;;;15371:18:1;;;15364:37;15418:18;;32537:40:0;15112:330:1;32537:40:0;23457:11:::1;23471:50;23487:4;23493:9;23504:8;23514:6;23471:15;:50::i;:::-;23528:19;23550:11:::0;;;:6:::1;:11;::::0;;;;23574:10;;23550:11;;-1:-1:-1;23550:11:0;23574:10:::1;::::0;::::1;-1:-1:-1::0;;;;;23574:10:0::1;23566:34;;;::::0;-1:-1:-1;;;23566:34:0;;16323:2:1;23566:34:0::1;::::0;::::1;16305:21:1::0;16362:1;16342:18;;;16335:29;-1:-1:-1;;;16380:18:1;;;16373:37;16427:18;;23566:34:0::1;16121:330:1::0;23566:34:0::1;23617:22;23642:19:::0;;;:8:::1;:19;::::0;;;;;;;23617:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;23617:44:0;;::::1;::::0;;-1:-1:-1;;;23617:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;23617:44:0;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;;;23617:44:0;::::1;::::0;::::1;::::0;;;;23680:10;;23617:44;;:22;23707:5:::1;::::0;23680:24:::1;::::0;23617:44;;::::1;23680:10:::0;;::::1;;:24;:::i;:::-;:32;;;;:::i;:::-;-1:-1:-1::0;;;;;23666:46:0::1;;;23742:3;23717:11;:21;23729:8;-1:-1:-1::0;;;;;23717:21:0::1;-1:-1:-1::0;;;;;23717:21:0::1;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;23756:13:0;;::::1;;23752:1564;;;23790:14;23806:12:::0;23820:10:::1;23834:59;23852:4;23858:9;23869:8;23879:6;23887:5;23834:17;:59::i;:::-;23925:6;::::0;23917:33:::1;::::0;-1:-1:-1;;;23917:33:0;;-1:-1:-1;;;;;8814:32:1;;;23917:33:0::1;::::0;::::1;8796:51:1::0;23789:104:0;;-1:-1:-1;23789:104:0;;-1:-1:-1;23789:104:0;;-1:-1:-1;23902:12:0::1;::::0;23925:6:::1;::::0;23917:23:::1;::::0;8769:18:1;;23917:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23902:48;;23969:1;23963:3;:7;23959:378;;;23989:19;24019:8;24024:3:::0;-1:-1:-1;;24019:8:0::1;:::i;:::-;23989:39;;24037:41;24050:8;24060:4;24066:11;24037:12;:41::i;:::-;24105:6;24091:11;:20;24087:96;;;24123:50;24136:8:::0;24146:4;24152:20:::1;24161:11:::0;24152:6;:20:::1;:::i;:::-;24123:12;:50::i;:::-;23980:211;23959:378;;;-1:-1:-1::0;;;;;24212:28:0;::::1;;24241:4:::0;24267:16:::1;17540:1;24267:2;:16;:::i;:::-;24262:22;::::0;:2:::1;:22;:::i;:::-;24247:37;::::0;24255:3;24247:37:::1;:::i;:::-;24212:73;::::0;-1:-1:-1;;;;;;24212:73:0::1;::::0;;;;;;-1:-1:-1;;;;;12888:32:1;;;24212:73:0::1;::::0;::::1;12870:51:1::0;12937:18;;;12930:34;12843:18;;24212:73:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24293:36;24306:8;24316:4;24322:6;24293:12;:36::i;:::-;24345:41;24365:8;24375:4;24381;24345:19;:41::i;:::-;24400:165;::::0;;-1:-1:-1;;;;;10099:32:1;;;10081:51;;10175:14;;10168:22;10163:2;10148:18;;10141:50;10207:18;;;10200:34;;;10265:2;10250:18;;10243:34;;;10308:3;10293:19;;10286:35;;;10119:3;10337:19;;10330:35;;;10396:3;10381:19;;10374:35;;;24553:5:0::1;10440:3:1::0;10425:19;;10418:51;24445:9:0;;24400:165;::::1;::::0;24421:3;;24400:165:::1;::::0;10068:3:1;10053:19;24400:165:0::1;;;;;;;23782:792;;;;23752:1564;;;24645:21;24660:5;24645:14;:21::i;:::-;24674:25;24702:14:::0;;;:9:::1;:14;::::0;;;;24873:10;;24848:13;;24637:29;;-1:-1:-1;24702:14:0;;24840:44:::1;::::0;-1:-1:-1;;;;;24873:10:0::1;::::0;;::::1;::::0;::::1;::::0;24848:13:::1;24840:44;:::i;:::-;24807:10:::0;;24799:36:::1;::::0;24829:5;;24807:10:::1;::::0;::::1;-1:-1:-1::0;;;;;24807:10:0::1;24799:36;:::i;:::-;24781:14:::0;;24748:48:::1;::::0;-1:-1:-1;;;;;;;;24781:14:0;::::1;::::0;::::1;::::0;24756:13:::1;24748:48;:::i;:::-;:87;;;;:::i;:::-;24747:138;;;;:::i;:::-;24897:18:::0;;24724:161;;-1:-1:-1;;;;24897:18:0;::::1;-1:-1:-1::0;;;;;24897:18:0::1;24893:87;;24929:44:::0;;-1:-1:-1;;;;24929:44:0::1;-1:-1:-1::0;;;24957:15:0::1;-1:-1:-1::0;;;;;24929:44:0::1;;;::::0;;24893:87:::1;25011:10:::0;;24987:35;;-1:-1:-1;;;;;25011:10:0::1;::::0;;::::1;::::0;::::1;::::0;24987:8;;25011:10:::1;::::0;24987:35:::1;::::0;25011:10;;24987:35:::1;;:::i;:::-;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;24987:35:0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;25054:12;;25028:39;;-1:-1:-1;;;25054:12:0;;::::1;::::0;::::1;::::0;-1:-1:-1;25028:39:0;;:15:::1;::::0;:39:::1;::::0;25054:12;;-1:-1:-1;;;25028:39:0;::::1;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;25028:39:0::1;;;;;-1:-1:-1::0;;;;;25028:39:0::1;;;;;;25097:12;25073:8;:14;;;:37;;;;;-1:-1:-1::0;;;;;25073:37:0::1;;;;;-1:-1:-1::0;;;;;25073:37:0::1;;;;;;25125:6;:11;25132:3;25125:11;;;;;;;;;;;;25118:18:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25118:18:0::1;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25118:18:0::1;;;;;;;25192:9;25181:4;-1:-1:-1::0;;;;;25149:159:0::1;25171:3;25149:159;25208:8;25223:6;25236:8;:15;;;;;;;;;;-1:-1:-1::0;;;;;25236:15:0::1;25258:8;:13;;;;;;;;;;-1:-1:-1::0;;;;;25258:13:0::1;25278:8;:14;;;;;;;;;;-1:-1:-1::0;;;;;25278:14:0::1;25299:3;25149:159;;;;;;;;;;-1:-1:-1::0;;;;;12355:32:1;;;;12337:51;;12431:14;;12424:22;12419:2;12404:18;;12397:50;-1:-1:-1;;;;;12520:15:1;;;12515:2;12500:18;;12493:43;12572:15;;;12567:2;12552:18;;12545:43;12625:15;12619:3;12604:19;;12597:44;12375:3;12657:19;;12650:35;12324:3;12309:19;;12059:632;25149:159:0::1;;;;;;;;24587:729;;23752:1564;23450:1872;;;;23311:2011:::0;;;;;:::o;18783:472::-;32641:5;;-1:-1:-1;;;;;32641:5:0;32627:10;:19;32619:38;;;;-1:-1:-1;;;32619:38:0;;;;;;;:::i;:::-;18875:22:::1;18900:19:::0;;;:8:::1;:19;::::0;;;;;;;;18875:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;18875:44:0;;::::1;::::0;;-1:-1:-1;;;18875:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;18875:44:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;18875:44:0;::::1;::::0;;::::1;::::0;;;;18936:33;18928:61:::1;;;::::0;-1:-1:-1;;;18928:61:0;;19888:2:1;18928:61:0::1;::::0;::::1;19870:21:1::0;19927:2;19907:18;;;19900:30;-1:-1:-1;;;19946:18:1;;;19939:45;20001:18;;18928:61:0::1;19686:339:1::0;18928:61:0::1;19034:1;19002:8;:29;;;-1:-1:-1::0;;;;;19002:33:0::1;;18994:59;;;::::0;-1:-1:-1;;;18994:59:0;;15981:2:1;18994:59:0::1;::::0;::::1;15963:21:1::0;16020:2;16000:18;;;15993:30;-1:-1:-1;;;16039:18:1;;;16032:43;16092:18;;18994:59:0::1;15779:337:1::0;18994:59:0::1;-1:-1:-1::0;19082:166:0::1;::::0;;::::1;::::0;::::1;::::0;;19109:20;;-1:-1:-1;;;;;19082:166:0;;::::1;::::0;;::::1;19213:29:::0;;::::1;::::0;19082:166;::::1;::::0;;::::1;::::0;;;19140:12;;::::1;::::0;19082:166;::::1;::::0;;;;;;;19168:17;;::::1;::::0;19082:166;::::1;::::0;;;;;;-1:-1:-1;19060:19:0;;;:8:::1;:19:::0;;;;;;;:188;;;;;;;;;;;::::1;-1:-1:-1::0;;;19060:188:0::1;-1:-1:-1::0;;;;;19060:188:0;;::::1;-1:-1:-1::0;;;19060:188:0::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;19060:188:0::1;-1:-1:-1::0;;19060:188:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;18783:472::o;18647:131::-;32641:5;;-1:-1:-1;;;;;32641:5:0;32627:10;:19;32619:38;;;;-1:-1:-1;;;32619:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18741:19:0;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:32;18647:131::o;19686:304::-;-1:-1:-1;;;;;19763:21:0;;19742:18;19763:21;;;:11;:21;;;;;;19793:14;;19789:197;;-1:-1:-1;;;;;19815:21:0;;;19839:1;19815:21;;;:11;:21;;;;;:25;19869:8;;19846:44;;19827:8;;19869;19879:10;19846:12;:44::i;:::-;19906:8;;-1:-1:-1;;;;;19906:8:0;19896:37;19934:8;19962:16;17540:1;19962:2;:16;:::i;:::-;19957:22;;:2;:22;:::i;:::-;19944:35;;:10;:35;:::i;:::-;19896:84;;-1:-1:-1;;;;;;19896:84:0;;;;;;;-1:-1:-1;;;;;12888:32:1;;;19896:84:0;;;12870:51:1;12937:18;;;12930:34;12843:18;;19896:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19789:197;19737:253;19686:304;:::o;17545:48::-;17576:17;17540:1;17576:2;:17;:::i;:::-;17545:48;:::o;18481:161::-;32641:5;;-1:-1:-1;;;;;32641:5:0;32627:10;:19;32619:38;;;;-1:-1:-1;;;32619:38:0;;;;;;;:::i;:::-;18541:6:::1;:16:::0;;-1:-1:-1;;;;;;18541:16:0::1;-1:-1:-1::0;;;;;18541:16:0;::::1;::::0;;::::1;::::0;;;18573:26:::1;::::0;;-1:-1:-1;;;18573:26:0;;;;:24:::1;::::0;:26:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;18541:16;18573:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18562:8;:37:::0;;-1:-1:-1;;;;;;18562:37:0::1;-1:-1:-1::0;;;;;18562:37:0;;::::1;;::::0;;-1:-1:-1;18621:6:0;18613:24:::1;::::0;;-1:-1:-1;;;18613:24:0;;;;18621:6;;;::::1;::::0;18613:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;18621:6;18613:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18604:6;:33:::0;;-1:-1:-1;;;;;;18604:33:0::1;-1:-1:-1::0;;;;;18604:33:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;18481:161:0:o;32353:135::-;32416:7;32466:16;17540:1;32466:2;:16;:::i;:::-;32461:22;;:2;:22;:::i;:::-;-1:-1:-1;;;;;32437:21:0;;;;;;:11;:21;;;;;;:46;;;;:::i;31553:237::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31712:50:0;31728:4;31734:9;31745:8;31755:6;31712:15;:50::i;:::-;31774:11;;;;:6;:11;;;;;;;;;31767:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31767:18:0;;;;;;;;;;;;-1:-1:-1;;;31767:18:0;;;;;;;;;;;;;-1:-1:-1;;31553:237:0;;;;;;:::o;21538:1148::-;21683:1;21676:4;:8;21668:26;;;;-1:-1:-1;;;21668:26:0;;18187:2:1;21668:26:0;;;18169:21:1;18226:1;18206:18;;;18199:29;-1:-1:-1;;;18244:18:1;;;18237:35;18289:18;;21668:26:0;17985:328:1;21668:26:0;21701:11;21715:56;21731:10;21743:9;21754:8;21764:6;21715:15;:56::i;:::-;21778:18;21799:11;;;:6;:11;;;;;;;;;21778:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21778:32:0;;;;;;;;;;;-1:-1:-1;;;21778:32:0;;;;;;;;;;;21701:70;;-1:-1:-1;21778:32:0;21823:15;21815:34;;;;-1:-1:-1;;;21815:34:0;;22685:2:1;21815:34:0;;;22667:21:1;22724:1;22704:18;;;22697:29;-1:-1:-1;;;22742:18:1;;;22735:36;22788:18;;21815:34:0;22483:329:1;21815:34:0;21895:25;21923:14;;;:9;:14;;;;;21950:15;;-1:-1:-1;;;21950:15:0;;-1:-1:-1;;;;;21950:15:0;21942:41;;;;-1:-1:-1;;;21942:41:0;;;;;;;:::i;:::-;22001:13;;-1:-1:-1;;;;;22001:13:0;21994:20;;21990:58;;;22029:13;;-1:-1:-1;;;;;22029:13:0;;-1:-1:-1;21990:58:0;22054:22;22079:19;;;:8;:19;;;;;;;;22054:44;;;;;;;;;-1:-1:-1;;;;;22054:44:0;;;;;-1:-1:-1;;;22054:44:0;;;;;;;;;;;-1:-1:-1;;;22054:44:0;;;;;;;;;;-1:-1:-1;;;22054:44:0;;;;;;;;;;;:22;22138:5;;22117:18;;:4;:18;:::i;:::-;:26;;;;:::i;:::-;22103:40;-1:-1:-1;;;;;;22154:22:0;;22150:223;;22184:17;22215:16;17540:1;22215:2;:16;:::i;:::-;22210:22;;:2;:22;:::i;:::-;22204:28;;:3;:28;:::i;:::-;22184:48;;22259:9;22246;:22;;:68;;;;-1:-1:-1;22309:5:0;22285:23;:9;22298;22285:23;:::i;:::-;:29;;;;:::i;:::-;22272:9;:42;;22246:68;22238:85;;;;-1:-1:-1;;;22238:85:0;;;;;;15649:2:1;15631:21;;;15688:1;15668:18;;;15661:29;-1:-1:-1;;;15721:2:1;15706:18;;15699:34;15765:2;15750:18;;15447:327;22238:85:0;22178:151;22150:223;;;22341:26;22353:8;22363:3;22341:11;:26::i;:::-;22438:13;;22379:14;;-1:-1:-1;;;;;22438:13:0;;;;22396:31;;-1:-1:-1;;;22411:15:0;;;;22396:4;:31;:::i;:::-;:56;;;;:::i;:::-;22473:83;;;;;;;;;22494:4;22473:83;;;-1:-1:-1;;;;;22473:83:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;22459:11:0;;;:6;:11;;;;;:97;;;;;;;;-1:-1:-1;;22459:97:0;;;;;;-1:-1:-1;;22459:97:0;;;;;;;;;;;-1:-1:-1;;22459:97:0;-1:-1:-1;;;22459:97:0;;;;;;;;;;;;;;;22568:111;;-1:-1:-1;;;;;9503:32:1;;9485:51;;9579:14;;9572:22;9552:18;;;9545:50;;;;9611:18;;;9604:34;;;9654:18;;9647:34;;;9712:3;9697:19;;9690:51;;;;22473:83:0;;-1:-1:-1;22607:9:0;;22591:10;;22459:11;;22568:111;;9472:3:1;9457:19;22568:111:0;;;;;;;21661:1025;;;;;;21538:1148;;;;:::o;28623:209::-;28772:51;;-1:-1:-1;;7950:2:1;7946:15;;;7942:24;;28772:51:0;;;7930:37:1;7983:12;;;7976:28;;;8038:15;;;8034:24;8020:12;;;8013:46;8105:14;;8098:22;8093:3;8089:32;8075:12;;;8068:54;28735:7:0;;8138:12:1;;28772:51:0;;;;;;;;;;;;28762:62;;;;;;28755:69;;28623:209;;;;;;:::o;28837:229::-;28954:6;;28946:33;;-1:-1:-1;;;28946:33:0;;-1:-1:-1;;;;;8814:32:1;;;28946:33:0;;;8796:51:1;28931:12:0;;28954:6;;28946:23;;8769:18:1;;28946:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28931:48;-1:-1:-1;;;;;;28984:30:0;;;29029:18;17540:1;29029:2;:18;:::i;:::-;29024:24;;:2;:24;:::i;:::-;29015:33;;:6;:33;:::i;:::-;28984:77;;-1:-1:-1;;;;;;28984:77:0;;;;;;;;;;23914:25:1;;;;23982:14;;23975:22;23955:18;;;23948:50;23887:18;;28984:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29414:404;29500:11;;;:31;;-1:-1:-1;;;;;;29515:16:0;;;29500:31;29496:44;;;29414:404;;;:::o;29496:44::-;29593:6;;29585:37;;-1:-1:-1;;;29585:37:0;;-1:-1:-1;;;;;8814:32:1;;;29585:37:0;;;8796:51:1;29566:16:0;;29593:6;;29585:27;;8769:18:1;;29585:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29566:56;;;-1:-1:-1;29663:17:0;17540:1;29663:2;:17;:::i;:::-;29646:12;29650:8;29646:2;:12;:::i;:::-;29636:23;;:6;:23;:::i;:::-;:45;;;;:::i;:::-;29627:54;-1:-1:-1;;;;;;29690:22:0;;29686:128;;29720:29;-1:-1:-1;;;;;29720:21:0;;29742:6;29720:21;:29::i;:::-;29686:128;;;29767:41;-1:-1:-1;;;;;29767:29:0;;29797:2;29801:6;29767:29;:41::i;:::-;29491:327;29414:404;;;:::o;29823:185::-;29905:7;29935:1;29927:5;:9;29919:28;;;;-1:-1:-1;;;29919:28:0;;21264:2:1;29919:28:0;;;21246:21:1;21303:1;21283:18;;;21276:29;-1:-1:-1;;;21321:18:1;;;21314:36;21367:18;;29919:28:0;21062:329:1;29919:28:0;29972:30;17640:1;;29972:30;:::i;:::-;29967:36;;:2;:36;:::i;:::-;29959:44;;:5;:44;:::i;30014:1147::-;30177:11;30197:18;30220:11;30242:6;30238:425;;;30269:13;30260:5;:22;30256:193;;30330:13;30305:21;30330:13;30305:5;:21;:::i;:::-;30297:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30291:52;;30238:425;;30256:193;30402:13;30377:21;30393:5;30402:13;30377:21;:::i;:::-;30369:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30363:52;;30438:4;30422:20;;30238:425;;;30478:13;30470:5;:21;30466:192;;;30539:13;30514:21;30539:13;30514:5;:21;:::i;30466:192::-;30638:13;30613:21;30629:5;30638:13;30613:21;:::i;:::-;30605:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30599:52;;30466:192;30725:22;:9;30737:10;30725:22;:::i;:::-;30706:15;:41;30702:339;;30757:17;17576;17540:1;17576:2;:17;:::i;:::-;30828:12;;30835:5;30828:12;:::i;:::-;:23;;30843:8;30828:23;:::i;:::-;30796:27;30814:9;30796:15;:27;:::i;:::-;30777:15;30784:8;30777:4;:15;:::i;:::-;:47;;;;:::i;:::-;:75;;;;:::i;:::-;30757:95;;30864:13;30860:174;;;30886:16;30893:9;30886:16;;:::i;:::-;;;30860:174;;;30925:9;30919:3;:15;30915:119;;;30949:15;30961:3;30949:9;:15;:::i;:::-;30943:21;;30987:4;30971:20;;30915:119;;;31011:16;31018:9;31011:16;;:::i;:::-;;;30915:119;30749:292;30702:339;31051:13;31047:90;;;31079:16;31091:3;-1:-1:-1;;31079:16:0;:::i;:::-;31072:23;;31047:90;;;31127:3;31113:18;;31047:90;31143:11;;30014:1147;;;;;;;;:::o;29071:338::-;29144:11;;;:37;;-1:-1:-1;;;;;;29159:22:0;;;29144:37;29140:50;;;29071:338;;:::o;29140:50::-;29243:6;;29235:37;;-1:-1:-1;;;29235:37:0;;-1:-1:-1;;;;;8814:32:1;;;29235:37:0;;;8796:51:1;29216:16:0;;29243:6;;29235:27;;8769:18:1;;29235:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29216:56;;;-1:-1:-1;29313:17:0;17540:1;29313:2;:17;:::i;:::-;29296:12;29300:8;29296:2;:12;:::i;:::-;29286:23;;:6;:23;:::i;:::-;:45;;;;:::i;:::-;29277:54;-1:-1:-1;29336:68:0;-1:-1:-1;;;;;29336:33:0;;29370:10;29390:4;29277:54;29336:33;:68::i;:::-;29135:274;29071:338;;:::o;25327:1147::-;25469:7;25478;25487:6;25502:11;25516:50;25532:4;25538:9;25549:8;25559:6;25516:15;:50::i;:::-;25602:18;25623:11;;;:6;:11;;;;;;;;25602:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25602:32:0;;;;;;;;;;;-1:-1:-1;;;25602:32:0;;;;;;;;;;;25733:14;;;:9;:14;;;;;;;25760:15;;25502:64;;-1:-1:-1;25602:32:0;;25733:14;;-1:-1:-1;;;25760:15:0;;;;25752:41;;;;-1:-1:-1;;;25752:41:0;;;;;;;:::i;:::-;25800:22;25825:19;;;:8;:19;;;;;;;;;25800:44;;;;;;;;;-1:-1:-1;;;;;25800:44:0;;;;;-1:-1:-1;;;25800:44:0;;;;;;;;;;;-1:-1:-1;;;25800:44:0;;;;;;;;;;;-1:-1:-1;;;25800:44:0;;;;;;;;25859:21;25874:5;25859:14;:21::i;:::-;25923:14;;25945:16;;;;25851:29;;-1:-1:-1;25887:10:0;;25900:82;;25908:6;;25851:29;;-1:-1:-1;;;;;;;;25923:14:0;;;;;25939:4;;25900:82;;;;-1:-1:-1;;;25963:18:0;;;;25900:7;:82::i;:::-;26081:28;;;;26054:15;;25887:95;;-1:-1:-1;26113:5:0;;26046:64;;-1:-1:-1;;;;;26073:37:0;;;;-1:-1:-1;;;26054:15:0;;;26046:64;:::i;:::-;:72;;;;:::i;:::-;26034:85;;-1:-1:-1;;26034:85:0;:::i;:::-;26027:3;:92;26023:320;;26153:15;;26133:37;;-1:-1:-1;;;26153:15:0;;-1:-1:-1;;;;;26153:15:0;-1:-1:-1;;26133:37:0;:::i;:::-;26185:15;;-1:-1:-1;;;;26232:19:0;;;;-1:-1:-1;;;;;26213:13:0;;;;-1:-1:-1;;;;26185:15:0;;;;;-1:-1:-1;26127:43:0;-1:-1:-1;26023:320:0;;;26269:33;;26295:6;;26269:33;;:15;;:33;;26295:6;;-1:-1:-1;;;26269:33:0;;-1:-1:-1;;;;;26269:33:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26269:33:0;;;;;-1:-1:-1;;;;;26269:33:0;;;;;;26332:4;26308:8;:13;;;:29;;;;;;;;;;-1:-1:-1;;;;;26308:29:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26308:29:0;;;;;-1:-1:-1;;;;;26308:29:0;;;;;;26023:320;26355:15;;-1:-1:-1;;;26355:15:0;;-1:-1:-1;;;;;26355:15:0;26351:59;;26390:14;;;;:9;:14;;;;;26383:21;26351:59;26423:11;;;;:6;:11;;;;;;26416:18;;-1:-1:-1;;;;;;26416:18:0;;;-1:-1:-1;26449:6:0;;26457:4;;-1:-1:-1;26423:11:0;;-1:-1:-1;25327:1147:0;-1:-1:-1;;;;;;;;25327:1147:0:o;4926:317::-;5041:6;5016:21;:31;;5008:73;;;;-1:-1:-1;;;5008:73:0;;17085:2:1;5008:73:0;;;17067:21:1;17124:2;17104:18;;;17097:30;17163:31;17143:18;;;17136:59;17212:18;;5008:73:0;16883:353:1;5008:73:0;5095:12;5113:9;-1:-1:-1;;;;;5113:14:0;5135:6;5113:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5094:52;;;5165:7;5157:78;;;;-1:-1:-1;;;5157:78:0;;16658:2:1;5157:78:0;;;16640:21:1;16697:2;16677:18;;;16670:30;16736:34;16716:18;;;16709:62;16807:28;16787:18;;;16780:56;16853:19;;5157:78:0;16456:422:1;11461:211:0;11605:58;;-1:-1:-1;;;;;12888:32:1;;11605:58:0;;;12870:51:1;12937:18;;;12930:34;;;11578:86:0;;11598:5;;-1:-1:-1;;;11628:23:0;12843:18:1;;11605:58:0;;;;-1:-1:-1;;11605:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;11605:58:0;-1:-1:-1;;;;;;11605:58:0;;;;;;;;;;11578:19;:86::i;11680:248::-;11851:68;;-1:-1:-1;;;;;9116:15:1;;;11851:68:0;;;9098:34:1;9168:15;;9148:18;;;9141:43;9200:18;;;9193:34;;;11824:96:0;;11844:5;;-1:-1:-1;;;11874:27:0;9033:18:1;;11851:68:0;8858:375:1;14034:716:0;14458:23;14484:69;14512:4;14484:69;;;;;;;;;;;;;;;;;14492:5;-1:-1:-1;;;;;14484:27:0;;;:69;;;;;:::i;:::-;14568:17;;14458:95;;-1:-1:-1;14568:21:0;14564:179;;14665:10;14654:30;;;;;;;;;;;;:::i;:::-;14646:85;;;;-1:-1:-1;;;14646:85:0;;21940:2:1;14646:85:0;;;21922:21:1;21979:2;21959:18;;;21952:30;22018:34;21998:18;;;21991:62;-1:-1:-1;;;22069:18:1;;;22062:40;22119:19;;14646:85:0;21738:406:1;6410:229:0;6547:12;6579:52;6601:6;6609:4;6615:1;6618:12;6579:21;:52::i;:::-;6572:59;;6410:229;;;;;;:::o;7530:510::-;7700:12;7758:5;7733:21;:30;;7725:81;;;;-1:-1:-1;;;7725:81:0;;17443:2:1;7725:81:0;;;17425:21:1;17482:2;17462:18;;;17455:30;17521:34;17501:18;;;17494:62;-1:-1:-1;;;17572:18:1;;;17565:36;17618:19;;7725:81:0;17241:402:1;7725:81:0;3927:20;;7817:60;;;;-1:-1:-1;;;7817:60:0;;20569:2:1;7817:60:0;;;20551:21:1;20608:2;20588:18;;;20581:30;20647:31;20627:18;;;20620:59;20696:18;;7817:60:0;20367:353:1;7817:60:0;7891:12;7905:23;7932:6;-1:-1:-1;;;;;7932:11:0;7951:5;7958:4;7932:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7890:73;;;;7981:51;7998:7;8007:10;8019:12;7981:16;:51::i;:::-;7974:58;7530:510;-1:-1:-1;;;;;;;7530:510:0:o;10216:712::-;10366:12;10395:7;10391:530;;;-1:-1:-1;10426:10:0;10419:17;;10391:530;10540:17;;:21;10536:374;;10738:10;10732:17;10799:15;10786:10;10782:2;10778:19;10771:44;10536:374;10881:12;10874:20;;-1:-1:-1;;;10874:20:0;;;;;;;;:::i;14:171:1:-;81:20;;-1:-1:-1;;;;;130:30:1;;120:41;;110:69;;175:1;172;165:12;110:69;14:171;;;:::o;190:247::-;249:6;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;442:251::-;512:6;565:2;553:9;544:7;540:23;536:32;533:52;;;581:1;578;571:12;533:52;613:9;607:16;632:31;657:5;632:31;:::i;698:592::-;781:6;789;797;805;858:3;846:9;837:7;833:23;829:33;826:53;;;875:1;872;865:12;826:53;914:9;901:23;933:31;958:5;933:31;:::i;:::-;983:5;-1:-1:-1;1040:2:1;1025:18;;1012:32;1053:33;1012:32;1053:33;:::i;:::-;1105:7;-1:-1:-1;1159:2:1;1144:18;;1131:32;;-1:-1:-1;1215:2:1;1200:18;;1187:32;1228:30;1187:32;1228:30;:::i;:::-;698:592;;;;-1:-1:-1;698:592:1;;-1:-1:-1;;698:592:1:o;1295:728::-;1384:6;1392;1400;1408;1416;1469:3;1457:9;1448:7;1444:23;1440:33;1437:53;;;1486:1;1483;1476:12;1437:53;1525:9;1512:23;1544:31;1569:5;1544:31;:::i;:::-;1594:5;-1:-1:-1;1646:2:1;1631:18;;1618:32;;-1:-1:-1;1702:2:1;1687:18;;1674:32;1715:33;1674:32;1715:33;:::i;:::-;1767:7;-1:-1:-1;1826:2:1;1811:18;;1798:32;1839:30;1798:32;1839:30;:::i;:::-;1888:7;-1:-1:-1;1947:3:1;1932:19;;1919:33;1961:30;1919:33;1961:30;:::i;:::-;2010:7;2000:17;;;1295:728;;;;;;;;:::o;2028:661::-;2120:6;2128;2136;2144;2152;2205:3;2193:9;2184:7;2180:23;2176:33;2173:53;;;2222:1;2219;2212:12;2173:53;2261:9;2248:23;2280:31;2305:5;2280:31;:::i;:::-;2330:5;-1:-1:-1;2382:2:1;2367:18;;2354:32;;-1:-1:-1;2438:2:1;2423:18;;2410:32;2451:33;2410:32;2451:33;:::i;:::-;2503:7;-1:-1:-1;2562:2:1;2547:18;;2534:32;2575:30;2534:32;2575:30;:::i;:::-;2028:661;;;;-1:-1:-1;2028:661:1;;2678:3;2663:19;2650:33;;2028:661;-1:-1:-1;;2028:661:1:o;2694:315::-;2762:6;2770;2823:2;2811:9;2802:7;2798:23;2794:32;2791:52;;;2839:1;2836;2829:12;2791:52;2878:9;2865:23;2897:31;2922:5;2897:31;:::i;:::-;2947:5;2999:2;2984:18;;;;2971:32;;-1:-1:-1;;;2694:315:1:o;3014:615::-;3100:6;3108;3161:2;3149:9;3140:7;3136:23;3132:32;3129:52;;;3177:1;3174;3167:12;3129:52;3217:9;3204:23;-1:-1:-1;;;;;3287:2:1;3279:6;3276:14;3273:34;;;3303:1;3300;3293:12;3273:34;3341:6;3330:9;3326:22;3316:32;;3386:7;3379:4;3375:2;3371:13;3367:27;3357:55;;3408:1;3405;3398:12;3357:55;3448:2;3435:16;3474:2;3466:6;3463:14;3460:34;;;3490:1;3487;3480:12;3460:34;3543:7;3538:2;3528:6;3525:1;3521:14;3517:2;3513:23;3509:32;3506:45;3503:65;;;3564:1;3561;3554:12;3503:65;3595:2;3587:11;;;;;3617:6;;-1:-1:-1;3014:615:1;;-1:-1:-1;;;;3014:615:1:o;3634:245::-;3701:6;3754:2;3742:9;3733:7;3729:23;3725:32;3722:52;;;3770:1;3767;3760:12;3722:52;3802:9;3796:16;3821:28;3843:5;3821:28;:::i;3884:180::-;3943:6;3996:2;3984:9;3975:7;3971:23;3967:32;3964:52;;;4012:1;4009;4002:12;3964:52;-1:-1:-1;4035:23:1;;3884:180;-1:-1:-1;3884:180:1:o;4069:450::-;4143:6;4151;4159;4212:2;4200:9;4191:7;4187:23;4183:32;4180:52;;;4228:1;4225;4218:12;4180:52;4264:9;4251:23;4241:33;;4324:2;4313:9;4309:18;4296:32;4337:31;4362:5;4337:31;:::i;:::-;4387:5;-1:-1:-1;4444:2:1;4429:18;;4416:32;4457:30;4416:32;4457:30;:::i;:::-;4506:7;4496:17;;;4069:450;;;;;:::o;4524:519::-;4607:6;4615;4623;4631;4684:3;4672:9;4663:7;4659:23;4655:33;4652:53;;;4701:1;4698;4691:12;4652:53;4737:9;4724:23;4714:33;;4797:2;4786:9;4782:18;4769:32;4810:31;4835:5;4810:31;:::i;:::-;4860:5;-1:-1:-1;4917:2:1;4902:18;;4889:32;4930:30;4889:32;4930:30;:::i;:::-;4524:519;;;;-1:-1:-1;4979:7:1;;5033:2;5018:18;5005:32;;-1:-1:-1;;4524:519:1:o;5048:588::-;5140:6;5148;5156;5164;5172;5225:3;5213:9;5204:7;5200:23;5196:33;5193:53;;;5242:1;5239;5232:12;5193:53;5278:9;5265:23;5255:33;;5338:2;5327:9;5323:18;5310:32;5351:31;5376:5;5351:31;:::i;:::-;5401:5;-1:-1:-1;5458:2:1;5443:18;;5430:32;5471:30;5430:32;5471:30;:::i;:::-;5048:588;;;;-1:-1:-1;5520:7:1;;5574:2;5559:18;;5546:32;;-1:-1:-1;5625:3:1;5610:19;5597:33;;5048:588;-1:-1:-1;;5048:588:1:o;5641:902::-;5733:6;5741;5785:9;5776:7;5772:23;5815:3;5811:2;5807:12;5804:32;;;5832:1;5829;5822:12;5804:32;5855:23;;;-1:-1:-1;5912:4:1;-1:-1:-1;;5894:16:1;;5890:27;5887:47;;;5930:1;5927;5920:12;5887:47;;5963:2;5957:9;6005:4;5997:6;5993:17;6076:6;6064:10;6061:22;-1:-1:-1;;;;;6028:10:1;6025:34;6022:62;6019:185;;;6126:10;6121:3;6117:20;6114:1;6107:31;6161:4;6158:1;6151:15;6189:4;6186:1;6179:15;6019:185;6220:2;6213:22;6259:37;6292:2;6277:18;;6259:37;:::i;:::-;6251:6;6244:53;6330:37;6363:2;6352:9;6348:18;6330:37;:::i;:::-;6325:2;6317:6;6313:15;6306:62;6401:37;6434:2;6423:9;6419:18;6401:37;:::i;:::-;6396:2;6388:6;6384:15;6377:62;6472:39;6505:4;6494:9;6490:20;6472:39;:::i;:::-;6467:2;6459:6;6455:15;6448:64;6531:6;6521:16;;;5641:902;;;;;:::o;6548:184::-;6618:6;6671:2;6659:9;6650:7;6646:23;6642:32;6639:52;;;6687:1;6684;6677:12;6639:52;-1:-1:-1;6710:16:1;;6548:184;-1:-1:-1;6548:184:1:o;6737:273::-;6805:6;6858:2;6846:9;6837:7;6833:23;6829:32;6826:52;;;6874:1;6871;6864:12;6826:52;6906:9;6900:16;6956:4;6949:5;6945:16;6938:5;6935:27;6925:55;;6976:1;6973;6966:12;8161:274;8290:3;8328:6;8322:13;8344:53;8390:6;8385:3;8378:4;8370:6;8366:17;8344:53;:::i;:::-;8413:16;;;;;8161:274;-1:-1:-1;;8161:274:1:o;12975:695::-;13190:2;13242:21;;;13312:13;;13215:18;;;13334:22;;;13161:4;;13190:2;13413:15;;;;13387:2;13372:18;;;13161:4;13456:188;13470:6;13467:1;13464:13;13456:188;;;13519:43;13558:3;13549:6;13543:13;7100:12;;7093:20;7086:28;7074:41;;7161:4;7150:16;;;7144:23;-1:-1:-1;;;;;7236:21:1;;;7220:14;;;7213:45;;;;7311:4;7300:16;;;7294:23;7290:32;7274:14;;7267:56;7015:314;13519:43;13619:15;;;;13591:4;13582:14;;;;;13492:1;13485:9;13456:188;;;-1:-1:-1;13661:3:1;;12975:695;-1:-1:-1;;;;;;12975:695:1:o;13675:704::-;13896:2;13948:21;;;14018:13;;13921:18;;;14040:22;;;13867:4;;13896:2;14119:15;;;;14093:2;14078:18;;;13867:4;14162:191;14176:6;14173:1;14170:13;14162:191;;;14225:46;14267:3;14258:6;14252:13;7449:12;;-1:-1:-1;;;;;7445:21:1;;;7433:34;;7520:4;7509:16;;;7503:23;7499:32;;7483:14;;;7476:56;7585:4;7574:16;;;7568:23;7564:32;;7548:14;;;7541:56;7650:4;7639:16;;;7633:23;7629:32;7613:14;;7606:56;7334:334;14225:46;14328:15;;;;14300:4;14291:14;;;;;14198:1;14191:9;14162:191;;14384:383;14533:2;14522:9;14515:21;14496:4;14565:6;14559:13;14608:6;14603:2;14592:9;14588:18;14581:34;14624:66;14683:6;14678:2;14667:9;14663:18;14658:2;14650:6;14646:15;14624:66;:::i;:::-;14751:2;14730:15;-1:-1:-1;;14726:29:1;14711:45;;;;14758:2;14707:54;;14384:383;-1:-1:-1;;14384:383:1:o;20725:332::-;20927:2;20909:21;;;20966:1;20946:18;;;20939:29;-1:-1:-1;;;20999:2:1;20984:18;;20977:39;21048:2;21033:18;;20725:332::o;22149:329::-;22351:2;22333:21;;;22390:1;22370:18;;;22363:29;-1:-1:-1;;;22423:2:1;22408:18;;22401:36;22469:2;22454:18;;22149:329::o;22817:238::-;22995:2;22980:18;;23007:42;22984:9;23031:6;7100:12;;7093:20;7086:28;7074:41;;7161:4;7150:16;;;7144:23;-1:-1:-1;;;;;7236:21:1;;;7220:14;;;7213:45;;;;7311:4;7300:16;;;7294:23;7290:32;7274:14;;7267:56;7015:314;23060:248;23244:3;23229:19;;23257:45;23233:9;23284:6;7449:12;;-1:-1:-1;;;;;7445:21:1;;;7433:34;;7520:4;7509:16;;;7503:23;7499:32;;7483:14;;;7476:56;7585:4;7574:16;;;7568:23;7564:32;;7548:14;;;7541:56;7650:4;7639:16;;;7633:23;7629:32;7613:14;;7606:56;7334:334;24009:128;24049:3;24080:1;24076:6;24073:1;24070:13;24067:39;;;24086:18;;:::i;:::-;-1:-1:-1;24122:9:1;;24009:128::o;24142:236::-;24181:3;-1:-1:-1;;;;;24254:2:1;24251:1;24247:10;24284:2;24281:1;24277:10;24315:3;24311:2;24307:12;24302:3;24299:21;24296:47;;;24323:18;;:::i;:::-;24359:13;;24142:236;-1:-1:-1;;;;24142:236:1:o;24383:120::-;24423:1;24449;24439:35;;24454:18;;:::i;:::-;-1:-1:-1;24488:9:1;;24383:120::o;24508:199::-;24547:1;-1:-1:-1;;;;;24618:2:1;24615:1;24611:10;24640:3;24630:37;;24647:18;;:::i;:::-;24685:10;;24681:20;;;;;24508:199;-1:-1:-1;;24508:199:1:o;24712:422::-;24801:1;24844:5;24801:1;24858:270;24879:7;24869:8;24866:21;24858:270;;;24938:4;24934:1;24930:6;24926:17;24920:4;24917:27;24914:53;;;24947:18;;:::i;:::-;24997:7;24987:8;24983:22;24980:55;;;25017:16;;;;24980:55;25096:22;;;;25056:15;;;;24858:270;;;24862:3;24712:422;;;;;:::o;25139:131::-;25199:5;25228:36;25255:8;25249:4;25324:5;25354:8;25344:80;;-1:-1:-1;25395:1:1;25409:5;;25344:80;25443:4;25433:76;;-1:-1:-1;25480:1:1;25494:5;;25433:76;25525:4;25543:1;25538:59;;;;25611:1;25606:130;;;;25518:218;;25538:59;25568:1;25559:10;;25582:5;;;25606:130;25643:3;25633:8;25630:17;25627:43;;;25650:18;;:::i;:::-;-1:-1:-1;;25706:1:1;25692:16;;25721:5;;25518:218;;25820:2;25810:8;25807:16;25801:3;25795:4;25792:13;25788:36;25782:2;25772:8;25769:16;25764:2;25758:4;25755:12;25751:35;25748:77;25745:159;;;-1:-1:-1;25857:19:1;;;25889:5;;25745:159;25936:34;25961:8;25955:4;25936:34;:::i;:::-;26006:6;26002:1;25998:6;25994:19;25985:7;25982:32;25979:58;;;26017:18;;:::i;:::-;26055:20;;25275:806;-1:-1:-1;;;25275:806:1:o;26086:553::-;26125:7;-1:-1:-1;;;;;26195:9:1;;;26223;;;26248:11;;;26267:10;;;26261:17;;26244:35;26241:61;;;26282:18;;:::i;:::-;-1:-1:-1;;;26358:1:1;26351:9;;26376:11;;;26396;;;26389:19;;26372:37;26369:63;;;26412:18;;:::i;:::-;26458:1;26455;26451:9;26441:19;;26505:1;26501:2;26496:11;26493:1;26489:19;26484:2;26480;26476:11;26472:37;26469:63;;;26512:18;;:::i;:::-;26577:1;26573:2;26568:11;26565:1;26561:19;26556:2;26552;26548:11;26544:37;26541:63;;;26584:18;;:::i;:::-;-1:-1:-1;;;26624:9:1;;;;;26086:553;-1:-1:-1;;;26086:553:1:o;26644:168::-;26684:7;26750:1;26746;26742:6;26738:14;26735:1;26732:21;26727:1;26720:9;26713:17;26709:45;26706:71;;;26757:18;;:::i;:::-;-1:-1:-1;26797:9:1;;26644:168::o;26817:270::-;26856:7;-1:-1:-1;;;;;26933:2:1;26930:1;26926:10;26963:2;26960:1;26956:10;27019:3;27015:2;27011:12;27006:3;27003:21;26996:3;26989:11;26982:19;26978:47;26975:73;;;27028:18;;:::i;:::-;27068:13;;26817:270;-1:-1:-1;;;;26817:270:1:o;27092:125::-;27132:4;27160:1;27157;27154:8;27151:34;;;27165:18;;:::i;:::-;-1:-1:-1;27202:9:1;;27092:125::o;27222:229::-;27261:4;-1:-1:-1;;;;;27358:10:1;;;;27328;;27380:12;;;27377:38;;;27395:18;;:::i;:::-;27432:13;;27222:229;-1:-1:-1;;;27222:229:1:o;27456:258::-;27528:1;27538:113;27552:6;27549:1;27546:13;27538:113;;;27628:11;;;27622:18;27609:11;;;27602:39;27574:2;27567:10;27538:113;;;27669:6;27666:1;27663:13;27660:48;;;-1:-1:-1;;27704:1:1;27686:16;;27679:27;27456:258::o;27719:135::-;27758:3;-1:-1:-1;;27779:17:1;;27776:43;;;27799:18;;:::i;:::-;-1:-1:-1;27846:1:1;27835:13;;27719:135::o;27859:127::-;27920:10;27915:3;27911:20;27908:1;27901:31;27951:4;27948:1;27941:15;27975:4;27972:1;27965:15;27991:127;28052:10;28047:3;28043:20;28040:1;28033:31;28083:4;28080:1;28073:15;28107:4;28104:1;28097:15;28123:127;28184:10;28179:3;28175:20;28172:1;28165:31;28215:4;28212:1;28205:15;28239:4;28236:1;28229:15;28255:127;28316:10;28311:3;28307:20;28304:1;28297:31;28347:4;28344:1;28337:15;28371:4;28368:1;28361:15;28387:131;-1:-1:-1;;;;;28462:31:1;;28452:42;;28442:70;;28508:1;28505;28498:12;28442:70;28387:131;:::o;28523:118::-;28609:5;28602:13;28595:21;28588:5;28585:32;28575:60;;28631:1;28628;28621:12

Swarm Source

ipfs://19d643651a9363dac49412490c2ce1d0edb1c967ace343759b2766e43c7ee507
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.